Sekwencja Fibonacciego jest sekwencją dobrze wiedzieć, w którym każdy wpis jest sumą dwóch poprzednich i pierwszych dwóch pozycjach są: 1. Jeśli weźmiemy modulo każdego terminu przez stałą sekwencję staną się okresowe. Na przykład, jeśli zdecydujemy się obliczyć mod sekwencyjny 7, otrzymamy:
1 1 2 3 5 1 6 0 6 6 5 4 2 6 1 0 1 1 ...
Ma to okres 16. Powiązana sekwencja, zwana sekwencją Pisano , jest zdefiniowana tak, że a(n)
jest to okres sekwencji Fibonacciego przy obliczaniu modułu.
Zadanie
Powinieneś napisać program lub funkcję, która, gdy n
zostanie podana , obliczy i wyświetli okres modyfikacji sekwencji Fibonacciegon
. To jest n-ty termin w sekwencji Pisano.
Musisz obsługiwać tylko liczby całkowite w zakresie 0 < n < 2^30
To jest golf golfowy zawody w więc powinieneś dążyć do zminimalizowania rozmiaru kodu źródłowego według liczby bajtów.
Przypadki testowe
1 -> 1
2 -> 3
3 -> 8
4 -> 6
5 -> 20
6 -> 24
7 -> 16
8 -> 12
9 -> 24
10 -> 60
11 -> 10
12 -> 24
f(i),f(i+1)
może przyjąć co najwyżejn^2
wartości modn
. Zatemn
ograniczony do2^30
może zakończyć się nawet do2^60
. Ograniczenien <= 2^16
dałobyP(n) <= 2^32
.f(i+2) = f(i+1)+f(i)
, że „stan” zapętlenia maszyny w tym okresie można opisać za pomocą pary liczb całkowitych modn
. Są co najwyżejn^2
stany, więc okres jest co najwyżejn^2
. O! Wikipedia twierdzi, że okres ten jest co najwyżej6n
. Nieważne, moja trywialność.Odpowiedzi:
GolfScript (
28 25 2423 znaków)Pobiera dane wejściowe na standardowe wejście, pozostawia je na standardowe wyjście (lub stos, jeśli chcesz dalej przetwarzać ...)
To poprawnie obsługuje skrzynie narożne ( Demo ).
Jako przedmiot zainteresowania programistów GolfScript, myślę, że jest to pierwszy program, który napisałem z rozwinięciem, który faktycznie wyszedł krótszy niż inne podejścia, których próbowałem.
źródło
GolfScript, 24 znaki
Następna iteracja implementacji GolfScript. Druga wersja obsługuje teraz również poprawnie 1. Stało się dość długo, ale może ktoś może znaleźć sposób na skrócenie tej wersji. Możesz wypróbować powyższą wersję online .
źródło
1
poprawnie obsługuje wprowadzanie danych ?1
- i nadal tylko 24 znaki.Python,
1881321019587 znakówStosowanie
Na przykład:
źródło
cat
dzwoniąc dowc -c
i dostaję ten sam numer.if k>0 and s[0:k]==s[k:]:break
można zmienić naif s and s[:k]==s[k:]:break
. Możesz także znacznie zmniejszyć, usuwając iterator, zmieniającfor
pętlę nawhile 1:
i wykonująca,b=a,a+b
pod koniec pętli while.Pyton
908596949082Edycja: Zaimplementowane sugestie beary i primo
źródło
a.append(c) -> a+=[c]
podczas gdy pętla może być umieszczona w jednej linii,((n>1)>>(c in a)) -> (n>1)>>(c in a)
append
faktycznie ma inną funkcjonalność niż+=
. Dzięki za wskazówki.(n>1)>>(c in a)
->
(c in a)<1%n
dla 3 bajtów. I zgadzam się z bearisem w sprawie dodatku. Niezależnie od tego, czy dodasz odniesieniec
, czy rozszerzysza
o wartośćc
, jest dokładnie tak samo w obu przypadkach (ponieważ i tak natychmiast niszczysz odniesieniec
).a+=c
a+=[c]
Mathematica 73
źródło
PHP -
6157 bajtówTen skrypt błędnie zgłaszać
2
nan=1
, ale wszystkie inne wartości są prawidłowe.Próbki we / wy, seria skróconych w lewo, gdzie π (n) = 2n + 2:
źródło
1<$a.$b=+$a+$a=!$i+++$b%$n+=fgets(STDIN)
O Boże, tu jest jakaś operacja eksploatacji.PowerShell: 98
Kod do gry w golfa:
Niegolfowany, z komentarzami:
Uwagi:
Nie jestem pewien, jaki jest maksymalny wiarygodny limit dla $ n dla tego skryptu. Jest to prawdopodobnie mniej niż 2 ^ 30, ponieważ $ x może przepełnić int32, zanim $ n dotrze. Poza tym sam nie testowałem górnego limitu, ponieważ czasy uruchamiania skryptu osiągnęły już około 30 sekund w moim systemie za $ n = 1e7 (czyli nieco ponad 2 ^ 23). Z tego samego powodu nie jestem skłonny szybko testować i rozwiązywać problemów z jakąkolwiek dodatkową składnią, która może być potrzebna do uaktualnienia zmiennych do uint32, int64 lub uint64 w razie potrzeby w celu rozszerzenia zakresu tego skryptu.
Przykładowe dane wyjściowe:
Zapakowałem to w inną pętlę for:
Następnie ustaw
$n=$i
zamiast=read-host
i zmień dane wyjściowe, aby"$i | $x"
zorientować się w ogólnej niezawodności skryptu. Oto niektóre wyniki:...
Sidenote:
Nie jestem do końca pewien, jak niektóre Okresy Pisano są znacznie krótsze niż $ n. Czy to normalne, czy coś jest nie tak z moim skryptem?Nieważne - właśnie przypomniałem sobie, że po 5, liczby Fibonacciego szybko stają się znacznie większe niż ich miejsce w sekwencji. To ma teraz sens.źródło
Perl,
75,61, 62 + 1 = 63Stosowanie
Nie golfił
+1 bajt dla
-n
flagi. Ogolono 13 bajtów dzięki Gabrielowi Benamy'emu.źródło
$n=<>;
(-6) i zastąpić go-n
flagą (+1), a następnie wszystkie wystąpienia$n
można zastąpić$_
. Możesz używać-M5.010
za darmo, co pozwala na użyciesay
polecenia zamiastprint
(-2).while
Instrukcje modyfikujące nie wymagają nawiasów wokół warunku (-2). Zamiast tego@{[%h]}/2
możesz mieć licznik$a++,
przed,($m,$k)=
a potem tylkosay$a-1
na końcu (-2). Zamiast"$m,$k"
użycia$m.$k
(-2). Powinno to wyjść$k=1%$_;$a++,($m,$k)=($k,($m+$k)%$_)while!$h{$m.$k}++;say$a-1
z-n
flagą, dla 61 + 1 = 62 bajtów."$m,$k"
zamiast$m.$k
, (+2), ale możesz zapisać 1 bajt, zmieniającwhile!$h
nauntil$h
(-1). Przepraszam!$m.$k
udaje? Wydawało się, że działa na moim końcu.Clojure, 102 bajty
Niezbyt ekscytujące, iteruje formułę, dopóki nie wrócimy
[1 1]
(mam nadzieję, że zawsze tak jest). Specjalna obsługa w(f 1)
miarę konwergencji[0 0]
.źródło