Schreiben Sie das kürzestmögliche Programm (Länge in Byte), das die folgenden Anforderungen erfüllt:
- keine Eingabe
- Ausgabe ist auf Standard
- Die Ausführung wird schließlich abgebrochen
- Die Gesamtzahl der ausgegebenen Bytes übersteigt die Anzahl von Graham
Nehmen Sie an, dass Programme bis zur "normalen" Beendigung auf einem idealen Computer 1 ausgeführt werden , der auf unbegrenzte Ressourcen zugreifen kann, und dass die allgemeinen Programmiersprachen bei Bedarf geändert werden (ohne die Syntax zu ändern), um dies zu ermöglichen. Aufgrund dieser Annahmen können wir dies eine Art Gedankenexperiment nennen.
Hier ist ein 73-Byte-Ruby-Programm, das fω + 1 (99) in der schnell wachsenden Hierarchie berechnet :
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 BEARBEITEN: Nehmen wir genauer an, wir nehmen ein vorhandenes System und ändern es nur, um keine Obergrenze für die Speichergröße zu haben (aber es ist immer endlich). Die Ausführungszeiten von Anweisungen werden nicht angenommen , geändert werden, aber die Maschine angenommen wird ideal in sein , dass es keine Obergrenze für seine Betriebslebensdauer hat.
Antworten:
GolfScript (
4947 Zeichen)Ausführliche Informationen finden Sie unter Lebensdauer eines Wurms . Kurz gesagt, dieses druckt eine Zahl größer als f & ohgr; & ohgr; (2).
quelle
Haskell,
59575563So funktioniert es:
%
Nimmt einfach eine Funktion und setzt sien-1
mal aufs
; dh%3
nimmt eine Funktionf
und gibt eine Funktion ,n
dass es die Anwendung ist gleichf
zu 3 -n-1
mal in einer Reihe. Wenn wir die Anwendung dieser Funktion höherer Ordnung iterieren, erhalten wir eine schnell wachsende Folge von Funktionen - beginnend mit der Potenzierung ist es genau die Folge von Knuth-Pfeil-Waldgrößen:((%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
und so weiter.
((%3)%(3^))n 3
ist3 ↑ⁿ 3
, was in der Berechnung zu Grahams Zahl erscheint. Sie müssen nur noch die Funktion komponieren(\n -> 3 ↑ⁿ 3) ≡ flip((%3)%(3^))3
mehr als 64 Mal, zusätzlich zu 4 (die Anzahl der Pfeile, mit denen die Berechnung beginnt), um eine Zahl zu erhalten, die größer als Grahams Zahl ist. Es ist offensichtlich, dass der Logarithmus (was für eine lahmende langsame Funktion das ist!)g₆₅
Immer noch größer alsg₆₄=G
ist. Wenn wir also diese Zahl drucken, überschreitet die AusgabelängeG
.⬛
quelle
print$((flip((%3)%(3*))3)%2)1
, gibt es einen Laufzeitfehler - kannst du sagen warum? Dies2
ist erfolgreich, wenn auf geändert wird1
(Ausgabe ist 81).Int
schnell zu einem Überlauf kommt . Auf einem 64-Bit-System verbraucht das zu viel Speicher, um reproduziert zu werden, lässt es aber trotzdem nicht zuG
. Ich benötige denInteger
Typ (big-int) , kann ihn also nicht verwenden!!
. Warten Sie ...%
.((%3)%(3*))2 n
tatsächlich wächst schneller als Sie sagen (eine gute Sache), aber mein Haskell-Fu ist nicht ausreichend zu verstehen, warum. Dennn = 0, 1, 2, ...
statt zu geben3, 3^3, 3^(3^3), ...
, gibt es3, 3^(3+1), 3^((3^(3+1))+1), ...
.((%3)%(3*))n 3
ist größer als3 ↑ⁿ 3
". Oder meinst du etwas anderes? Wie auch immer, ich habe die Definition so geändert, dass es nur um Gleichheit geht (zumindest denke ich, dass es zu faul ist, dies jetzt zu überprüfen ...), anstatt größer zu sein. Und wenn Sie ändern ,66
um65
es tatsächlich produziertG
selbst, ist das nicht schön?Pyth ,
2928 BytesDefiniert ein Lambda für die Hyperoperation und ruft es rekursiv auf. Wie die Definition für Grahams Zahl, aber mit größeren Werten.
Dies:
Definiert ein Lambda, das ungefähr der Python entspricht
Dies ergibt die Hyperoperationsfunktion, g (G, H) = 3 ↑ G + 1 (H + 1).
So ist beispielsweise g (1,2) = 3 ↑ 2 3 = 7.625.597.484.987, was Sie hier testen können .
V<x><y>
beginnt eine Schleife, die den Körper führt,y
,x
mal.=gZT
ist hier der Körper der Schleife, was äquivalent zu istZ=g(Z,10)
Der Code:
Sollte die Hyperoperation rekursiv über 64-mal aufrufen und dabei Grahams Nummer angeben.
In meiner Antwort habe ich jedoch die einzelnen Ziffern durch
T
10 ersetzt und die Rekursionstiefe auf 99 erhöht. Bei Verwendung der Graham-Array-Notation ist Grahams Zahl [3,3,4,64] und meine Programm gibt das größere [10,11,11,99] aus. Ich habe auch das entfernt)
, das die Schleife schließt, um ein Byte zu speichern, so dass jeder nachfolgende Wert in den 99 Iterationen gedruckt wird.quelle
Python (111 + n), n = Länge (x)
Obwohl dieses Programm nicht so kurz ist wie das Ruby-Programm des Antwortenden, werde ich es trotzdem posten, um diese Möglichkeit auszuschließen.
Es verwendet die Ackermann-Funktion und ruft die Ackermann-Funktion auf, wobei m und n die Werte eines anderen Aufrufs der Ackermann-Funktion sind.
Das ist wahrscheinlich größer als Grahams Zahl, aber ich bin mir nicht sicher, weil niemand die genaue Länge weiß. Es kann leicht erweitert werden, wenn es nicht größer ist.
quelle
return
aussage oder einelambda
.exec'x=A(x,x);'*x;print x
, ist das Programm in Ordnung und die Ausgabe ist ungefähr f_ (ω + 1) (x) (vorausgesetzt, der Ackermann-Funktionscode ist korrekt), was sogar für x = 99 mehr als G Bytes hat, sagen wir . (In meinem Ruby - Programm,f[m,n]
ist eine VersionA(m,n)
.)eval
stattdessen verwenden möchtenexec
, könnte Ihre letzte Zeile seinf=lambda x:A(x,x);print eval('f('*x+'x'+')'*x)
. Außerdem muss Ihr Def von A (m, n) gemäß dem Kommentar des Boothby korrigiert werden.Ruby,
545250 BytesRuby,
858176716864635957 BytesZiemlich schnell wachsende Hierarchie mit f (a + 1)> fω + 1 (a).
Ruby, 61 Bytes
Grundsätzlich eine Ackermann-Funktion mit einem Dreh.
Rubin,
6359 BytesEin weiterer Ruby,
7471 BytesGrundsätzlich funktioniert Ackermann 99 mal für sich.
quelle
Python: 85
Was vielleicht auf 74 +
length(X)
verkürzt werden könnte :Wo
X
ist eine geeignete große Zahl, so dass die resultierende Hyperoperation3, 3
größer ist als Grahams Zahl (wenn diese Zahl kleiner ist als99999999999
dann wird ein gewisses Byte gespeichert).Hinweis: Ich gehe davon aus, dass der Python-Code auf dem interaktiven Interpreter ausgeführt wird, daher wird das Ergebnis auf stdout ausgegeben. Andernfalls fügen Sie
9
jeder Lösung für den Aufruf von Bytes hinzuprint
.quelle
Javascript, 83 Bytes
Eine weitere Ackermann-Funktionslösung.
quelle
JavaScript, 68 Byte, jedoch nicht konkurrenzfähig für die Verwendung von ES6
a
Die Funktion ähnelt der Aufwärtspfeilnotation mit der Basis 9.b
Funktion ist: b (x) = b x (9).b(99)
ist ~ fω + 1 (99), verglichen mit Grahams Zahl < fω + 1 (64).quelle