Quine to program, który wysyła swoje źródło po uruchomieniu.
W tym wyzwaniu powinieneś zrobić Fibonacciego, wariant tego quina.
Co to jest Fibonacci-quine?
Fibonacci-quine to program, który generuje modyfikację źródła według następującej reguły:
Pierwotnym źródłem powinno być ...2...
. Innymi słowy, źródło powinno zawierać 2
. (Dlaczego 2? Gdyby to był 1, nikt nie wiedziałby, czy to byłby pierwszy 1 czy drugi, nawet sam program)
Po uruchomieniu powinieneś wypisać źródło, ale tylko konkretna liczba (Na tym etapie 2
) zmieniła się na następną liczbę sekwencji fibonacciego. Na przykład ...3...
. To samo dotyczy wyjścia, wyjścia, itp. Możesz obsługiwać liczby całkowite do 2 ^ 32-1. Dla liczb całkowitych przekraczających ten limit, następne wyjście jest do wyboru.
Notatka OP
Naprawdę chciałbym zobaczyć kreatywne rozwiązanie tego problemu. Nie mogłem wymyślić jednego rozwiązania tego problemu, ponieważ oba ważne aspekty wyzwania, Fibonacci i Quine, nie są łatwe. Będę wtedy czekać!
Odpowiedzi:
Mathematica, 61 bajtów
Zauważ, że jest spacja. Jest to quine funkcji, tzn. Powyższy kod przekształca się w funkcję nienazwaną, która, jeśli zostanie wywołana, zwraca sam kod jako ciąg znaków (ze
2
zmianą na następny numer Fibonacciego).To było zaskakująco trudne, aby dostać się do pracy. Podstawową ideą jest przejęcie samej funkcji (z
#0
) i zastąpienie liczby w tej funkcji inną za pomocą/. v:2 :> nextFib[v]
. JednaknextFib
na tym etapie nie zostaniemy poddani ocenie, więc tak naprawdę nie otrzymalibyśmy nowego numeru w kodzie źródłowym. Po chwili zastanowienia, aby wymusić natychmiastową ocenę, znalazłem ten świetny post na Mathematica.SE . Technika „standardowa” wykorzystujeWith
blok, który wymusza ocenę, ale druga odpowiedź WReach zawiera krótszą alternatywę z wykorzystaniem nieudokumentowanej wbudowanej,RuleCondition
która także wymusza ocenę.Sposób, w jaki obliczamy następną liczbę Fibonacciego, polega na tym, że stosunek kolejnych liczb jest w przybliżeniu złotym współczynnikiem 1,618 ... i jest to dokładne do zaokrąglenia. Nie musimy więc śledzić dwóch ostatnich liczb i możemy to po prostu zrobić
Round[GoldenRatio v]
. To nigdy nie straci precyzji, ponieważ MathematicaGoldenRation
jest wartością symboliczną i dlategoRound
zawsze może obliczyć dokładny wynik.W podsumowaniu:
Funkcja bez nazwy, gdzie
#0
odnosi się do samego obiektu funkcji.Znajdź
2
w drzewie wyrażeń funkcji (to2
oczywiście pasuje tylko do siebie), wywołaj jąv
i zamień na ...... kolejny numer Fibonacciego.
I przekonwertuj powstałe drzewo wyrażeń na jego reprezentację ciągu.
źródło
CJam , 26 bajtów
Wypróbuj online!
Prawdopodobnie nie do końca optymalny. Po prostu iterujemy sekwencję Fibonacciego, aż wartość będzie większa od ostatniej, i wykorzystamy wynik jako nową wartość na początku programu.
źródło
Python 3 , 95 bajtów
Wypróbuj online!
Oczywiście rozwidlenie odpowiedzi CJama Martina Endera .
źródło
CJam , 20 bajtów
Wypróbuj online!
źródło
Właściwie 19 bajtów
Wypróbuj online!
Oczywiście rozwidlenie odpowiedzi CJama Martina Endera .
źródło
Python 3 ,
8179 bajtówWypróbuj online!
Wykorzystuje złoty współczynnik do obliczenia następnej liczby
źródło
Galaretka , 14 bajtów
Wypróbuj online! lub sprawdź wszystkie wymagane iteracje .
Jak to działa
źródło
Szybki, 251 bajtów
Dla mnie trochę gadatliwy, ale nie mogę wymyślić, jak go skrócić:
Nie golfowany:
Moim problemem jest próba uzyskania cytatów wokół nowej wersji
s
.źródło
Cheddar , 136 bajtów
Wypróbuj online!
źródło
JavaScript (ES6),
15160 bajtówNowa wersja, napisy dla @ Leaky Nun
Stara wersja :
Na podstawie tego .
źródło
x=i=>console.log('x='+x+';x('+(i*(5**.5+1)/2+.5|0)+')');x(2)
31000
nie jest liczbą Fibonacciego.dc , 35 bajtów
Wersja z iteracją (56 bajtów):
źródło
Szybki, 235 bajtów
Jest to ulepszona wersja Caleb „s odpowiedź .
źródło
Java (OpenJDK 8) , 239 bajtów
Wypróbuj online!
źródło