Napisz możliwie najkrótszy program (długość mierzony w bajtach) spełniający następujące wymagania:
- brak wejścia
- wyjście jest na standardowe wyjście
- wykonanie ostatecznie kończy się
- całkowita liczba bajtów wyjściowych przekracza liczbę Grahama
Załóżmy, że programy działają aż do „normalnego” zakończenia na idealnym komputerze 1, który może uzyskać dostęp do nieograniczonych zasobów, oraz że wspólne języki programowania są modyfikowane, jeśli to konieczne (bez zmiany składni), aby to umożliwić. Z powodu tych założeń możemy nazwać to rodzajem eksperymentu Gedanken.
Na początek oto 73-bajtowy program Ruby, który oblicza f ω + 1 (99) w szybko rosnącej hierarchii :
f=proc{|k,n|k>0?n.times{n=f[k-1,n]}:n+=1;n};n=99;n.times{n=f[n,n]};puts n
1 EDYCJA: Dokładniej, załóżmy, że bierzemy istniejący system i modyfikujemy go tylko po to, aby nie mieć górnego limitu wielkości pamięci (ale zawsze jest skończony). Czasy wykonania instrukcji nie powinny być modyfikowane, ale zakłada się, że maszyna jest idealna, ponieważ nie będzie miała górnego limitu czasu pracy.
Odpowiedzi:
GolfScript (
4947 znaków)Aby uzyskać wiele wyjaśnień, zobacz Żywotność robaka . W skrócie, wypisuje liczbę większą niż f ω ω (2).
źródło
Haskell,
59575563Jak to działa:
%
po prostu bierze funkcję i komponuje jąn-1
razys
; tzn.%3
przyjmuje funkcjęf
i zwraca funkcjęn
równą zastosowaniu jejf
do 3n-1
razy z rzędu. Jeśli iterujemy stosowanie tej funkcji wyższego rzędu, otrzymujemy szybko rosnącą sekwencję funkcji - zaczynając od potęgowania, jest to dokładnie sekwencja rozmiarów Knutha-strzałki-lasu:((%3)%(3^))1 n = (3^)n = 3ⁿ = 3↑n
((%3)%(3^))2 n = ((3^)%3)n = (3↑)ⁿ⁻¹ $ 3 = 3↑↑n
((%3)%(3^))3 n = (((3^)%3)%3)n = (3↑↑)ⁿ⁻¹ $ 3 = 3↑↑↑n
i tak dalej.
((%3)%(3^))n 3
jest3 ↑ⁿ 3
, co pojawia się w obliczeniach do liczby Grahama. Pozostaje tylko skomponować funkcję(\n -> 3 ↑ⁿ 3) ≡ flip((%3)%(3^))3
ponad 64 razy, oprócz 4 (liczby strzałek, od których rozpoczyna się obliczenie), aby uzyskać liczbę większą niż liczba Grahama. Oczywiste jest, że logarytm (co to za powolna wolna funkcja!)g₆₅
Jest wciąż większy niżg₆₄=G
, więc jeśli wydrukujemy tę liczbę, długość wyjściowa przekroczyG
.⬛
źródło
print$((flip((%3)%(3*))3)%2)1
, tam jest błąd run-time - można powiedzieć, dlaczego? Udaje się, gdy2
zmieniono na1
(wynik wynosi 81).Int
szybko się przepełnia . W systemie 64-bitowym, który zużywa zbyt dużo pamięci do odtworzenia, ale oczywiście nadal nie pozwala na dostępG
. Potrzebuję typu (big-int)Integer
, więc nie mogę użyć!!
; czekaj ...%
.((%3)%(3*))2 n
rzeczywistości rośnie szybciej niż mówisz ( dobra rzecz), ale mój Haskell-fu nie jest w stanie zrozumieć, dlaczego. Bon = 0, 1, 2, ...
zamiast dawać3, 3^3, 3^(3^3), ...
, daje3, 3^(3+1), 3^((3^(3+1))+1), ...
.((%3)%(3*))n 3
jest większy niż3 ↑ⁿ 3
”. Czy masz na myśli coś innego? W każdym razie zmieniłem definicję, aby wszystkie były równe (przynajmniej tak myślę, aby leniwie sprawdzić teraz ...), a nie większe. A jeśli zmienisz się66
na65
, toG
sam się produkuje , czy to nie miłe?Pyth ,
2928 bajtówDefiniuje lambda dla hiperoperacji i rekurencyjnie ją wywołuje. Podobnie jak definicja liczby Grahama, ale z większymi wartościami.
To:
Definiuje lambda, mniej więcej równe pytonowi
Daje to funkcję hiperoperacji, g (G, H) = 3 ↑ G + 1 (H + 1).
Na przykład g (1,2) = 3 ↑ 2 3 = 7,625,597,484,987, co możesz przetestować tutaj .
V<x><y>
uruchamia pętlę, która wykonuje ciałoy
,x
razy.=gZT
jest tu ciałem pętli, co jest równoważne zZ=g(Z,10)
Kod:
Powinien rekurencyjnie wywoływać hiperoperację ponad 64 razy, podając liczbę Grahama.
W mojej odpowiedzi zastąpiłem jednak pojedyncze cyfry
T
, które są inicjowane do 10, i zwiększyłem głębokość rekurencji do 99. Za pomocą Notacji tablicy Grahama, liczba Grahama wynosi [3,3,4,64], a moja program wypisuje większy [10,11,11,99]. Usunąłem również tę,)
która zamyka pętlę, aby zapisać jeden bajt, więc wypisuje każdą kolejną wartość w 99 iteracjach.źródło
Python (111 + n), n = długość (x)
Chociaż ten nie jest tak krótki jak program Ruby odpowiadającego, i tak opublikuję go, aby wykluczyć tę możliwość.
Wykorzystuje funkcję Ackermann i wywołuje funkcję Ackermann, gdzie m i n są wartościami z innego wywołania funkcji Ackermann, i powtarza się 1000 razy.
Prawdopodobnie jest to liczba większa niż liczba Grahama, ale nie jestem pewien, ponieważ nikt nie zna jej dokładnej długości. Można go łatwo rozszerzyć, jeśli nie jest większy.
źródło
return
oświadczenia lublambda
.exec'x=A(x,x);'*x;print x
, wówczas program jest w porządku, a wynik jest w przybliżeniu f_ (ω + 1) (x) (zakładając, że kod funkcji Ackermanna jest poprawny), który ma więcej niż G bajtów nawet dla x = 99, powiedzmy . (W moim programie Rubyf[m,n]
jest to wersjaA(m,n)
.)eval
zamiastexec
, twoja ostatnia linia może byćf=lambda x:A(x,x);print eval('f('*x+'x'+')'*x)
. Ponadto twoja def A (m, n) musi zostać skorygowana według komentarza boothby.Rubin,
545250 bajtówRubinowy,
858176716864635957 bajtówDość szybko rosnąca hierarchia zf (a + 1)> f ω + 1 (a).
Ruby, 61 bajtów
Zasadniczo funkcja Ackermanna z niespodzianką.
Rubin,
6359 bajtówAnother Ruby,
7471 bajtówZasadniczo funkcja Ackermanna do siebie 99 razy.
źródło
Python: 85
Który może być skrócony do 74+
length(X)
:Gdzie
X
jest odpowiednia duża liczba, taka że wynikowa hiperoperacja3, 3
jest większa niż liczba Grahama (jeśli ta liczba jest mniejsza niż,99999999999
wówczas zapisywany jest jakiś bajt).Uwaga: Zakładam, że kod Pythona jest wykonywany na interaktywnym interpretatorze, dlatego wynik jest wypisywany na standardowe wyjście, w przeciwnym razie dodaj
9
bajty do każdego rozwiązania dla wywołaniaprint
.źródło
JavaScript, 83 bajty
Kolejne rozwiązanie funkcji Ackermanna.
źródło
JavaScript, 68 bajtów, jednak nie konkuruje o użycie ES6
a
funkcja jest podobna do notacji strzałki w górę z bazą 9.b
funkcja to: b (x) = b x (9).b(99)
to ~ f ω + 1 (99), w porównaniu do liczby Grahama <f ω + 1 (64).źródło