Jak zapewne wiesz, liczba Fibonacciego jest liczbą będącą sumą dwóch poprzednich liczb w szeregu.
Fibonacci Digit ™ to taki, który jest sumą dwóch poprzednich cyfr .
Na przykład, dla początku serii 1,1
, seria będzie następować 1,1,2,3,5,8,13,4,7,11,2...
. Zmiana następuje po tym 13
, gdzie zamiast dodawać 8+13
dodajesz 1+3
. Seria zapętla się na końcu, gdzie 4+7=11
i 1+1=2
tak samo jak seria się zaczyna.
Dla innego przykładu, seria zaczynając 2,2
: 2,2,4,6,10,1,1,2,3,5,8,13,4,7,11,2,3...
. Ten zaczyna się wyjątkowo, ale gdy suma cyfr się 10
skończy, skończysz 1+0=1, 0+1=1
, a seria będzie kontynuowana - i zapętla się - w taki sam sposób jak 1,1
seria.
Wyzwanie
Biorąc pod uwagę liczbę całkowitą 0≤n≤99
, obliczyć pętlę w szeregu cyfr Fibonacciego zaczynając od tych dwóch cyfr. (Ty z pewnością pozwoliło rozważyć całkowite z tego zakresu, ale nie jest to wymagane). Jeśli dana wejście jedno-cyfrowy kod należy interpretować je oznaczają początek serii 0,n
.
Wszystkie liczby w pętli, które są dwucyfrowe, muszą być wyprowadzone jako dwie cyfry. Na przykład pętla for 1,1
zawierałaby 13
, a nie 1,3
.
Wyjście zaczyna się od pierwszej liczby w pętli. Opierając się na powyższych ograniczeniach, pętla dla 1,1
zaczyna się 2
od, ponieważ 1,1
i 11
są liczone osobno.
Każda liczba danych wyjściowych może być oddzielona przez cokolwiek chcesz, o ile jest spójna. We wszystkich moich przykładach używam przecinków, ale spacje, podziały wierszy, losowe litery itp. Są dozwolone, o ile zawsze używasz tej samej separacji. Tak więc 2g3g5g8g13g4g7g11
jest to legalne wyjście 1
, ale 2j3g5i8s13m4g7sk11
nie jest. Możesz używać ciągów, list, tablic, cokolwiek, pod warunkiem, że masz prawidłowe liczby we właściwej kolejności oddzielone spójnym separatorem. Dopuszcza się braketing całego wyjścia (np. (5,9,14)
Lub [5,9,14]
itp.).
Przypadki testowe:
1 -> 2,3,5,8,13,4,7,11
2 -> 2,3,5,8,13,4,7,11
3 -> 11,2,3,5,8,13,4,7
4 -> 3,5,8,13,4,7,11,2
5 -> 2,3,5,8,13,4,7,11
6 -> 3,5,8,13,4,7,11,2
7 -> 14,5,9
8 -> 13,4,7,11,2,3,5,8
9 -> 11,2,3,5,8,13,4,7
0 -> 0
14 -> 5,9,14
59 -> 5,9,14
To jest golf golfowy , więc wygrywa najmniejsza liczba bajtów.
14
and59
give the same result. If59
is interpreted as starting5,9
and allowing that as part of the loop then surely14
should be the start of its loop?0,1,1,2,3,5,8,13,4,7,11,2,3
. The first time that the loop repeats is at the second2
.1,4,5,9,14,5
and5,9,14,5,9
. Both of them repeat beginning with the second5
. As I said earlier, only the input is split up; later numbers keep their digits together in the sequence.Odpowiedzi:
Jelly, 15 bytes
Try it online!
How it works
źródło
Perl 6,
96 7875 bytes-3 bytes thanks to nwellnhof
Try it online!
0 returns 0, and other number return a Match object which stringifies to the numbers separated by a space with a leading a trailing space.
Explanation:
źródło
JavaScript (ES6),
111 104103 bytesTry it online!
Commented
źródło
Python 3,
1871761581391381291211201129695120116 bytesTry it online!
Edit: As noted by @Jules, shorter solution applies to Python 3.6+.No longer distinct solutions for Python 3 / 3.6+Edit: Indexing of
z
was too verbose. Without that now there is no gain in usingeval
.Edit: Simplified finding if last two elements already appeared in the sequence.
Edit: Changed output format from list to tuple + replaced
lambda
withdef
Edit: Back to
lambda
but embeddedt
intof
.Edit: Input
n
can be actually interpreted as head of growing collectionz
which would represent tail in recursive approach. Also beats @Arbo's solution again.Edit: Actually you can unpack two items from head which cuts another 16 bytes.
Edit: Actually 17 bytes.
Edit: As noted by @Arbo solution was giving answers for
14
and59
cases as they were in initial test cases which were proven later to be wrong. For now this isn't so short but at least it works correctly.Quite an abuse of
f-strings
andeval
. Original ungolfed code although I suspect it could be done somehow easier:źródło
59
yields(14, 5, 9)
C (gcc),
114112109 bytesTry it online!
-3 from ceilingcat
Includes a trailing space.
źródło
do...while
doesn't need the braces if it's a single statement O_oPerl 5,
9076 bytesTIO
źródło
Java (JDK), 194 bytes
Try it online!
Hardcoded seemed the shortest given that Python already had an answer of 187...
źródło
Haskell, 100 bytes
Try it online!
źródło
Python 2,
123114113 bytesTry it online!
The program builds up a tuple
p
of all 2-value pairs that have occurred in the sequence, which is initialised with junk to save some bytes. The sequence itself gets built in the tuplel
, and the last two elements of this tuple are stored inb
for easy (and short) reference. As soon as a repeat is found, we can look up the index ofb
inp
to know where the loop began.EDIT: Cleaned this up a bit, and shaved off one more byte... My method does seem to be nearing its byte count limit, and I really should stop working on this.
źródło
Charcoal, 46 bytes
Try it online! Link is to verbose version of code. Explanation:
Input the number, pad it to 2 characters, then take the digital sum of each character, and save the resulting list.
Repeat while the list of loops is empty.
Calculate the sum of the two previous digits and add it to the Fibonacci list.
Take all the nontrivial suffixes of the list.
Filter out those that don't repeat and save the result in the list of loops.
Cast the list of loops to string and print.
źródło
Red,
189178164137 bytesTry it online!
źródło
Python 2,
149139 bytesTry it online!
Expects a non-negative integer as input. Smaller bytecount, but likely will no longer work for integers >99.
Explanation:
źródło