Rozważmy trzy sekwencje liczb, A
, B
i C
:
A
: Sekwencja oparta na relacjach powtarzalnościf(n) = f(n-1)+f(n-2)
, zaczynająca się odf(1) = 3, f(2) = 4
. Sekwencja zaczyna się w ten sposób:3 4 7 11 18 29 47 76 ...
B
: Liczby zespolone , czyli wszystkie liczby całkowite, które nie są liczbami pierwszymi (lub 1):4 6 8 9 10 12 14 15 16 ...
C
: Cyfry Pi:3 1 4 1 5 9 2 6 5 ...
Biorąc pod uwagę dodatnią liczbę całkowitą N < 50
, jako argument funkcji lub STDIN, zwraca wartość dziesiętną ułamka A(N)/B(N)
z C(N)
cyframi po przecinku. Obowiązują normalne zasady zaokrąglania (zaokrąglić w górę, jeśli N + 1 cyfra to 5 lub więcej). Jeśli N-ta cyfra pi
to zero, należy wypisać liczbę całkowitą. notacja naukowa / standardowy formularz jest akceptowany dla liczb wyższych niż 1000.
To jest kod golfowy, więc wygrywa najkrótsza odpowiedź w bajtach.
Kilka przykładów:
N = 1: 0.750
N = 2: 0.7
N = 3: 0.8750
N = 4: 1.2
N = 6: 2.416666667
N = 10: 11.056
N = 20: 764.8750
Oczywiście obowiązują standardowe zasady gry w golfa.
Funkcja musi zakończyć się w mniej niż dwie minuty na każdym nowoczesnym laptopie.
C(n)
cyfry, czy musimy uwzględniać końcowe zera?N
? Jeśli tak, to do N = 49. Czy coś jeszcze?Odpowiedzi:
Pyth,
605758 bajtówUprząż testowa
Jest to dość proste - oblicz pi, serię Fibonacciego i kompozyty, zaokrąglaj do C (n) cyfr, pad do C (n) cyfr i lokalizację cyfr dziesiętnych, gotowe.
Na):
hu,eGsGQjT7
B (n):
e.ftPZQ)
C (n):
e/u+/*GHhyHy^TQr99ZZT
60 -> 57: Usunięto przypadek specjalny n = 1 w obliczeniach liczby pi.
57 -> 58: Nie stosowałem wystarczająco wysokiej precyzji dla pi dla całego zakresu wejściowego - zwiększono 99 iteracji do 1000 iteracji.
Uwaga na temat zaokrąglania: używa systemu zaokrąglania „najbliższego parzystego” Pythona, a nie systemu „podanego w nieskończoność” określonego przez OP. Różnica ma jednak znaczenie tylko wtedy, gdy cyfry bezpośrednio po punkcie zaokrąglenia są
5000...
, np. 1,25 zaokrąglone do 1 cyfry. Sprawdziłem zakres wejściowy i to się nigdy nie zdarza, więc zawsze zwracany jest prawidłowy wynik.źródło
PowerShell,
420 bajtów (ayyyyyyyy)378 bajtówDzięki isaacg za zaoszczędzenie 41 bajtów, za obliczenie, jak pytanie się zaokrągla. Oznacza, że nie musiałem uwzględniać horrendous
[MidpointRounding]::AwayFromZero
i nie musiałem jawnie rzucać jako[double]
.To była świetna zabawa!
Rozszerzony:
Rekurencja w PowerShell jest ... powolna, powiedzmy, więc musimy zbudować
A(N)
drugi kierunek i zapisać go w tablicy, a następnie zindeksować.STARY
Święta krowa, czy wymagania dotyczące mocy zabiły to. Domyślnie PowerShell stosuje zaokrąglanie do najbliższego zaokrąglania a / k / a bankiera, co wymaga użycia wyjątkowo szczegółowego
[MidpointRounding]::AwayFromZero
przełączania stylów zaokrąglania . Ponadto musimy uzupełnić końcowe zera, jeśli takie istnieją. Te dwa wymagania łącznie zmieniły ostatnią parę linii z 20 bajtów[math]::Round($r,$q)
do 102 bajtów (od$s=""
do+$s)
) ... wow.źródło
[MidpointRounding]::AwayFromZero
samego jest prawie zbyt dobre / złe, aby mogło być prawdziwe ... =)JavaScript (ES6), 302 bajty
Jedno słowo: niedokończone.
Pierwsze 49 cyfr pi jest przechowywanych w ciągu, a pozostałe dwie sekwencje są generowane automatycznie. Zostało to zagrane w golfa w połowie drogi; Jestem (prawie) pewien, że mógłbym wycisnąć z niego kolejne 50 bajtów.
Działa dla wszystkich przypadków testowych i powinien działać dla reszty. Awarie na czymkolwiek większym niż 49 lub mniejszym niż 0 (i tak nigdy nie powinno się z nimi spotkać). Szczególnie podoba mi się jego wynik dla 0:
źródło
Oktawa,
276236 bajtówPrzede wszystkim pomyślałem, że fajnie byłoby skorzystać z pewnej nieograniczonej dokładności w tych narzędziach matematycznych (i odświeżyć trochę wiedzę na ten temat), więc zacząłem pisać algorytmy, a potem w końcu dowiedziałem się, że
pi
wartość nie jest tak dokładna, że ja będzie musiał ponownie użyć tablicy. Więc znowu nie ma wielkiego sukcesu:Nadal dość czytelny, prawda?
Stosowanie
skopiuj i wklej funkcję do oktawy, wywołaj funkcję
c
z argumentem wymaganej wartości:Optymalizacje:
endif
,endfor
a podobnaend
, który działa w ten sam sposóbi
o jeden zapis o jeden bajtnum2str(str2num(p(A)))
bzdury :)źródło
end
nieendif
tyle zapisanych bajtów. Jeśli zdarzy się, że również symboliczne Toolbox dla MATLAB, można użyćvpa
, aby uzyskać wystarczającą ilość punktów dziesiętnych do p:vpa(sym(pi),49)
. Nie mam go na tym laptopie, więc nie jestem pewien, czysym
jest to konieczne, ale i tak powinien zaoszczędzić sporo bajtów =) A czytelność niekoniecznie jest dobra w kodzie golfa =)while
odendwhile
i podobnych działa dobrze, więc jestem aktualizowania odpowiedź z kilku mniejszych znaków :)