Sekwencja Kuzniecowa
(I made the name up, don't bother with Wikipedia or Google)
Dając dowolną liczbę n > 0
, niech r
reprezentuje odwrotność liczby n
. Iteruj, aż wynik końcowy wyniesie zero, przekazując wynik każdej iteracji z powrotem do funkcji za pomocą rekurencji lub wybranej metodologii, wykonując poniższą operację:
- Gdyby
r > n
dla tej iteracji wynik jest następującyr % n
. - Gdyby
n > r
dla tej iteracji wynik jest następującyn % r
. - Jeśli
n % r = 0
lubr % n = 0
, zakończysz iterację.
Weź pośredni wynik każdego wykonania i zapisz je w tablicy, aby uzyskać ostateczną odpowiedź. Numer początkowyn
nie jest częścią sekwencji, ani nie jest 0
; przykłady powinny uczynić wszystko nieco bardziej oczywistym.
Przejdźmy przez przykład gdzie n=32452345
.
54325423 % 32452345 = 21873078 # r > n, uses r % n
87037812 % 21873078 = 21418578 # r > n, uses r % n
87581412 % 21418578 = 1907100 # r > n, uses r % n
1907100 % 17091 = 9999 # n > r, uses n % r
9999 % 9999 = 0 # r % n = n % r = 0, terminated
Result: [21873078, 21418578, 1907100, 9999]
Kolejny przykład n=12345678
:
87654321 % 12345678 = 1234575 # r > n, uses r % n
5754321 % 1234575 = 816021 # r > n, uses r % n
816021 % 120618 = 92313 # n > r, uses n % r
92313 % 31329 = 29655 # n > r, uses n % r
55692 % 29655 = 26037 # r > n, uses r % n
73062 % 26037 = 20988 # r > n, uses r % n
88902 % 20988 = 4950 # r > n, uses r % n
4950 % 594 = 198 # n > r, uses n % r
891 % 198 = 99 # r > n, uses r % n
99 % 99 = 0 # r % n = n % r = 0, terminated
Result: [1234575, 816021, 92313, 29655, 26037, 20988, 4950, 198, 99]
Ostatni przykład n=11000
:
11000 % 11 = 0 # n % r = 0, terminated
Result: []
Jest to wygrana z najmniejszą liczbą bajtów w kodzie golfowym .
Odpowiedzi:
05AB1E , 11 bajtów
Wykorzystuje kodowanie CP-1252 . Wypróbuj online!
źródło
PowerShell v2 +, 89 bajtów
Iteracyjne rozwiązanie. Długie, ponieważ nie ma łatwego sposobu na odwrócenie tablicy, więc skreślamy ją i indeksujemy do tyłu, aby ją zapisać
$r
. Następnie pseudo-trójka, aby wyciągnąć odpowiednie modulo i ponownie zapisać w$n
kolejnej rundzie. Jeśli jednak wynik wynosi zero, oznacza to, że tak!($n...)
będzie$true
, więc myexit
zamiast tego$n
. Liczby są pozostawione w potoku i (domyślnie) zwrócone jako tablica, ale bez potoku enkapsulacji lub zapisania wyników w zmiennej, domyślnieWrite-Output
wstawia nowy wiersz pomiędzy.Wypróbuj online! (Tak, śmiertelnie poważny.)
PowerShell jest teraz w TIO! Muszę dać mu sekundę lub dwie, ponieważ PowerShell jest bestia na starcie, ale teraz ty, tak ty , może zweryfikować kodu PowerShell prawo w swojej przeglądarce!
źródło
Perl,
4338 + 1 = 39 bajtówUruchom z
-n
flagąWypróbuj online! Obejmuje dwa niepuste przykłady.
Tabela objaśnień
-n
: Zawija cały programwhile(<>){ ... ;}
. Włącza powyższy kod w poniższym wierszu:while(<>){say while$_=($;=reverse)>$_?$;%$_:$_%$;}
. Zauważ, że średnik został dodany do końcowego$
, więc teraz staje się instancją zmiennej$;
. W staniewhile
pętli<>
automatycznie odczytuje jeden wiersz danych wejściowych i zapisuje go w$_
zmiennej. Spójrzmy teraz na to, co interpreter czyta w zewnętrznejwhile
pętli:Oryginalny kod, zapisany dla potomności: 43 + 1 = 44 bajty
źródło
$%>$_?$%%$_:$_%$%
Czy$%
specjalnie dla tej linii wybrałeś zmienną?Pyth
1312 bajtówDzięki @TheBikingViking.
Wypróbuj online: Demonstracja
Mój stary kod:
Wypróbuj online: Demonstracja
Wyjaśnienie:
źródło
t.u|%F_S,s_<backtick>
. TestGalaretka ,
15 1413 bajtówTryItOnline
W jaki sposób?
źródło
Galaretka ,
1312 bajtówJest to monadyczny link / funkcja, która drukuje do STDOUT.
Wypróbuj online!
Jak to działa
źródło
Python 2,
9287817361 bajtówRozwiązanie rekurencyjne:
Wypróbuj online
Rozwiązanie iteracyjne: (także 61 bajtów )
Wypróbuj online
źródło
while n:
. W przeciwnym razie możesz to zrobić z 61 bajtami .MATL , 16 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
PHP, 78 bajtów
źródło
Partia, 140 bajtów
Pobiera dane wejściowe na STDIN i wysyła sekwencję w osobnych wierszach. Wsad ma instrukcje warunkowe (które są nieco gadatliwe), ale nie ma wyrażeń warunkowych, więc łatwiej jest (pomimo konieczności cytowania
%
s) obliczyćr%n%r
(co jest równer%n
ifn<r
lub zero jeślin>r
) in%r%n
(który jest równyn%r
ifn>r
lub zero jeślin<r
) i dodać oni razem.źródło
Mathematica, 68 bajtów
Dzięki Gregowi Martinowi za sugestię, żebym użył
FixedPointList
zamiastNestWhileList
:Najkrótsze, z jakim mogłem uzyskać oryginalne rozwiązanie,
FixedPointList
to 73 bajty:źródło
11000
). Możesz obejść ten problem, przechodząc do techniki opisanej w ostatnim akapicie. Ale nie widzę, jak się go pozbyćRest
aniMost
w ten sposób. Z drugiej strony,FixedPointList[ Mod[(r = IntegerReverse@#)~Max~#, r~Min~#] &, #][[2 ;; -4]] &
jest tylko 68 bajtów po usunięciu spacji (generuje kilka błędów, nbd).{a,b,c,d}[[2;;-4]]
dadzą błąd, a nie pustą listę (prawdopodobnie użyłem przecinka, a nie;;
). Nauczyłem się czegoś.Sort
:FixedPointList[-Mod@@Sort@-{#,IntegerReverse@#}&,#][[2;;-4]]&
JavaScript,
7270 bajtówEdytowane:
-2 bajty : operator rozprzestrzeniania czeka na konkatenację łańcucha.
źródło
R,
126117 bajtówNiestety odwrócenie liczby (
as.double(paste(rev(el(strsplit(c(x,""),""))),collapse="")))
) jest dość trudne. Odpoczynek jest dość łatwy. Używasort
do pośredniego sprawdzania, która jest wyższa.Reszta jest prosta, ciągle się zapętla
x=0
i drukuje wszystkie kroki.źródło
C, 87 bajtów
t
jest tymczasowe dla cofania. Wewnętrzna pętla przesuwar
1 cyfrę w lewo i dodaje ostatnią cyfręt
aż do wyczerpania. Wyjście następuje po pierwszej iteracji i tylko wtedy, gdy jest niezerowe, aby zapobiec wyświetleniu pierwszego i ostatniego elementu.Niegolfowane i użytkowanie:
źródło
Mathematica, 64 bajty
Powyższy kod reprezentuje czystą funkcję, która pobiera pojedyncze dane wejściowe i zwraca sekwencję kuzniecowa. Naprawdę piękne w matematyce jest to, że możesz nakładać warstwę na warstwę czystych funkcji ... Pozwól mi wyjaśnić kod;)
Każdy termin w samej sekwencji jest obliczany za pomocą poniższej funkcji, która pobiera jedno dane wejściowe i zwraca następny.
Kod
IntegerReverse@#
po prostu generuje r, wartość odwróconą. Kod#2~If[#<=#2,Mod,#0]~#&
jest funkcją, która pobiera dwa dane wejściowe i albo wykonuje operację mod, albo odwraca dane wejściowe i wywołuje się ponownie. Innym sposobem pisania jestIf[#<=#2, Mod, #0][#2, #]&
lub można go napisać jako zwykłą funkcję:k[a_, b_] := If[a <= b, Mod, k][b, a]
źródło
Rakieta 180 bajtów
Nie golfowany:
Testowanie:
Ouput:
źródło