Schreiben Sie ein Programm, das einen StackOverflow-Fehler oder eine Entsprechung in der verwendeten Sprache ausgibt. In Java sollte das Programm beispielsweise werfen java.lang.StackOverflowError
.
Sie dürfen keine Funktion definieren, die sich selbst oder eine neue Klasse aufruft (mit Ausnahme der main
in Java enthaltenen). Es sollten die Klassen der ausgewählten Programmiersprache verwendet werden.
Und es sollte den Fehler nicht explizit auslösen.
def s{def t=s;t}
?Antworten:
Befunge, 1
Befunge kenne ich nicht, aber ...
vom Stapelüberlauf Code Golf
quelle
@
, um das Programm zu beenden.Python (2.7.3), 35 Zeichen
Diese Operation selbst ist erfolgreich, aber sowohl das Skript als auch das interaktive Programm werden
RuntimeError: 'maximum recursion depth exceeded'
anschließend sofort ausgeführt .Inspiriert von Elssars Antwort.
quelle
Coq
70000
ist nur syntaktischer Zucker fürS (S ( ... (S O) ...))
70000S
. Ich denke, es ist die Typprüfung, die den Stapelüberlauf verursacht.Hier ist eine Warnung, die gedruckt wird, bevor der Befehl ausgeführt wird:
quelle
Java - 35
quelle
public static void main
. Oder verstehe ich Java einfach nicht?Javascript 24 Zeichen
Browserabhängige Antwort (muss Zugriff auf haben
apply
):eval
war der kürzeste globale Funktionsname, den ich finden konnte (kennt jemand einen, der kürzer ist?)apply
Ermöglicht die Konvertierung eines Arrays in Funktionsparameter, wobei der erste Parameter der Kontext der function (this
) ist.Array(999999)
erstellt ein Array mit der angegebenen Länge. Nicht sicher, wie viele Argumente maximal vorhanden sind, aber weniger als und mehr als99999
IE9:
Chrome 24:
Firefox 18
Hinweis - Aufgrund des Singlethread-Charakters von Javascript blockieren Endlosschleifen die Benutzeroberfläche und lösen niemals eine Ausnahme aus.
Beides ist nicht qualifiziert.
Update - das spart drei Zeichen:
quelle
eval
das das kürzeste ist.eval.apply(0,Array(1e6))
gehen spart 3 Zeichen, können Sie sogar mit9e9
ohne Kostenapply
ist eine Standard-ECMAScript-Funktion. Es gibt nichts Browserabhängiges. Es sei denn, Sie sprechen über wirklich alte Browser, aber dies würde in hypothetischem Netscape 2apply
sowieso nicht funktionieren , daArray
Klasse in Netscape 2 nicht existiert.eval(...Array(9e9))
dir.apply(0,Array(1e7));
Python 2.7 (12 Zeichen)
führt zu einem «s_push: Parser Stack Overflow»
quelle
SyntaxError: unexpected EOF while parsing
exec('{'*101)
bekomme ichMemoryError
exec
ist eine Anweisung, so dass Sie nur verwenden könnenexec'{'*999
(99 scheint nicht genug zu sein)Mathematica, 4 Zeichen
quelle
Clojure, 12 Zeichen
Laufen in der Antwort:
quelle
(\x.xx)(\x.xx)
, aber ich kenne die Clojure nicht gut genug, um sicher zu sagen, ob dies der Fall ist. Ich verstehe auch nicht, warum der oben erwähnte Ausdruck zu einem Stapelüberlauf führen würde, also machen Sie vielleicht ein paar Tricks mit dem Y-Kombinator? Diese Antwort interessiert mich und eine Erklärung wäre nett.Java - 113 Zeichen
Ich denke, dies bleibt im Sinne der Regel "keine selbstaufrufenden Methoden". Es wird nicht explizit ausgeführt und es wird sogar ein Java-Sprachkonstrukt durchlaufen.
Kondensierte Version:
quelle
""+this
ist eigentlich""+this.toString()
so, dass die Methode sich selbst aufruft.StringBuilder
Objekt wirft .toString
wird wahrscheinlich von dort aus angerufen.toString()
endet Methode up Wesenpublic java.lang.String toString() { return this.toString(); }
C, 19 Bytes
quelle
main.c:1:16: error: size of array 'i' is negative
für mich auf gcc 4.8.1. Die unsignierte Versionmain(){int i[~0U];}
funktioniert.sizeof(i)
ist 16GB. Macht die Verwendung einesul
oderull
Suffix einen Unterschied? Einige Systeme überlasten den Speicher und stürzen nur ab, wenn in den Speicher geschrieben wird.GolfScript (8 Zeichen)
Ergebnis:
Grundsätzlich wird eine stark verschachtelte Datenstruktur erstellt, und der Stapel wird beim Versuch, ihn in einen String umzuwandeln, überlaufen.
quelle
[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ [[[[[[[[[[[[[""]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] ]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] ]]]]]]]]]]]]]]]]] (and so on, output too long for comments)
333
und er wird kaputt gehen.333
war der kleinste Wert, der für mich kaputt gegangen ist, aber wenn Sie eine andere Version von Ruby haben (oder, soweit ich weiß, dieselbe Version auf einem anderen Betriebssystem), kann es vor einem Überlauf zu einer anderen Anzahl von Stack-Frames kommen.6.?
funktioniert also immer noch ohne Hinzufügen von Zeichen.x86-Assembly, NASM-Syntax, 7 Byte
"Pëý" ist 50 EB FD in hexadezimal und
in x86-Assembly.
quelle
Rubin, 12
Gibt
Vermutlich systemabhängig, aber Sie können Größenordnungen hinzufügen, indem Sie die letzte Ziffer nach oben drücken (nicht empfohlen).
Zur Erklärung editieren: Ähnlich wie in einigen anderen Beispielen wird eine Zeichenfolge von
[][][]
... 9000-mal wiederholt und dann ausgewertet: Die am weitesten rechts stehende Zeichenfolge[]
wird als Funktionsaufruf für den Rest analysiert und so weiter. Wenn es tatsächlich an den Anfang käme, würde es einen ArgumentError auslösen, da[]
es sich um ein Objekt mit einer[]
Methode handelt, die ein Argument erfordert. Mein Computer gibt jedoch einen Fehler aus, kurz bevor der Stapel mehr als neuntausend beträgt.quelle
ruby
1.9.2 wirft "ArgumentError: falsche Anzahl von Argumenten (0 für 1..2)".ruby
1.8.7. Dort funktioniert der eingestellte Code wie beschrieben.def f;f;end;f
Rebol (11 Zeichen)
Erträge:
Obwohl Rebol Funktionen, Verschlüsse und Objekte hat, definiert dies keines davon. Es definiert eine Datenstruktur, die im Code-as-Data-Paradigma mit DO als Code behandelt werden kann.
Mit der REPL können wir die Frage nach dem "Was ist S" untersuchen :
DO verwandelt dies niemals in eine Funktion, sondern ruft den Evaluator in der aktuellen Umgebung der Struktur auf.
quelle
C, 35 Zeichen
quelle
alloca(1)
grundsätzlich in übersetzt,sub $1, %esp
sodass der Stack nicht berührt wird.Common Lisp, 7 Zeichen
quelle
#1=(#1#)
für das Terminal und zu verwenden(print #1=(#1#))
, aber Ihre Lösung ist so viel besser.Python - 11 Zeichen
quelle
Casio-Rechner, 11 Tastendrücke
Es ist ziemlich schwierig, Bytes / Token in dieser "Sprache" zu zählen. Ich habe die Anzahl der erforderlichen Tastendrücke angegeben, mit Ausnahme von Umschalt, Alpha (die zweite Umschalttaste) und
=
am Ende - dies passt mit Sicherheit in 1 Byte pro Tastendruck.Getestet mit dem Modell fx-85GT PLUS , einem nicht grafisch dargestellten, "nicht programmierbaren" wissenschaftlichen Standardrechner. Andere Modelle werden funktionieren.
Einfach 11 Würfelwurzeln stapeln:
3√ 3√ 3√ 3√
3√ 3√ 3√ 3√
3√ 3√ 3√
Es gibt nicht einmal einen Syntaxfehler über die fehlende Zahl unter der Quadratwurzel.
Dies scheint nicht mit Quadratwurzeln zu funktionieren.
Alternativ können Sie den Vorgang auch cos(31 Mal wiederholen .
Ausgabe
Ich glaube, dass dies als Stapelüberlauf qualifiziert ist. Der Stapel scheint winzig zu sein ...
quelle
(((((((((((((((((((((((((
FORTH, 13 Bytes
Überläuft den Wertestapel
quelle
: X X ; X
(9) muss den Rückgabestapel überlaufen:
...;
Wortdefinition eingeschlossen werden. Das fügt mindestens 6 Zeichen hinzu, plus mindestens 2 weitere, damit dies als Programm ausgeführt wird. Sie könnten in der Lage sein , es kürzer zu tun, aber hier ist ein Beispiel:: F BEGIN 1 AGAIN ; F
. Ich schlage dies vor, weil die Frage lautet: "Schreiben Sie ein Programm." Wie auch immer, ich habe dir ein Upvote für Forth gegeben, unabhängig von der Anzahl der Charaktere! :-)Nachschrift, 7
Z.B.
quelle
Haskell (GHC, keine Optimierung), 25
Summe ist in der Summe faul. Dies stapelt eine Menge Thunks auf und versucht dann, sie alle am Ende auszuwerten, was zu einem Stapelüberlauf führt.
quelle
LaTeX: 8 Zeichen
Dies ist derselbe Code, der in dieser Antwort verwendet wird . Im Wesentlichen der
\end
erweitert Makro selbst wiederholt, in einem Stapelüberlauf resultierenden:TeX capacity exceeded, sorry [input stack size=5000]
. Eine ausführlichere Erklärung finden Sie hier .quelle
PHP 5.4, 33 Zeichen
Dies führt zu einem Stapelüberlauf, wenn die verschachtelten stdClass- Objekte automatisch zerstört werden:
quelle
Q / k (16 Zeichen)
Ich bin mir nicht sicher, ob dies im Sinne der Herausforderung ist, aber ich glaube nicht, dass es gegen die Regeln verstößt:
quelle
Ein Haufen im gleichen Stil:
Python, 30
Javascript, 38
Lua, 44
quelle
x=lambda y:y(y);x(x)
ist kürzer (20 Zeichen). Diese Funktion ist nicht rekursiv. x ruft jede als Argument übergebene Funktion auf.->x{x[x]}[->y{y[y]}]
#@#&[#@#&]
C #:
106865846322832 : Getter können SO Ihre Maschine einfach in C #:
quelle
public int a {get{return a;}}
int a { get { return a; } }
INTERCAL, 12 Bytes
Erläuterung:
NEXT
ist die INTERCAL-Version eines Unterprogrammaufrufs (oder zumindest der nächstmögliche). Es schiebt die aktuelle Position auf denNEXT
Stapel und springt zum angegebenen Etikett.Wenn die
NEXT
Stack-Länge jedoch 80 überschreitet, erhalten Sie so ziemlich die INTERCAL-Version eines Stack-Überlaufs:Probieren Sie es auf Ideone. .
quelle
Mornington Crescent,
139133quelle
X86-Assembly (AT & T), 33 Zeichen
Beachten Sie, dass das Label zwar
main
als Sprungziel verwendet wird, dies jedoch keine rekursive Funktion ist.quelle
dd 0fdeb60
10 zeichen !Python (17):
quelle
KeyError: 'unknown symbol table entry'