Ihre Aufgabe ist es, ein vollständiges Programm oder eine Funktion zu schreiben , die keine Eingabe nimmt und führen jede Art von Schleife ( while
, for
, foreach
, do
, do-while
, do-loop
, goto
, Rekursion, usw.) , die bei der Verursachung einen Fehlers enden wird, was bedeutet , dass das Programm anhalten muss dich läuft und Ausfahrt.
Regeln:
- Der Fehler muss ein Laufzeitfehler, eine nicht behandelte Ausnahme oder alles sein, was das Programm selbst beenden lässt.
- Der Fehler muss zum Beenden und Beenden des Programms führen, ohne dass
exit;
irgendwann ein expliziter (oder gleichwertiger) Aufruf erfolgt . - Nachrichten wie
Warning:
,Notice:
, usw., die das Programm nicht dazu führen , dass sich am Ende sind nicht gültig. Beispielsweise wird in PHP-Divisionen durch Null eineWarning
Meldung ausgegeben, das Programm wird jedoch nicht angehalten und weiterhin ausgeführt. Dies ist keine gültige Antwort. - Die Schleife muss mindestens einen vollen Zyklus durchlaufen. Mit anderen Worten, der Fehler kann ab dem zweiten Zyklus und darüber hinaus auftreten. Dies soll verhindern, dass der Fehler durch falsche Codesyntax verursacht wird: Der Code muss syntaktisch korrekt sein.
- Die Schleife kann sogar unendlich sein (Beispiel
for(;;);
), wenn die oben genannten Regeln eingehalten werden. Es darf jedoch nicht länger als 2 Minuten dauern, bis ein Laufzeitfehler auftritt. - Rekursion ohne Tail Call-Optimierung ist ungültig ( 1 , 2 ).
- Das ist Code-Golf, also gewinnt der kürzeste Code.
- Standardlücken sind verboten.
C # -Beispiel ( Online-Test ):
using System;
public class Program {
public static void Main() {
int i;
int[] n;
n = new int[5];
for(i=0; i<7; i++) {
n[i] = i;
Console.WriteLine(n[i]);
}
}
}
Output:
0
1
2
3
4
Run-time exception (line 9): Index was outside the bounds of the array.
Stack Trace:
[System.IndexOutOfRangeException: Index was outside the bounds of the array.]
at Program.Main(): line 9
Bestenliste:
var QUESTION_ID=104323,OVERRIDE_USER=59718;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important;font-family:Arial,Helvetica; font-size:12px}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
Vielen Dank an Martin Ender für das Leaderboard Snippet
for(a;b;c)d;
, nach welcher Aussage endet der erste Zyklus? Ist es gültig, bei der ersten Bewertung derc
Aussage zu brechen ?a, b, d, c, b, d, c, ...
,b
ist der Beginn des Zyklus, und muss mindestens ein zweites Mal ausgeführt werden.Antworten:
MATL ,
51 ByteIdee aus @ MartinEnders CJam-Antwort
Probieren Sie es online!
Alte Version
Probieren Sie es online!
quelle
Python, 16 Bytes
Der nicht interessante 0-Teilungsansatz:
Die erste Iteration berechnet
1 / 1
, was gut funktioniert. Die zweite Iteration versucht zu berechnen0 / 0
, was zu einemZeroDivisionError
Auslösen führt.17 Bytes (persönlicher Favorit)
Anfangs,
i=1
was wahr ist, wird also die Schleife betreten.Beim ersten Ausführen der Schleife wird die Variable
i
gelöscht.Dies bedeutet, dass es sich beim zweiten Mal
i
nicht mehr um eine Variable handelt und daher deren Auswertung mit fehlschlägtNameError: name 'i' is not defined.
Eine weitere 15-Byte-Lösung wäre
def _():_()
(newline)_()
, da Python die Schwanzrekursion nicht optimiert. Dies verstößt jedoch gegen Regel 6.quelle
while i
mit ,while 1
weil sie zu löschen versucht ,i
wieder;del
: Trick mit einem eingebauten in abrasieren ein paar mehrwhile 1:del id
.del id
funktioniert nicht. Auf diese Weise können Sie keine eingebauten Elemente löschen .Gelee ,
32 BytesTötet sich selbst, indem der Speicher knapp wird. Dies geschieht lokal nach ~ 100 Sekunden.
Probieren Sie es online! (Sterbeurkunde in der Debug- Schublade)
Wie es funktioniert
Die ersten paar Iterationen ergeben:
Danach wird es sehr hässlich, sehr schnell.
quelle
V , 2 Bytes
Probieren Sie es online!
Dies ist die perfekte Herausforderung für V, weil ich das schon die ganze Zeit mache! Tatsächlich hat V nicht einmal Bedingungen, sondern nur Funktionen, die bei einem Fehler abbrechen. In diesem Fall
ò
bedeutet "für immer wiederholen" undl
"nach rechts bewegen".In einem leeren Puffer (keine Eingabe) wird dies beim ersten Durchlauf unterbrochen und keine Ausgabe erzeugt. Wenn es eine Eingabe gibt, bricht diese ab, sobald wir das letzte Zeichen der Eingabe eingeben und die gesamte Eingabe ausgeben (was dies auch zu einem Katzenprogramm macht).
quelle
l
bedeutet "nach rechts bewegen"? Nicht "l
eft bewegen "?JavaScript (ES6), 13 Byte
Dies ist eine rekursive Funktion, die einmal ausgeführt, dann ausgelöst
ReferenceError: a is not defined
und beendet wird.Hier ist eine 15-Byte-Version ohne ES6:
Dies läuft einmal gut, wirft dann
TypeError: i is undefined
und beendet.quelle
Bash 4.2, 22 Bytes
Funktioniert nicht in TIO, da es Bash 4.3 enthält und der Fehler, auf den ich mich verlasse, endlich behoben wurde.
Nachprüfung
Dies stürzt ab, sobald das Programm versucht, 2 63 mod -1 zu berechnen , was in Bash 4.2 und älteren Versionen aufgrund eines bekannten Fehlers abstürzt.
quelle
PHP,
22212018 BytesDies beruht auf PHP, das es einem erlaubt, einer Variablen einen Funktionsnamen zu geben und zu versuchen, sie auszuführen.
Dadurch wird der Name der
pi
Funktion einfach zweimal verkettet . Dies tötet PHP mit einemFatal Error: Uncaught Error: Call to undefined function pipi() in [...][...]
.Das funktioniert ähnlich wie bei meiner alten Antwort.
Alte Antwort, 20 Bytes
Mit PHP können Sie Zeichen mit dem Inkrement-Operator inkrementieren. Es funktioniert nur auf der
a-z
Strecke, ist aber genug.Ich glaube, dass dies alle erforderlichen Punkte erfüllt und die Schleife einmal ausgeführt wird.
Sie können sehen, ob Sie den Fehler erhalten
Fatal error: Function name must be a string
.So geht's Schritt für Schritt:
pi
zu$x
.Da
pi
es als Konstante verwendet wird, prüft PHP, ob es existiert.Da dies nicht der Fall ist, zeigt PHP einen Warnhinweis an.
Use of undefined constant pi - assumed 'pi'
(Grundsätzlich gilt: Da die Konstante nicht existiert, wird angenommen, dass es sich um eine Zeichenfolge handelt.)$x()
.Da
$x
hat den Wertpi
, wird es die Funktion ausführenpi()
.$x
.$x
hat jetzt π stattpi
$x()
.Da
$x
π hat, wird die Funktion ausgeführt3.14159...()
.Fatal Error
.Vielen Dank an @Titus für das Auffinden der
pi()
Funktion, die mir 1 Byte erspart hat !quelle
$x
auf,abt
bevor der Schleifenkörper ausgeführt wird. Sie können dies beheben, indem Sie nach der Schleife inkrementieren .for($x=abs;;++$x)echo$x,$x();
zum Testen auszuführen . Es sollte sich zeigenabs0abt Fatal error[...]
. Oder ähnliches.pi
anstelle von verwendenabs
. Das bringt nicht einmal eine Warnung, bevor es den Tod auslöst._
in einigen Systemen definiert ist, aber unzuverlässig ist. Aber danke, dass du das gefunden hast!GNU sed ,
15 135 Bytes-2 Dank Seshoumara
-8 Dank Zeppelin
Das hat schnell keinen Speicher mehr:
quelle
s:a\?:&a:g
? Es ist 1 Byte kleiner und verdoppelt auch die Mustergröße pro Iteration.echo -n | sed 's:a\?:&a:g'
und bekam keine Ausgabe. Es wäre dasselbe wiesed 's::a:'
das, was zu nichts passen würde.echo -n
absolut nichts wird an sed übergeben, aber sed kann nicht ohne Eingabe von Design starten. Überprüfen Sie diesen Meta-Link, um festzustellen, ob diesecho|sed
der akzeptierte Weg ist, um sed für Herausforderungen zu starten, die eine Regel ohne Eingabe aufrufen.R,
22 25 22 2018 BytesEdit: Vielen Dank an @Mego für den Hinweis, dass R die Tail-Call-Optimierung nicht unterstützt.
Edit4: Habe eine noch kürzere Lösung gefunden, die einfach und doch recht kompliziert ist.
Die Antwort verwendet die eingebaute boolesche Wahrheitsvariable,
T
die in der Wiederholungsschleife auf unbestimmte Zeit dekrementiert wird. Die Funktionls()
heißt jede Iteration, die alle Objekte in der aktuellen Umgebung auflistet. Das erste Argumentname
gibt jedoch an, aus welcher Umgebung Objekte aufgelistet werden sollen. Aus der R-Dokumentation entnehmen wir:Dies bedeutet hauptsächlich, dass wir in der ersten Iteration
ls(-1)
das zurückgeben würdencharacter(0)
(Standard, wenn versucht wird, auf das nicht vorhandeneeverything-except-the-first
Element eines beliebigen Zeichentypobjekts zuzugreifen ). Während der zweiten IterationT
wird um zwei dekrementiert und anschließend aufgerufen,ls(-3)
was wiederum den Fehler zurückgibt:Dies liegt daran, dass wir versuchen, ein
everything-except-the-third
Element aufzulisten, die lokale Umgebung jedoch nur die VariableT
zu diesem Zeitpunkt enthält (ls()
wodurch1
bei dieser Iteration eine Liste mit der Länge zurückgegeben wird), und ein Fehler zurückgegeben wird.quelle
Befunge-93, 3 Bytes (möglicherweise 1 oder 0)
Probieren Sie es online!
Bei der ersten Iteration der Schleife ist der Stapel leer, was allen Nullen entspricht. Die
!
(Nicht) -Operation wandelt somit den Stapelanfang in 1 um, und die%
(Modulo) -Operation berechnet 0 mod 1, wobei 0 übrig bleibt. Die nächste!
Operation wandelt diese 0 in eine 1 um, bevor der Programmzähler einen Zeilenumbruch vornimmt und die Schleife erneut beginnt.Bei der zweiten Iteration
!
konvertieren die ersten Operationen die 1, die sich jetzt oben auf dem Stapel befindet, in eine 0. Die%
Operation berechnet dann 0 mod 0, wodurch im Referenzinterpreter ein Fehler durch Null dividiert wird, und beendet somit das Programm.Es gibt auch die langweiligere 1-Byte-Antwort, obwohl ich nicht sicher bin, ob dies als gültig angesehen wird.
Probieren Sie es online!
Dieser
"
Befehl startet eine Zeichenkette, daher wird jedes Leerzeichen in der restlichen Zeile auf den Stapel geschoben, bis der Programmzähler auf das"
erneute Schließen der Zeichenkette stößt . Es muss dann ein zweites Mal gewickelt werden, um den Vorgang zu wiederholen, indem eine weitere Zeichenfolge gestartet und weitere 79 Leerzeichen auf den Stapel geschoben werden. Letztendlich wird entweder der Arbeitsspeicher knapp (das Verhalten des Referenzinterpreters) oder ein Stapelüberlauf erzeugt.Wenn Sie die Regeln wirklich durchsetzen möchten, gibt es auch technisch eine Null-Byte-Lösung.
Wenn Sie diese Regel so verstehen, dass jeder Dolmetscher die Sprache definiert (wie viele hier), können wir für den Moment davon ausgehen, dass die Befunge-Sprache von diesem Dolmetscher definiert wird . Und eines der "Merkmale" dieses Interpreters ist, dass er bei der Ausführung eines leeren Programms für jede Schleife des Spielfelds einen undefinierten Wert auf den Stapel legt. Wenn genügend Zeit zur Verfügung steht, wird der Arbeitsspeicher irgendwann ausgehen.
Wie schnell dies geschieht, hängt von der Geschwindigkeit des Computers, dem verfügbaren Speicher und dem verwendeten Browser ab. Auf meinem Computer hat Microsoft Edge am besten funktioniert, aber selbst dann waren nach zwei Minuten "nur" 500 MB belegt. Es dauerte ungefähr eine Viertelstunde, bis Edge entschied, den Vorgang abzubrechen und die Registerkarte zu aktualisieren. Es ist also unwahrscheinlich, dass es unter dem Zeitlimit von zwei Minuten gelingt, aber unter den richtigen Bedingungen, die nicht unbedingt in Frage kommen.
quelle
FALSE, 8 Bytes
Ich mag diese Sprache wirklich.
Dies drückt a
1
und[$][.]#
schleift dann , solange$
es wahr ist (Stapelanfang duplizieren) und (.
) gibt es aus. Dieser Interpreter stürzt ab, nachdem die Single1
gedruckt wurde (Beweis dafür, dass die Schleife mindestens einmal ausgeführt wird). Es scheint ein Fehler in diesem Interpreter zu sein. Das folgende 9-Byte-Programm sollte in allen kompatiblen Interpretern funktionieren:quelle
.
den Datenstapel leert, während in der zweiten Schleife$
versucht wird, das oberste Element des leeren Stapels zu duplizieren, was zu einem Fehler führen sollte (nun, mein Interpreter tut dies) ). Die zweite Version sollte nicht gültig sein, da sie nicht einmal die erste Schleife beendet, da sie bereits versucht, vorzeitig auf den leeren Stapel zuzugreifen.C, 21 Bytes
Hier
i
fängt garantiert an wie0
.Es kann bestätigt werden, dass dies einmal so läuft:
Was auf meinem Rechner zur Folge hat:
Die kürzeste rekursive Lösung, die ich finden kann, ist 22 Bytes :
gcc
erst ab Tail Call Elimination-O2
müssen wir eine Funktion aufrufenputs
, um zu verhindern, dass das Ganze wegoptimiert wird. Bestätigung, dass dies funktioniert:Das folgende Programm ist vollständig und setzt voraus, dass es mit 22 Byte ohne Befehlszeilenargumente aufgerufen wird :
das ist gleichbedeutend mit der Funktion der gleichen Länge:
quelle
MATLAB, 18 Bytes
Dies kann als Skript ausgeführt werden:
Die erste Iteration ist in Ordnung, da
j(1)
ist gerade1
. Die zweite Iteration stürzt mit einem außerhalb der Grenzen liegenden Fehler ab, derj(2)
die Abmessungenj
eines 1x1-Arrays überschreitet .Dies kann auch als Skript ausgeführt werden, funktioniert jedoch nur, wenn Sie es zum ersten Mal ausführen. Trotzdem ist es witzig genug, die vordefinierten Konstanten von MATLAB zu missbrauchen, so dass ich dachte, ich würde es einschließen. Es sind auch 18 Bytes.
Beim Ausführen in einem Arbeitsbereich, in dem die Variable
i
noch nicht definiert wurde, wird davoni
ausgegangen, dass es sich um die imaginäre Einheit handelti/i = 1
. In der ersten Schleife wird durch die Zuweisungi={}
ein leeres Zellenfeld mit dem Namen erstellti
. Bei der zweiten Iteration wird die Schleife mit "Undefinierter Operator '/' für Eingabeargumente vom Typ 'Zelle'" beendet.quelle
j(2)
normalerweise erhalten Sie eine 2-mal-2-Matrix mit0+1i
Perl 6 , 13 Bytes
Indiziert ein Integer-Literal in einer Endlosschleife.
Beruht auf der Tatsache, dass bei skalaren Werten die Array-Indizierungssyntax mit index verwendet werden kann
0
(wobei der Wert selbst zurückgegeben wird), aberIndex out of range
für jeden anderen Index ein Fehler ausgegeben wird.quelle
QBasic, 17 Bytes
Dieser Code ist sehr seltsam.
Wie es funktioniert
In QBasic werden Variablen vorinitialisiert. Eine reguläre Variable ohne
i
Typenzusatz wird wie hier auf Null vorinitialisiert.Es sei denn, Sie versuchen, diese Variable wie ein Array zu subskribieren. In diesem Fall handelt es sich um ein Array mit 11 Nullen. *
Auf das erste Mal durch die Schleife daher
i
ist0
unda
ist ein Array.a(i)
gibt das nullte Element des Arrays an (welches ist0
). Alles schön und gut. Wir macheni
eine11
Schleife. Aber jetzt11
ist kein gültiger Index für das Arraya
, und das Programm stoppt mitSubscript out of range
.Eine 19-Byte-Version, die besser zeigt, was los ist:
Dies wird
0
elf Mal gedruckt, bevor ein Fehler auftritt.* Konzeptionell handelt es sich um ein Array mit 10 Elementen. Die meisten Dinge in QBasic sind 1-indiziert, Arrays jedoch nicht, möglicherweise aus Implementierungsgründen. Damit die Dinge für Programmierer wie erwartet funktionieren, wirft QBasic einen zusätzlichen Eintrag ein, sodass Sie die Indizes 1 bis 10 verwenden können. Auf Index 0 kann jedoch weiterhin problemlos zugegriffen werden. Stelle dir das vor.
quelle
i=1+a(i)
?i=i+1+a(i)
. Andernfalls wird der Index nie höher1
, was kein Fehler ist.Haskell, 15 Bytes
f"a"
Läuft rekursiv durch die Zeichenfolge "a", indem das erste Zeichen gelöscht wird, und schlägt schließlich mit einerNon-exhaustive patterns in function f
Ausnahme am Ende fehl , da diesf
nur für nicht leere Zeichenfolgen definiert ist.quelle
C #,
7138 BytesDa Sie in C # ein Beispiel angegeben haben, hat hier eine andere Version Golf gespielt
Und danke an pinkfloydx33
Kürzer als
Parse.ToString()
und sogar alsParse($"{c--}")
ichchecked
es mir in den Kopf gesetzt habe, weil es ein zu langes Schlüsselwort war. Tough ist es sicherlich kürzer alsParse(c.ToString())
Ursprüngliche Antwort
Dies startet
c=0
und dekrementiert es dann, wennc=-1
dasuint.Parse
ein verursacht:Ungolfed-Version und Überprüfung dieser Schleife läuft mindestens einmal
quelle
for(int c=0;;)uint.Parse($"{c--}");
checked{for(uint c=1;;)c--;}
CJam , 4 Bytes
Probieren Sie es online!
Bei der ersten Iteration der leeren
{}g
Schleife wird die eingeblendet1
, die angibt , dass fortgefahren werden soll. Bei der zweiten Iteration wird versucht, eine andere Bedingung einzufügen, aber der Stapel ist leer, sodass das Programm abstürzt.quelle
x86-Assembly (AT & T-Syntax), 40 Byte
Deklariert eine Funktion f, die bei ihrer ersten Iteration 1 durch 1 teilt und dann versucht, 0 durch 0 und Fehler zu teilen.
quelle
CJam, 4 Bytes
P`
generiert den String3.141592653589793
.:~
wertet jedes Zeichen aus.3
ist ein gültiger Code in CJam, der einfach 3 zurückgibt..
Verursacht in der nächsten Iteration einen Fehler, da eine Ziffer oder ein darauf folgender Operator erforderlich ist.quelle
Rubin, 14 Bytes
Ausgänge wegen
ZeroDivisionError: divided by 0
$. The current input line number of the last file that was read
Ruby Docs
quelle
> <> 3 Bytes
Probieren Sie es hier aus!
Erläuterung
quelle
Batch,
2220 BytesErläuterung
Dies ist eine Endlosschleife, die
1
ein anfangs leeres Zeichen anhängt . Letztendlich wird dies die maximale Stringlänge von 8192 überschreiten und abstürzen. Auf meinem Computer dauert dies ungefähr 30 Sekunden.quelle
JavaScript, 9 Bytes
Dieser läuft einmal und wirft dann,
ReferenceError: i is not defined
was die Schleife stoppt.Ist das
<increment>
Ende des ersten Zyklus oder der Beginn des zweiten Zyklus am Beispiel des Folgenden ?Ich sehe es
Nach dem Wechsel von Zeile 0 zu Zeile 3 und dann zurück zu Zeile 0 fühlt es sich an, als wäre ein vollständiger Zyklus abgeschlossen.
Das wäre
<increment>
der Beginn des zweiten Zyklus.- Erster Zyklus:
<init>
-><test>
-><statement>
- Zweiter Zyklus:
<increment>
-><test>
-><statement>
2 /
While
ÄquivalentIn diesem Ersatz
while
das<increment>
ist das Ende des ersten Zyklus und es fühlt sich an wie es das gleiche mit dem istfor
.Das wäre
<increment>
das Ende des ersten Zyklus.- Erster Zyklus:
<test>
-><statement>
-><increment>
- Zweiter Zyklus:
<test>
-><statement>
-><increment>
3 / Eine Anweisung wird zweimal angetroffen
Ein vollständiger Zyklus ist abgeschlossen, wenn eine Anweisung zweimal auftritt.
Die erste Anweisung, die zweimal vorkommt, lautet
<test>
.Das wäre
<increment>
das Ende des ersten Zyklus.- Erster Zyklus:
<test>
-><statement>
-><increment>
- Zweiter Zyklus:
<test>
-><statement>
-><increment>
4 / Es ist ein Setup
Sie
<init>
richten nur das ein, was für den ersten Zyklus benötigt wird.Sie
<increment>
richten nur das ein, was für den zweiten Zyklus benötigt wird.Das wäre
<increment>
der Beginn des zweiten Zyklus.- Erster Zyklus:
<init as a setup>
-><test>
-><statement>
- Zweiter Zyklus:
<increment as a setup>
-><test>
-><statement>
Die ECMAScript® 2016-Sprachspezifikation
Laufzeit von
for(<init>;<test>;<increment>)<statement>;
Es gibt drei Formen, also habe ich die kürzeste hier genommen, es gibt keinen Unterschied:
- Was auch immer,
<init>
es ist nicht Teil der ersten Iteration.- Was relevant ist, ist in ForBodyEvaluation.
Details von ForBodyEvaluation (
<test>
,<increment>
,<statement>
, «», labelset)6 / Ich sehe es
Ein vollständiger Zyklus Ein vollständiger Lauf des Wiederholungsteils.
Das wäre
<increment>
das Ende des ersten Zyklus.- Erster Zyklus:
<test>
-><statement>
-><increment>
/ Mit anderen Worten von Zeile 3 bis Zeile 13- Zweiter Zyklus:
<test>
-><statement>
-><increment>
/ Mit anderen Worten von Zeile 3 bis Zeile 137 / Ein Zyklus ist eine Iteration
Ein Zyklus beginnt mit
CreatePerIterationEnvironment
.Wenn
CreatePerIterationEnvironment
also ein neuer Zyklus angetroffen wird, beginnt dieser und beendet den vorherigen.Das wäre
<increment>
der Beginn des zweiten Zyklus.- Erster Zyklus:
<test>
-><statement>
/ Mit anderen Worten von Zeile 1 bis Zeile 9- Zweiter Zyklus:
<increment>
-><test>
-><statement>
/ Mit anderen Worten von Zeile 10 bis Zeile 9 durchlaufenIst das
<increment>
das Ende des ersten Zyklus oder der Beginn des zweiten Zyklus?quelle
for(a;b;c)d;
ist in etwa gleichbedeutend mita;while(b){d;c;}
, ich bin geneigt zu sagen, dass der Fehler immer noch in der ersten Iteration ausgelöst wird (bevor die Schleifenbedingung ein zweites Mal überprüft wird).INTERCAL , 12 Bytes
Probieren Sie es online!
NEXT
ist der Hauptsteuerflussbefehl von INTERCAL-72. (Spätere Revisionen wurden eingeführtCOME FROM
, die bekannter wurden, aber nicht in der Originalversion der Sprache vorhanden waren. Alle abgeschlossenen INTERCAL-Implementierungen unterstützen dieNEXT
Abwärtskompatibilität, alle bis auf eine unterstützen sie standardmäßig. Also Ich habe nicht das Bedürfnis, INTERCAL-72 speziell im Titel zu nennen.)Wenn Sie
NEXT
zum Bilden einer Schleife verwenden, müssen SieRESUME
oderFORGET
verwenden, um den Speicherplatz freizugeben, der verwendet wird, um sich daran zu erinnern, wo sich das Programm befunden hat.RESUME
macht das rückwirkendNEXT
zu etwas, das einem Funktionsaufruf ähnelt (obwohl Sie von anderen Funktionen als der, in der Sie sich befinden, zurückkehren können), währendFORGET
es zu etwas macht, das einer GOTO-Anweisung ähnlicher ist. Wenn Sie dies auch nicht tun (und dieses Programm nicht), stürzt das Programm nach 80 Iterationen ab (dieses Verhalten ist tatsächlich in der INTERCAL-Spezifikation angegeben).Es ist etwas mehrdeutig, ob dies als unbegrenzte Rekursion gilt (in der Frage nicht zulässig); Sie können diese Art sicherlich verwenden
NEXT
, um einen Funktionsaufruf zu implementieren. In diesem Fall handelt es sich effektiv um eine rekursive Funktion, aber hier sind nicht genügend Informationen vorhanden, um zu bestimmen, ob ein Funktionsaufruf ausgeführt wird oder nicht. Zumindest poste ich dies trotzdem, weil es nicht eindeutig gegen die Regeln verstößt und eine INTERCAL-Implementierung, die den "Tail Call" optimiert, nicht nur gegen die Spezifikation verstößt, sondern auch die meisten existierenden Programme zum Absturz bringt, weil sie von zurückkehren Die "falsche Funktion" ist die Hauptmethode, um das Äquivalent einer IF-Anweisung zu erreichen.Hier ist die resultierende Fehlermeldung, die von C-INTERCAL generiert wurde:
(Beachten Sie, dass die zweite Zeile mit einem Tabulator eingerückt ist und die dritte mit acht Leerzeichen. Dies sieht in einem Terminal oder in so ziemlich jedem Programm, das Tabulatoren bei Vielfachen von 8 hat, korrekt aus. Markdown hat jedoch Tabulatoren bei Vielfachen von viertens, was gegen die Annahmen verstößt, die die meisten älteren Programme in Bezug auf Tabulatoren vertreten, so dass die Fehlermeldung hier etwas falsch formatiert ist.)
quelle
CORRECT SOURCE AND RESUBNIT
? Wie in einem Tippfehler in der ursprünglichen C-INTERCAL-Fehlermeldung?Pyth, 3 Bytes
Probieren Sie es online aus.
W1
ist nurwhile 1:
in Python. Der Schleifenkörper gibt eine aus STDIN gelesene Zeile aus, die bei der zweiten Iteration abstürzt, wenn der Code mit leerer Eingabe ausgeführt wird.Wenn Schleifen mit
#
(loop-until-error) gesperrt sind (ich nehme an), denke ich, dass dies die kürzeste ist, die es bekommen kann.quelle
Python 3, 29 Bytes
Ganz einfach. Beim zweiten Aufruf von x bin ich nicht da und Python beschwert sich darüber.
quelle
Labyrinth , 3 Bytes
Probieren Sie es online!
Wie die meisten 2D-Sprachen hat Labyrinth keine expliziten Schleifenkonstrukte. Stattdessen ist jeder Code, der so angeordnet ist, dass er mehrmals hintereinander ausgeführt wird, eine Schleife in diesen Sprachen. Für den Fall von Labyrinth fungiert ein einfaches lineares Programm als Schleife, da der Befehlszeiger darauf hin und her springt. Wenn das Programm
abc
(für einige Befehlea
,b
undc
), dann die tatsächliche Ausführung wirdabcbabcbabcb...
so läuft esabcb
in einer Endlosschleife.Warum dieses spezielle Programm bei der zweiten Iteration dieser Schleife abstürzt, erfahren Sie in den einzelnen Befehlen. Beachten Sie, dass der Labyrinth-Stapel unten eine implizite unendliche Anzahl von Nullen enthält:
quelle
Bash, 11 (Borderline nicht konkurrierend)
Dieses Skript wird rekursiv von selbst ausgeführt und
1
an die bei jeder Iteration übergebenen Argumente angehängt. Ich denke, dies zählt als Gesamtbetriebskosten (TCO), da Exec den Prozessraum wiederverwendet, aber keinen Stapel auffrisst. Es ist grenzwertig nicht konkurrierend, da es ungefähr 10 Minuten gedauert hat, bis es auf meiner Maschine - YMMV - getötet wurde.quelle
exec $0 1$@$@
endet viel schneller, ist aber zwei Zeichen länger.cmd, 34 bytes
Dies wechselt
%i
zwischen 0 und 10. Der (alte)color
Befehl akzeptiert gerne alle Argumente mit 2 (hexa-) Dezimalstellen. Mit dem Argument schlägt100
es fehl, die Hilfemeldung zu drucken undERRORLEVEL
auf 1 zu setzen.Beweis, dass die Schleife mindestens einmal läuft: Die Farbe Ihrer Muschel wird anders sein!
quelle