W następstwie estymatora Pi z Monte Carlo wyzwaniem jest stworzenie najkrótszego kodu dla stałej Pi. Z wyjątkiem tego, że Twój kod musi zawsze wyświetlać kolejne cyfry pi.
Jest to kod golfowy, więc wygrywa najkrótsze przesłanie (w bajtach), z tym wyjątkiem, że musi wypisać pierwsze 10 000 cyfr w mniej niż 10 sekund na rozsądnym komputerze i nigdy nie może się zakończyć.
Nie można używać żadnych wbudowanych funkcji Pi ani Trigger.
Usunięto twardy limit rozmiaru kodu.
3141...
jest to - kolejne cyfry pi.Odpowiedzi:
CJam - 48
To oblicza π jako sumę 2 * (k! / (2k + 1) !!) z coraz większą precyzją i na każdym kroku wypisuje kilka cyfr od miejsca, w którym zostało przerwane.
Możesz wypróbować online zmodyfikowaną wersję, która wykonuje tylko 8 iteracji (zewnętrzna pętla) i drukuje 512 cyfr, lub w rzeczywistości używa interpretera Java . Na moim laptopie dochodzi do 16384 cyfr w około 6 sekund.
Uwaga: ten program jest bardzo wymagający pamięci; lepiej zachowująca się, ale nieco dłuższa wersja to:
Wyjaśnienie:
źródło
Python, 138 bajtów
Wdrożenie http://www.cs.ox.ac.uk/jeremy.gibbons/publications/spigot.pdf .
źródło
GolfScript (81 znaków)
Demo online (jest to znacznie wolniejsze niż rozsądny pulpit i zawiera trywialne zmiany kodu, które zapętlają skończoną liczbę razy).
Oczywiście użyłem algorytmu czopka, o którym wspomniałem we wcześniejszym komentarzu, ale zajęło mi trochę czasu, aby go zagrać w sposób satysfakcjonujący. Algorytm przedstawiony w pracy Gibbonsa to (pseudokod)
Powyższy kod GolfScript jest równoważny (pseudokod)
co oszczędza niektóre znaki podczas inicjalizacji i zarządzania stosami.
źródło
Pyth -
8785 bajtówKolejne tłumaczenie strony http://www.cs.ox.ac.uk/jeremy.gibbons/publications/spigot.pdf . Miałem zrobić Python, ale @orlp mnie pobił, więc zrobiłem Pyth. Wystarczająco mały, aby zmieścił się w tweecie.
Daje wyjście na standardowe wyjście, aczkolwiek w sposób przerywany ze względu na bufor drukowania, który pochodzi z ustawień
end=""
drukowania. Obecnie nie drukuję przecinka dziesiętnego, ponieważ specyfikacja mówi „kolejne cyfry”. To zadania zabijają mój wynik.Wypróbuj tutaj . (Uwaga: Ponieważ interpreter online daje tylko pełne wyniki, nieskończona pętla jest niedostępna, więc drukuje tylko pierwsze 100, co zwiększa rozmiar kodu. Aby wypróbować nieskończoność, pobierz lokalnego interpretera).
wyczucie czasu
Na mojej Google Cloud Compute mikro wystąpienie, zgodnie z czasem GNU zajęło:
real: 0m2.062s
więc jest oczywiście wystarczająco szybkie.źródło
Scala, 599 bajtów
Poniższy kod jest prostym portem kodu Pascal z Dodatku 2 do Algorytmu czopowego dla cyfr Pi . Najwyraźniej bardzo mało grało w golfa. Kod generuje 10 000 cyfr w czasie krótszym niż 10 sekund
piSpigot(10000)
i jeśli jedna ma nieskończoną pamięć, można sparametryzować ją w celu wygenerowania wielu cyfr, ale nie nieskończonych. Nie jestem pewien, czy spełnia to ograniczenia problemów, więc proszę o informację zwrotną.źródło
n
. Patrz np. Cs.ox.ac.uk/people/jeremy.gibbons/publications/spigot.pdfBefunge-98 (PyFunge), 120 bajtów
Wypróbuj online!
Jest to granica pod względem limitu czasu. 10 000 cyfr zajmuje około 11 sekund na moim laptopie, ale jestem pewien, że musi być „rozsądny” komputer, który mógłby to zrobić szybciej.
Jeśli jednak wypróbujesz to na TIO, pamiętaj, że nic nie zwróci, dopóki nie osiągnie 60-sekundowego limitu czasu, ponieważ algorytm został zaprojektowany tak, aby działał wiecznie. Do tego czasu będziesz mieć o wiele więcej niż 10 000 cyfr.
Używam algorytmu czopka Jeremy Gibbons, który moim zdaniem jest taki sam jak większość innych odpowiedzi tutaj. Zauważ jednak, że zależy to od interpretera mającego komórki pamięci o dowolnej precyzji, a jedyną znaną mi implementacją, która obsługuje, jest PyFunge .
Wyjaśnienie
źródło