Was ist der kürzeste Code, um einen Stapelüberlauf zu verursachen, um an den öffentlichen Start von Stack Overflow zu erinnern? Jede Sprache willkommen.
ETA: Um bei dieser Frage klar zu sein, da ich gelegentlich Scheme-Benutzer bin: Tail-Call "Rekursion" ist wirklich eine Iteration, und jede Lösung, die von einem anständigen Compiler relativ trivial in eine iterative Lösung konvertiert werden kann, wird dies nicht tun gezählt werden. :-P
ETA2: Ich habe jetzt eine „beste Antwort“ ausgewählt. Weitere Informationen finden Sie in diesem Beitrag . Vielen Dank an alle, die dazu beigetragen haben! :-)
quelle
"
Es lädt alle zwei Male 79 Kopien der Nummer 32, anstatt 2 Kopien der Nummer 1.Lesen Sie diese Zeile und machen Sie zweimal, was darin steht .
quelle
Sie können dies auch in C # .net versuchen
quelle
Nemerle :
Dies stürzt den Compiler mit einer StackOverflowException ab:
quelle
Mein derzeit bestes Ergebnis (in x86-Assembly) ist:
Dies führt zu 3 Bytes Objektcode (
50 EB FD
). Für 16-Bit-Code ist dies auch möglich:was auch zu 3 Bytes (
E8 FD FF
) führt.quelle
PIC18
Die von TK gegebene PIC18-Antwort führt zu den folgenden Anweisungen (binär):
CALL allein führt jedoch einen Stapelüberlauf durch:
Kleinerer, schnellerer PIC18
RCALL (relativer Aufruf) ist jedoch noch kleiner (kein globaler Speicher, daher sind keine zusätzlichen 2 Bytes erforderlich):
Der kleinste auf dem PIC18 ist also ein einzelner Befehl, 16 Bit (zwei Bytes). Dies würde 2 Befehlszyklen pro Schleife dauern. Bei 4 Taktzyklen pro Befehlszyklus haben Sie 8 Taktzyklen. Der PIC18 verfügt über einen Stapel mit 31 Ebenen, sodass er nach der 32. Schleife den Stapel in 256 Taktzyklen überläuft. Bei 64 MHz würden Sie den Stapel in 4 Mikrosekunden und 2 Bytes überlaufen lassen .
PIC16F5x (noch kleiner und schneller)
Die PIC16F5x-Serie verwendet jedoch 12-Bit-Anweisungen:
Wieder zwei Befehlszyklen pro Schleife, 4 Takte pro Befehl, also 8 Taktzyklen pro Schleife.
Der PIC16F5x verfügt jedoch über einen zweistufigen Stapel, sodass er in der dritten Schleife in 24 Anweisungen überlaufen würde. Bei 20 MHz würde es in 1,2 Mikrosekunden und 1,5 Bytes überlaufen .
Intel 4004
Der Intel 4004 verfügt über eine 8-Bit-Aufruf-Subroutinenanweisung:
Für Neugierige, die einem ASCII 'P' entsprechen. Mit einem 3-Level-Stack, der 24 Taktzyklen für insgesamt 32,4 Mikrosekunden und ein Byte benötigt . (Wenn Sie Ihren 4004 nicht übertakten - kommen Sie, Sie wissen, dass Sie wollen.)
Das ist so klein wie die befunge-Antwort, aber viel, viel schneller als der befunge-Code, der in aktuellen Interpreten ausgeführt wird.
quelle
C #:
quelle
Schrei Überlauf!
quelle
Jede Aufgabe braucht das richtige Werkzeug. Lernen Sie die SO Overflow- Sprache kennen, die für Stapelüberläufe optimiert wurde:
quelle
TeX:
Ergebnisse in:
Latex:
Ergebnisse in:
quelle
~
es aktiv ist, kann es anstelle von verwendet werden\a
. Und ich habe den LaTeX-Code ganz zufällig entdeckt. :)Z-80 Assembler - am Speicherort 0x0000:
Ein Byte - 0xC7 - Endlosschleife, bei der der aktuelle PC auf den Stapel geschoben und zur Adresse 0x0000 gesprungen wird.
quelle
Auf Englisch:
quelle
Ein weiteres PHP-Beispiel:
quelle
Wie wäre es mit folgendem in BASIC:
(Ich fürchte, ich habe keinen BASIC-Dolmetscher, das ist also eine Vermutung).
quelle
GOSUB
, keinGOTO
. Da es dort istRETURN
, wo es aufgerufen wurde, wird sicherlich ein Stapel verwendet?Ich habe Codys Antworthaufen geliebt, daher hier mein ähnlicher Beitrag in C ++:
Kein Code-Golf-Eintrag, aber dennoch alles für einen Meta-Stack-Überlauf! :-P
quelle
Hier ist mein C-Beitrag mit 18 Zeichen:
Dies ist viel schwieriger zu optimieren! :-P
quelle
Verwenden der Batchdatei eines Fensters mit dem Namen "s.bat":
quelle
Javascript
Um ein paar weitere Zeichen zu kürzen und uns aus weiteren Software-Shops zu werfen, gehen wir wie folgt vor:
quelle
Groovy:
$ groovy stack.groovy:
quelle
Bitte sagen Sie mir, wofür das Akronym " GNU " steht.
quelle
Wir hoffen auf keine Schwanzrekursion!
quelle
C - Es ist nicht das kürzeste, aber es ist rekursionsfrei. Es ist auch nicht portabel: Es stürzt unter Solaris ab, aber einige alloca () - Implementierungen geben hier möglicherweise einen Fehler zurück (oder rufen malloc () auf). Der Aufruf von printf () ist notwendig.
quelle
Perl in 12 Zeichen:
Bash in 10 Zeichen (das Leerzeichen in der Funktion ist wichtig):
quelle
Versuchen Sie, mehr als 4 Pastetchen auf einen einzelnen Burger zu legen. Paketüberfluss.
quelle
Python :
Alternative:
Und wenn Python Tail Calls optimiert hat ...:
quelle
Ich wähle nach diesem Beitrag die „beste Antwort“ aus. Aber zuerst möchte ich einige sehr originelle Beiträge anerkennen:
So sehr ich das Obige liebe, besteht die Herausforderung darin, Code-Golf zu spielen. Um fair gegenüber den Befragten zu sein, muss ich dem kürzesten Code, dem Befunge-Eintrag, die „beste Antwort“ geben. Ich glaube nicht, dass irgendjemand das schlagen kann (obwohl Konrad es sicherlich versucht hat), also herzlichen Glückwunsch Patrick!
Angesichts der großen Anzahl von Lösungen für Stapelüberlauf durch Rekursion bin ich überrascht, dass (zum Zeitpunkt des Schreibens) niemand den Y-Kombinator aufgerufen hat (siehe Dick Gabriels Aufsatz The Why of Y für eine Grundierung). Ich habe eine rekursive Lösung, die den Y-Kombinator sowie den f (f (x)) -Ansatz von aku verwendet. :-)
quelle
Hier ist ein weiteres interessantes aus Schema:
quelle
Java
Etwas kürzere Version der Java-Lösung.
quelle
quelle
3 Bytes:
Aktualisieren
Laut der (alten?) Intel (?) Dokumentation sind dies ebenfalls 3 Bytes:
quelle