Minigolf w poniedziałek: seria krótkich pytań do golfa , opublikowanych (mam nadzieję!) W każdy poniedziałek.
(Przepraszam, że się spóźniłem; praktycznie nie było mnie z komputerem wczoraj i dziś.)
My, programiści (szczególnie golfiści kodu), z pewnością uwielbiamy dowolne sekwencje liczb całkowitych. Mamy nawet całą witrynę poświęconą tym sekwencjom, która ma obecnie około 200 000 wpisów. W tym wyzwaniu będziemy wdrażać kolejny zestaw tych sekwencji.
Wyzwanie
Wyzwanie polega na napisaniu programu lub funkcji, która przyjmuje liczbę całkowitą N i generuje sekwencję liczb całkowitych podstawowych 10, w której każda następna liczba całkowita jest określana w następujący sposób:
- Zacznij od 1.
Dla każdej cyfry D w reprezentacji 10 poprzedniej liczby całkowitej:
- Jeśli D wynosi 0, dodaj jedną do bieżącej liczby całkowitej.
- W przeciwnym razie, należy pomnożyć liczbę całkowitą przez obecną D .
Detale
- Możesz założyć, że 0 < N <2 31 .
- Musisz wypisać każdą liczbę całkowitą w sekwencji, zaczynając od liczby wejściowej, aż do osiągnięcia liczby mniejszej niż 10.
- Dane wyjściowe może być tablicą lub łańcuchem oddzielonym spacjami, przecinkami, znakami nowej linii lub ich kombinacją.
- Końcowe spacje i / lub znaki nowej linii są dozwolone, ale nie przecinki końcowe.
- Nigdy nie powinno być żadnych zer wiodących.
Przykłady
Przykład 1: 77
Ten przykład jest dość prosty:
77 = 1*7*7 = 49
49 = 1*4*9 = 36
36 = 1*3*6 = 18
18 = 1*1*8 = 8
Tak więc właściwym wyjściem jest 77 49 36 18 8
.
Przykład 2: 90
Mamy tutaj:
90 = 1*9+1 = 10
10 = 1*1+1 = 2
Więc wynik byłby 90 10 2
.
Przykład 3: 806
Przeczytaj równania od lewej do prawej:
806 = 1*8+1*6 = 54 (((1*8)+1)*6)
54 = 1*5*4 = 20
20 = 1*2+1 = 3
Wyjście powinno być 806 54 20 3
.
Przypadki testowe
Pierwsza liczba w każdym wierszu to dane wejściowe, a pełna linia to oczekiwany wynik.
77 49 36 18 8
90 10 2
249 72 14 4
806 54 20 3
1337 63 18 8
9999 6561 180 9
10000 5
8675309 45369 3240 25 10 2
9999999 4782969 217728 1568 240 9
1234567890 362881 2304 28 16 6
Jako odniesienie, oto odpowiednie następne liczby całkowite od 10 do 100:
Current | Next
--------+-----
10 | 2
11 | 1
12 | 2
13 | 3
14 | 4
15 | 5
16 | 6
17 | 7
18 | 8
19 | 9
20 | 3
21 | 2
22 | 4
23 | 6
24 | 8
25 | 10
26 | 12
27 | 14
28 | 16
29 | 18
30 | 4
31 | 3
32 | 6
33 | 9
34 | 12
35 | 15
36 | 18
37 | 21
38 | 24
39 | 27
40 | 5
41 | 4
42 | 8
43 | 12
44 | 16
45 | 20
46 | 24
47 | 28
48 | 32
49 | 36
50 | 6
51 | 5
52 | 10
53 | 15
54 | 20
55 | 25
56 | 30
57 | 35
58 | 40
59 | 45
60 | 7
61 | 6
62 | 12
63 | 18
64 | 24
65 | 30
66 | 36
67 | 42
68 | 48
69 | 54
70 | 8
71 | 7
72 | 14
73 | 21
74 | 28
75 | 35
76 | 42
77 | 49
78 | 56
79 | 63
80 | 9
81 | 8
82 | 16
83 | 24
84 | 32
85 | 40
86 | 48
87 | 56
88 | 64
89 | 72
90 | 10
91 | 9
92 | 18
93 | 27
94 | 36
95 | 45
96 | 54
97 | 63
98 | 72
99 | 81
100 | 3
Listę tę można rozszerzyć do 10000 tutaj .
Punktacja
To jest golf golfowy , więc wygrywa najkrótszy prawidłowy kod w bajtach. Tiebreaker przechodzi do przesyłania, które jako pierwsze osiągnęło końcową liczbę bajtów. Zwycięzca zostanie wybrany w poniedziałek, 19 października. Powodzenia!
Edycja: Gratulacje dla twojego zwycięzcy, @isaacg , używając Pyth jeszcze raz dla 14 bajtów !
|*GHhG
oszczędza bajt?H*GHhG
.PowerShell,
9291908887 bajtówźródło
(...)
do automatycznego wykorzystania wyjścia ... Będę musiał pamiętać o tym w przyszłości.Pip ,
282523 bajtówPobiera liczbę jako argument wiersza polecenia i wyświetla sekwencję w kolejnych wierszach.
Wyjaśnienie:
Teraz cieszę się, że
P
kilka wersji temu zmieniłem z instrukcji na operatora.Pa
jest wyrażeniem, które oceniaa
wartość, ale również ją wyprowadza, dzięki czemu mogę drukowaća
i jednocześnie testować, czy używa mniej niż dziesięćt>Pa
.źródło
CJam,
26252422 bajtówlub
Wypróbuj online.
Jak to działa
Oba programy zasadniczo robią to samo; pierwsze to podejście rekurencyjne, drugie iteracyjne. Wytłumaczę pierwsze, które uważam za bardziej interesujące.
źródło
Minkolang 0,7 ,
5246 bajtówWoohoo zagnieżdżone pętle!
Wyjaśnienie
źródło
Mathematica, 66 bajtów
źródło
Python 3, 74,
76bajtówTutaj była już odpowiedź Pythona z redukcją, więc chciałem zrobić ją bez niej. Powinien zostać wywołany z int.
źródło
Python,
8580 bajtówTo teraz poprawnie drukuje całą listę, a nie tylko pierwszą wartość.
źródło
g=
. Pomijając .K5 , 24 bajty
Zebranie listy elementów podczas iteracji do stałego punktu jest dokładnie tym, co
\
robi operator skanowania . Przy każdej iteracji najpierw rzucam liczbę na ciąg, a następnie oceniam każdy znak (.:'$:
), rozbijając liczbę na cyfry. Następnie wykonuję redukcję (/
) zaczynając od 1 i używając lambda{(x*y;x+1)@~y}
. W tym przypadkux
jest wartością redukującą iy
jest każdym kolejnym terminem sekwencji.W akcji:
źródło
Julia,
938988868377 bajtówTworzy to funkcję rekurencyjną,
f
która drukuje elementy sekwencji na osobnych liniach.Nie golfowany:
Wypróbuj online
Zaoszczędź 6 bajtów dzięki Dennisowi!
źródło
n>9
zgodne z drugim przykładem. Ponadto,f(n)=(println(n);if(d=n>9)for i=reverse(digits(n)) i<1?d+=1:d*=i end;f(d)end)
jest nieco krótszy.Rubinowy
83, 72 bajtyOryginał zadeklarowany jako funkcja:
Próbowałem użyć,
Enumerator.new
ale używa tak wielu bajtów :-(Ulepszono za pomocą rekurencji:
źródło
C # i LINQ,
165146 bajtówj (dla jarvis) to funkcja rekurencyjna. r jest listą liczb całkowitych wyniku.
testowane w LINQPAD:
źródło
int n = 1
Mogą byćint n=1
itp.Haskell, 71 bajtów
Zastosowanie:
g 8675309
->[8675309,45369,3240,25,10,2]
.źródło
Matlab, 108
źródło
Java 8, 148 bajtów
sformatowany
źródło
Galaretka , 9 bajtów
Wypróbuj online!
źródło