Prawdopodobnie znasz sekwencję Fibonacciego, w której pierwsze dwa terminy są 0, 1
(lub czasami 1, 1
), a każdy następny po nich jest sumą dwóch poprzednich. Zaczyna się tak:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
Czasami sekwencja zawiera liczby, które mają szczególny wzór, który uważam za interesujący: różnica między dowolną parą sąsiednich cyfr jest taka sama, jak każdej innej pary. Na przykład w sekwencji rozpoczynającej się 0, 1
od 18. termin to 987
. 9-8=1
a 8-7=1
. Jestem lekko zadowolony.
Wyzwanie
Biorąc pod uwagę dwie wartości początkowe F(0)
i F(1)
, wypisz każdą liczbę w sekwencji wygenerowanej przez to, F(n) = F(n-1) + F(n-2)
która spełnia następujące kryteria:
- Różnica między dowolną parą sąsiednich cyfr jest taka sama, jak każdej innej pary
- Ma co najmniej trzy cyfry (liczby 1 i 2 cyfry nie są interesujące dla tego wzoru)
Wejście
- Dwie nieujemne liczby całkowite mniejsze niż 10 ** 10 (10 miliardów)
Wynik
- Wszystkie liczby całkowite mniejsze niż 10 ** 10 i spełniające kryteria w części Wyzwanie
- Dopuszczalne jest wyświetlanie cyfr większych niż 10 ** 10, ale nie jest to wymagane
- Biorąc pod uwagę, że powtarzające się cyfry odpowiadają wzorowi (np.
777
), Możliwe jest, że istnieją nieskończone liczby, które spełniają kryteria, ale Twój program nie musi wyświetlać danych zawsze - Jeśli nie ma takich liczb całkowitych, wypisz cokolwiek chcesz, o ile nie jest to liczba (nic, null, pusta tablica, komunikat o błędzie, smutna twarz itp.)
- Jeśli liczba pasująca do wzorca pojawia się więcej niż jeden raz w sekwencji, możesz ją wypisać raz lub tyle razy, ile się pojawi
- Jeżeli dane wejściowe spełniają kryteria, powinny zostać uwzględnione w danych wyjściowych
Zasady
- Dane wejściowe i wyjściowe mogą być w dowolnym standardowym formacie
- Standardowe luki są zabronione
- To jest golf golfowy, więc wygrywa najkrótszy kod w bajtach
Przykłady / przypadki testowe
Input , Output
[1,10] , []
[0,1] , [987]
[2,1] , [123]
[2,3] , [987]
[61,86] , [147]
[75,90] , [420]
[34,74] , [1234]
[59,81] , [2468]
[84,85] , [7531]
[19,46] , [111]
[60,81] , [222]
[41,42] , [333]
[13,81] , [444]
[31,50] , [555]
[15,42] , [666]
[94,99] , [777]
[72,66] , [888]
[3189,826] , [888888888]
[15,3] , [159,258]
[22,51] , [321,1357]
[74,85] , [159,4444]
[27,31] , [147,11111]
[123,0] , [123,123,123,246,369]
[111,0] , [111,111,111,222,333,555,888]
[111,222] , [111,222,333,555,888]
[33345,692] , [987654321]
[3894621507,5981921703] , [9876543210]
[765432099,111111111] , [111111111,876543210,987654321]
[1976,123] , [123, 2222, 4321, 6543, 45678]
[1976, 123] -> [123, 2222, 4321, 6543, 45678]
,[3189, 826] -> [888888888]
,[33345, 692] -> [987654321]
Odpowiedzi:
MATL , 14 bajtów
Dzięki Emignie za wskazanie błędu, teraz poprawionego
Nieskończona pętla, która wyświetla liczby w miarę ich znajdowania.
Wypróbuj online! Pamiętaj, że w tłumaczu online wyniki są wyświetlane po upływie 1 minuty.
Wyjaśnienie
Niech
F(n)
iF(n+1)
oznacz dwa ogólne kolejne terminy sekwencji Fibonacciego. Każda iteracja pętli zaczyna się od stosu zawierającegoF(n)
,F(n+1)
dla niektórychn
.źródło
05AB1E ,
171615 bajtówWypróbuj online!
Wyjaśnienie
źródło
JavaScript (ES6),
858481 bajtówWypróbuj online!
Testowanie sąsiednich cyfr
Zarówno x oraz d są inicjowane do anonimowej funkcji, która siły
NaN
dla wszystkich operacji arytmetycznych są one zaangażowane w. Pierwsza iteracjasome()
daje zawsze(d = [function] - n) === NaN
i(r = [function] - d) === NaN
(falsy). Przy drugiej iteracji mamyd = x - n
(liczbę całkowitą) i(r = NaN - d) === NaN
(znowu fałsz). Zaczynając od trzeciej iteracji, r jest ustawiane na liczbę całkowitą, która nie jest zerowa, jeśli różnica między cyfrą # 3 i cyfrą # 2 nie jest równa różnicy między cyfrą # 2 a cyfrą # 1.Liczba p spełnia wymagane kryteria wtedy i tylko wtedy, gdy
some()
występuje fałsz (wszystkie sąsiadujące cyfry mają tę samą różnicę), a końcowa wartość r wynosi 0 (były co najmniej 3 iteracje). To daje!false / 0 === true / 0 === Infinity
(prawda).W przeciwnym razie możemy mieć:
!true / r
z r> 0 lub r <0 , co dajefalse / r === 0
(fałsz)!false / NaN
, co dajetrue / NaN === NaN
(fałsz)Stan zatrzymania
Rekursja kończy się, gdy
p | q
wartość wynosi 0 . Gwarantuje to, że zarówno p, jak i q osiągną wartości około 10 25, które są 84-bitowe. Ponieważ JS ma 52 bity mantysy, ostatnie 32 bity są zerowane. Tak więc 32-bitowa bitowa operacja OR wynosi 0 .Ze względu na szybko rosnące tempo sekwencji dzieje się to dość szybko.
źródło
Java 8,
151144140136130 bajtówNieskończona pętla wyprowadzająca liczby, gdy je znajdzie.
Wypróbuj online (upłynie limit czasu po 60 sekundach).
Wersja 136 bajtów z dodanym limitem 10 10 (
a<1e10
):Wypróbuj online.
Wyjaśnienie:
źródło
Galaretka ,
20 1918 bajtówWypróbuj online!
+ƝḢ;Ɗȷ¡
tworzy pierwszy tysiąc (ȷ
) terminów w serii, które zawsze będą wystarczające. Myślę, że istnieje prawdopodobnie krótszy sposób, aby to zrobić.+ȷ¡
zbliża się, ale działa tylko wtedy, gdy pierwszy termin wynosi zero.Zakładam, że możemy przyjąć dwie liczby w odwrotnej kolejności, co pozwala na jeden bajt
DIE
.Jeśli nie jesteśmy zobowiązani do wyprowadzania żadnego z danych wejściowych:
Galaretka , 15 bajtów
Wypróbuj online!
źródło
DIEƊ
podczas gry w golfa.Oktawa ,
919083 bajtówZaoszczędź 7 bajtów dzięki Luisowi Mendo!
Wypróbuj online!
Cóż, działa!
eval
z pętlą for wewnątrz, aby zaoszczędzić kilka bajtów. Pomijanie dwukropków i średników, aby zaoszczędzić kilka. Wykorzystuje fakt, że wektor jest uważany za prawdziwy, jeśli wszystkie elementy są niezerowe, aby zapisaćany
luball
.Poza tym jest to prawie prosta implementacja Fibonacciego.
źródło
Python 2 ,
10298 bajtówWypróbuj online!
Dzięki za 4 bajty z ovs
źródło
Haskell , 105 bajtów
Definiuje operator,
(%)
który zwraca nieskończoną listę ze wszystkimi rozwiązaniami. Aby zobaczyć wynik na stdout , musimy wyłączyć buforowanie (lub uruchomić go wghci
lub zrunhaskell
), wypróbuj go online!Wyjaśnienie / Niegolfowany
Funkcja
f
jest tylko funkcją pomocniczą, która oczekuje funkcji binarnej i listy, stosuje jąg
do wszystkich sąsiednich par. Jest zasadniczo taki sam jak:Operator
(%)
to tylko lista, która dokonuje filtrowania (upewniając się, że są co najmniej 3 cyfry i że sąsiednie cyfry mają taką samą odległość):źródło
CJam , 55 bajtów
Wypróbuj online!
Moje pierwsze zgłoszenie do CJam, niezbyt krótkie, ale dużo zabawy. Wszelkie sugestie są mile widziane!
źródło
Stax ,
2624 bajtówUruchom i debuguj
Wyjaśnienie
Nie tak krótki, jak bym tego chciał i prawdopodobnie można go trochę pograć w golfa, ale działa.
źródło
Rubinowy , 79 bajtów
Wypróbuj online!
źródło
Julia 0.6 ,
8681 bajtówWypróbuj online!
Całkiem proste - sprawdź, czy wejście ma co najmniej 3 cyfry (
n>99
), a następnie weź różnicę między każdą parą cyfr w liczbie (diff(digits(n))
), sprawdź, czy długość (endof
) ma unikalny zestaw (∪
) tych różnic wynosi 1 (tzn. Wszystkie różnice są takie same), a jeśli tak, wydrukuj numer. Zrób to dla obu podanych liczb, a następnie rekurencyjnie wywołaj funkcję z następnymi dwoma liczbami.(Niestety wygląda na to, żeTeraz przeciąża±
ma wyższy priorytet niż+
, bo inaczej może być ostatnie wywołaniea+b±a+2b
, oszczędzając 3 bajty).<
operatora, oszczędzając w ten sposób zarówno bajty operatora, jak i nawiasy priorytetowe. (Nie można jednak użyć<
w naszym kodzie, więc po prostu przestawionoendof(...)<2
na2>endof(...)
).Jeśli dozwolone są jakieś zewnętrzne dane wyjściowe, możemy zaoszczędzić 2 bajty,
@show
zamiastprintln
drukowanian = 987
zamiast zamiast987
. Możemy nawet użyćdump
o 1 bajt mniej, aledump
drukuje informacje o typie wraz z wartością, więc wynik będzieInt64 987
zamiast po prostu987
.źródło