Twoim zadaniem jest napisanie pełny program lub funkcję, która pobiera żadnych wejściowe i uruchamia dowolny rodzaj pętli ( while
, for
, foreach
, do
, do-while
, do-loop
, goto
, rekursji, etc), które zakończą się w powodując błąd, co oznacza, że program musi zatrzymać się z systemem i wyjście.
Zasady:
- Błąd musi być błędem w czasie wykonywania, nieobsługiwanym wyjątkiem lub czymkolwiek, co powoduje, że program sam się kończy.
- Błąd musi powodować zatrzymanie i wyjście z programu bez wywoływania jawnego
exit;
(lub równoważnego) w pewnym momencie. - Komunikaty takie jak
Warning:
,Notice:
itp, które nie powodują program do końca sama nie obowiązują. Na przykład w działach PHP przez zero generujeWarning
komunikat, ale program się nie zatrzyma i nadal będzie działał, to nie jest poprawna odpowiedź. - Pętla musi przebiegać co najmniej jeden pełny cykl. Innymi słowy, błąd może się zdarzyć począwszy od drugiego cyklu i dalej. Ma to na celu uniknięcie spowodowania błędu przy użyciu niepoprawnej składni kodu: kod musi być poprawny pod względem składniowym.
- Pętla może być nawet nieskończona (przykład
for(;;);
), jeśli przestrzega powyższych zasad, ale nie może zająć więcej niż 2 minuty, aby zakończyć się błędem w czasie wykonywania. - Rekurencja bez optymalizacji wezwania ogona jest nieprawidłowa ( 1 , 2 ).
- To jest golf golfowy, więc wygrywa najkrótszy kod.
- Standardowe luki są zabronione.
Przykład C # ( test online ):
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
Tabela liderów:
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>
Podziękowania dla Martina Endera za fragment tabeli wyników
for(a;b;c)d;
, po którym stwierdzeniu kończy się pierwszy cykl? Czy ważne jest złamanie przy pierwszej oceniec
oświadczenia?a, b, d, c, b, d, c, ...
,b
jest początkiem cyklu i musi zostać uruchomiona co najmniej drugi raz.Odpowiedzi:
MATL ,
51 bajtPomysł zaczerpnięty z odpowiedzi CJam @ MartinEnder
Wypróbuj online!
Stara wersja
Wypróbuj online!
źródło
Python, 16 bajtów
Nieciekawe podejście z podziałem 0:
Pierwsza iteracja jest obliczana
1 / 1
, co działa dobrze. Druga iteracja próbuje obliczyć0 / 0
, powodującZeroDivisionError
wyrzucenie.17 bajtów (osobisty ulubiony)
Początkowo,
i=1
co jest prawdą, więc pętla jest wprowadzana.Przy pierwszym uruchomieniu pętli zmienna
i
jest usuwana.Oznacza to, że po raz drugi
i
nie jest już zmienną i dlatego jego ocena kończy się niepowodzeniemNameError: name 'i' is not defined.
Innym 15-bajtowym rozwiązaniem byłoby
def _():_()
(nowa linia)_()
, ponieważ Python nie optymalizuje rekurencji ogona. To jednak narusza zasadę nr 6.źródło
while i
sięwhile 1
, ponieważ próbuje usunąći
ponownie;del
sztuczki z wbudowanym ogolił trochę więcej:while 1:del id
.del id
nie działa. W ten sposób nie można usunąć wbudowanych plików .Galaretka ,
32 bajtyZabija się przez brak pamięci. Lokalnie robi to po ~ 100 sekundach.
Wypróbuj online! (akt zgonu w szufladzie debugowania )
Jak to działa
Pierwsze kilka iteracji daje:
Potem robi się naprawdę brzydko, naprawdę szybko.
źródło
V , 2 bajty
Wypróbuj online!
To idealne wyzwanie dla V, ponieważ już to robię przez cały czas! W rzeczywistości V nie ma nawet żadnych warunków, ma tylko funkcje, które psują się po błędzie. W tym przypadku
ò
oznacza „powtarzaj na zawsze” il
„ruszaj się w prawo”.W pustym buforze (bez danych wejściowych) spowoduje to przerwanie pierwszego przejścia i nie spowoduje wyjścia. Jeśli jest wejście, to pęknie, gdy przejdziemy po ostatnim znaku wejścia i wyprowadzimy wszystkie dane wejściowe (co czyni go również programem cat)
źródło
l
znaczy „ruszaj się w prawo”? Nie „przenieśćl
eft”?JavaScript (ES6), 13 bajtów
Jest to funkcja rekurencyjna, która raz działa poprawnie, a następnie rzuca
ReferenceError: a is not defined
i wychodzi.Oto 15-bajtowa wersja spoza ES6:
Działa to dobrze raz, a następnie rzuca
TypeError: i is undefined
i wychodzi.źródło
Bash 4.2, 22 bajty
Nie działa w TIO, ponieważ ma Bash 4.3, a błąd, na którym polegam, został w końcu naprawiony.
Weryfikacja
Występuje awaria, gdy program próbuje obliczyć 2 63 mod -1 , co ulega awarii w Bash 4.2 i starszych wersjach z powodu znanego błędu.
źródło
PHP,
22212018 bajtówZależy to od PHP, który pozwala nadać nazwę funkcji zmiennej i spróbować ją uruchomić.
To po prostu konkatenuje nazwę
pi
funkcji dwukrotnie. To zabija PHP za pomocąFatal Error: Uncaught Error: Call to undefined function pipi() in [...][...]
.Działa to podobnie do mojej starej odpowiedzi.
Stara odpowiedź, 20 bajtów
PHP pozwala inkrementować znaki za pomocą operatora inkrementacji. Działa tylko w
a-z
zakresie, ale wystarczy.Uważam, że spełnia to wszystkie wymagane punkty, a pętla działa raz.
Możesz sprawdzić, czy ponieważ otrzymasz błąd
Fatal error: Function name must be a string
.Jak to działa, krok po kroku:
pi
do$x
.Ponieważ
pi
jest używany jako stała, PHP sprawdzi, czy istnieje.Ponieważ tak nie jest, PHP wyświetla ostrzeżenie
Use of undefined constant pi - assumed 'pi'
(Zasadniczo: ponieważ stała nie istnieje, zakłada się, że jest to ciąg znaków)$x()
.Ponieważ
$x
ma wartośćpi
, uruchomi funkcjępi()
.$x
.$x
teraz ma π zamiastpi
$x()
.Ponieważ
$x
ma π, uruchomi funkcję3.14159...()
.Fatal Error
.Dzięki @Titus za znalezienie
pi()
funkcji, oszczędzając mi 1 bajt!źródło
$x
sięabt
zanim skończy ciało pętli. Możesz to naprawić, zwiększając wartość po pętli.for($x=abs;;++$x)echo$x,$x();
aby przetestować. Powinien pokazaćabs0abt Fatal error[...]
. Lub podobne.pi
zamiastabs
. To nawet nie daje ostrzeżenia, zanim doprowadzi to do zgonu._
jest zdefiniowana w niektórych systemach, ale jest zawodna. Ale dziękuję za znalezienie tego!GNU sed ,
15 135 bajtów-2 Dzięki seshoumara
-8 Dzięki Zeppelin
Szybko kończy się pamięć:
źródło
s:a\?:&a:g
? Jest to 1 bajt mniej i podwaja rozmiar wzoru na iterację.echo -n | sed 's:a\?:&a:g'
i nie otrzymałem danych wyjściowych. Byłoby to to samo,sed 's::a:'
co nie pasowałoby do niczego.echo -n
absolutnie nic nie przechodzi do sed, ale sed nie może zacząć bez wkładu z założenia. Sprawdź ten meta link, aby zobaczyć, żeecho|sed
jest to akceptowany sposób na rozpoczęcie sedna dla wyzwań wywołujących regułę braku danych wejściowych.R,
22 25 22 2018 bajtówEdycja: Podziękowania dla @Mego za zwrócenie uwagi, że R nie obsługuje optymalizacji wezwania ogona.
Edit4: Znaleziono jeszcze krótsze rozwiązanie, które jest proste, ale dość skomplikowane.
Odpowiedź korzysta z wbudowanej zmiennej boolean truey,
T
która jest zmniejszana w nieskończoność w powtarzającej się pętli. Funkcjals()
nazywana jest każdą iteracją, która wyświetla listę wszystkich obiektów w bieżącym środowisku. Jednak pierwszy argumentname
określa, z którego środowiska mają być wyświetlane obiekty. Z dokumentacji R wynika, że:Zasadniczo oznacza to, że w pierwszej iteracji uruchamiamy,
ls(-1)
która zwrócicharacter(0)
(standard przy próbie uzyskania dostępu do nieistniejącegoeverything-except-the-first
elementu dowolnego obiektu typu znakowego). Podczas drugiej iteracjiT
zmniejsza się o dwa, a następnie wywołujemy,ls(-3)
co z kolei zwraca błąd:Jest tak, ponieważ próbujemy wyświetlić
everything-except-the-third
element, ale środowisko lokalne zawiera tylko zmiennąT
w tym momencie (jako takie, zwróciłobyls()
listę długości1
w tej iteracji) i zwrócony został błąd.źródło
Befunge-93, 3 bajty (ewentualnie 1 lub 0)
Wypróbuj online!
Podczas pierwszej iteracji pętli stos jest pusty, co odpowiada ekwiwalentowi zer. Operacja
!
(nie) konwertuje zatem stos na górę na 1, a%
operacja (modulo) oblicza 0 mod 1, pozostawiając 0. Następny!
operacja konwertuje to 0 na 1, zanim licznik programu zawinie się i ponownie rozpocznie pętlę.W drugiej iteracji pierwsze
!
operacje konwertują 1, który jest teraz na górze stosu, na 0. The%
Operacja następnie oblicza 0 mod 0, co powoduje błąd dzielenia przez zero na interpreter referencyjny, a tym samym kończy działanie programu.Jest też nudniejsza odpowiedź 1-bajtowa, chociaż nie jestem pewien, czy jest to poprawne.
Wypróbuj online!
To
"
polecenie rozpoczyna ciąg, dlatego każde miejsce w pozostałej części wiersza jest wypychane na stos, dopóki licznik programu nie zawinie się i nie napotka"
ponownie zamknięcia łańcucha. Będzie musiał wtedy zawinąć się po raz drugi, aby powtórzyć proces rozpoczynając kolejny ciąg i wypychając kolejne 79 spacji na stos. W końcu zabraknie pamięci (zachowanie interpretera odniesienia) lub spowoduje przepełnienie stosu.Teraz, jeśli chcesz naprawdę przeforsować reguły, istnieje również technicznie zerowe rozwiązanie.
Jeśli przyjmiesz to orzeczenie w ten sposób, że dowolny tłumacz ustnie określa język (jak wielu tutaj), wówczas możemy założyć, że język Befunge jest zdefiniowany przez tego tłumacza . Jedną z „cech” tego interpretera jest to, że wypycha on niezdefiniowaną wartość na stos dla każdej pętli pola gry podczas wykonywania pustego programu. Przy wystarczającej ilości czasu zabraknie mu pamięci.
To, jak szybko to się stanie, będzie zależeć od szybkości komputera, dostępnej pamięci i używanej przeglądarki. Na moim komputerze stwierdziłem, że Microsoft Edge działał najlepiej, ale nawet wtedy „tylko” używał 500 MB po dwóch minutach. Dopiero około piętnastu minut (przy użyciu kilku gigabajtów) Edge zdecydował się zabić proces i odświeżyć kartę. Jest więc mało prawdopodobne, aby udało się to zrobić w terminie dwóch minut, ale przy odpowiednich warunkach, które niekoniecznie byłyby wykluczone.
źródło
FAŁSZ, 8 bajtów
Naprawdę podoba mi się ten język.
Powoduje to wypchnięcie a
1
, a następnie[$][.]#
zapętla się, gdy$
jest prawdą (duplikat góry stosu) i (.
) wyprowadza go. Ten interpreter ulega awarii po1
wydrukowaniu singla (dowód na to, że pętla działa co najmniej raz). Wygląda na to, że w tym tłumaczu jest błąd. Poniższy 9-bajtowy program powinien działać we wszystkich zgodnych tłumaczach:źródło
.
opróżnia stos danych, podczas gdy w drugiej pętli$
próbuje zduplikować górny element pustego stosu, co powinno prowadzić do błędu (cóż, mój interpreter robi ). Druga wersja nie powinna być poprawna, ponieważ nawet nie kończy pierwszej pętli, ponieważ już próbuje przedwcześnie uzyskać dostęp do pustego stosu.C, 21 bajtów
Tutaj na
i
pewno zaczniesz jako0
.Można potwierdzić, że działa to raz tak:
Co na moim komputerze powoduje:
Najkrótsze rekurencyjne rozwiązanie, jakie mogę znaleźć, to 22 bajty :
gcc
eliminuje tylko wywołanie ogonowe na poziomie-O2
wyższym lub wyższym, w którym to momencie musimy wywołać funkcję taką,puts
aby zapobiec optymalizacji całej rzeczy. Potwierdzenie, że to działa:Oto pełny program, który zakłada, że jest wywoływany bez argumentów wiersza poleceń, o wielkości 22 bajtów :
co jest równoważne funkcji o tej samej długości:
źródło
MATLAB, 18 bajtów
Można to uruchomić jako skrypt:
Pierwsza iteracja jest w porządku, ponieważ
j(1)
jest słuszna1
. Druga iteracja ulega awarii z błędem tablicy poza zakresem, ponieważj(2)
przekracza ona wymiaryj
, czyli tablicę 1x1.Można to również uruchomić jako skrypt, ale działa tylko przy pierwszym uruchomieniu. Mimo to jest wystarczająco zabawne nadużywanie predefiniowanych stałych MATLAB-a, że myślałem, że je uwzględnię. Ma również 18 bajtów.
Przy uruchomieniu w obszarze roboczym, w którym zmienna
i
nie została jeszcze zdefiniowana, zakłada się, żei
jest to jednostka urojona, więci/i = 1
. W pierwszej pętli przypisaniei={}
tworzy pustą tablicę komórek o nazwiei
. W drugiej iteracji pętla kończy się na „Niezdefiniowany operator” / „dla argumentów wejściowych typu„ komórka ”.źródło
j(2)
normalnie dałbyś macierz 2 na 2 z0+1i
Perl 6 , 13 bajtów
Indeksuje literał całkowity w nieskończonej pętli.
Opiera się na fakcie, że w przypadku wartości skalarnych można używać składni indeksowania tablicy z indeksem
0
(zwracając samą wartość), ale generujeIndex out of range
błąd dla dowolnego innego indeksu.źródło
QBasic, 17 bajtów
Ten kod jest bardzo dziwny.
Jak to działa
W QBasic zmienne są wstępnie inicjowane. Zmienna regularna bez żadnego przyrostka typu, jak
i
tutaj, jest wstępnie inicjowana na zero.Z wyjątkiem sytuacji, gdy spróbujesz zapisać się do tej zmiennej jak tablica ... w takim przypadku jest to tablica 11 zer. *
Dlatego po raz pierwszy w pętli
i
jest0
ia
jest tablicą.a(i)
daje zerowy element tablicy (który jest0
). Wszystko dobrze i dobrze. Ustawiamyi
na11
i zapętlamy. Ale teraz11
nie jest prawidłowym indeksem dla tablicya
, a program zatrzymuje się naSubscript out of range
.19-bajtowa wersja, która lepiej pokazuje, co się dzieje:
Zostanie wydrukowany
0
jedenaście razy, zanim popełni błąd.* Koncepcyjnie jest to 10-elementowa tablica. Większość rzeczy w QBasic ma indeks 1, ale tablice nie są, prawdopodobnie z powodów implementacyjnych. Aby wszystko działało zgodnie z oczekiwaniami dla programistów, QBasic dodaje dodatkowy wpis, dzięki czemu można używać indeksów od 1 do 10. Indeks 0 jest jednak nadal doskonale dostępny. Domyśl.
źródło
i=1+a(i)
?i=i+1+a(i)
. W przeciwnym razie indeks nigdy nie wzrośnie powyżej1
, co nie jest błędem.Haskell, 15 bajtów
f"a"
uruchamia rekurencyjnie ciąg „a”, upuszczając pierwszy znak i ostatecznie kończy się niepowodzeniem na końcu zNon-exhaustive patterns in function f
wyjątkiem, ponieważf
jest zdefiniowany tylko dla niepustych ciągów.źródło
C #,
7138 bajtówPonieważ podałeś przykład w C # tutaj inna gra w golfa
I dzięki pinkfloydx33
Niższy niż
Parse.ToString()
nawetParse($"{c--}")
mentalnie porzuconychecked
ponieważ jest on zbyt długi dla słowa kluczowego. Trudne to z pewnością jest krótsze niżParse(c.ToString())
Oryginalna odpowiedź
Spowoduje to uruchomienie
c=0
następnie zmniejszyć je, gdy spowoduje an:c=-1
uint.Parse
Wersja bez golfa i sprawdzanie, czy pętla działa co najmniej raz
źródło
for(int c=0;;)uint.Parse($"{c--}");
checked{for(uint c=1;;)c--;}
CJam , 4 bajty
Wypróbuj online!
Pierwsza iteracja pustej
{}g
pętli wyskakuje1
, co każe jej kontynuować. Druga iteracja próbuje wyskoczyć z innego warunkowego, ale stos jest pusty, więc program ulega awarii.źródło
Zestaw x86 (składnia AT&T), 40 bajtów
Deklaruje funkcję f, która dzieli pierwszą przez 1 iterację, a następnie próbuje podzielić 0 przez 0 i błędy.
źródło
CJam, 4 bajty
P`
generuje ciąg3.141592653589793
.:~
ocenia każdą postać.3
jest poprawnym kodem w CJam, który po prostu zwraca 3. W następnej iteracji.
powoduje błąd, ponieważ wymaga cyfry lub następującego po nim operatora.źródło
Ruby, 14 bajtów
Wyjścia z powodu
ZeroDivisionError: divided by 0
$. The current input line number of the last file that was read
Ruby Docs
źródło
> <> , 3 bajty
Wypróbuj tutaj!
Wyjaśnienie
źródło
Partia,
2220 bajtówWyjaśnienie
Jest to nieskończona pętla, która dołącza
1
do początkowo pustego łańcucha. W końcu minie maksymalna długość ciągu 8192 i nastąpi awaria. Na moim komputerze zajmuje to około 30 sekund.źródło
JavaScript, 9 bajtów
Działa to raz, a następnie wyrzuca,
ReferenceError: i is not defined
co zatrzymuje pętlę.Biorąc za przykład następujące,
<increment>
czy koniec pierwszego cyklu czy początek drugiego cyklu?1 / Widzę to
Po przejściu z linii 0 do linii 3, a następnie z powrotem do linii 0, wydaje się, że pełny cykl został zakończony.
To byłby
<increment>
początek drugiego cyklu.- Pierwszy cykl:
<init>
-><test>
-><statement>
- Drugi cykl:
<increment>
-><test>
-><statement>
2 /
While
ekwiwalentW tym równoważnej
while
The<increment>
koniec pierwszego cyklu i wydaje się, jakby to samo zfor
.To byłby
<increment>
koniec pierwszego cyklu.- Pierwszy cykl:
<test>
-><statement>
-><increment>
- Drugi cykl:
<test>
-><statement>
-><increment>
3 / Instrukcja pojawia się dwa razy
Pełny cykl kończy się, gdy instrukcja zostanie napotkana dwukrotnie.
Pierwsza napotkana instrukcja dwukrotnie
<test>
.To byłby
<increment>
koniec pierwszego cyklu.- Pierwszy cykl:
<test>
-><statement>
-><increment>
- Drugi cykl:
<test>
-><statement>
-><increment>
4 / To konfiguracja
Po
<init>
prostu ustawia wszystko, co jest potrzebne do pierwszego cyklu.Po
<increment>
prostu ustawia wszystko, co jest potrzebne do drugiego cyklu.To byłby
<increment>
początek drugiego cyklu.- Pierwszy cykl:
<init as a setup>
-><test>
-><statement>
- Drugi cykl:
<increment as a setup>
-><test>
-><statement>
Specyfikacja języka ECMAScript® 2016
Czas działania
for(<init>;<test>;<increment>)<statement>;
Istnieją trzy formy, więc wybrałem tutaj najkrótszą, nie ma różnicy:
- Cokolwiek
<init>
to nie jest częścią pierwszej iteracji.- To, co jest istotne, znajduje się w ForBodyEvaluation.
Szczegóły ForBodyEvaluation (
<test>
,<increment>
,<statement>
, «», labelSet)6 / Widzę to
Pełny cykl pełny cykl powtarzania części.
To byłby
<increment>
koniec pierwszego cyklu.- Pierwszy cykl:
<test>
-><statement>
-><increment>
/ Innymi słowy od linii 3 do linii 13- Drugi cykl:
<test>
-><statement>
-><increment>
/ Innymi słowy od linii 3 do linii 137 / Cykl jest iteracją
Cykl zaczyna się od
CreatePerIterationEnvironment
.Kiedy więc się pojawia
CreatePerIterationEnvironment
, rozpoczyna się nowy cykl, kończąc w ten sposób poprzedni.To byłby
<increment>
początek drugiego cyklu.- Pierwszy cykl:
<test>
-><statement>
/ Innymi słowy od linii 1 do linii 9- Drugi cykl:
<increment>
-><test>
-><statement>
/ Innymi słowy od linii 10 pętli do linii 9Czy
<increment>
koniec pierwszego cyklu czy początek drugiego cyklu?źródło
for(a;b;c)d;
jest to mniej więcej odpowiednika;while(b){d;c;}
, jestem skłonny powiedzieć, że błąd jest nadal zgłaszany w pierwszej iteracji (przed sprawdzeniem warunku pętli po raz drugi).INTERCAL , 12 bajtów
Wypróbuj online!
NEXT
jest głównym poleceniem przepływu sterowania INTERCAL-72. (Wprowadzono późniejsze wersjeCOME FROM
, które stały się bardziej znane, ale nie było ich w oryginalnej wersji języka; i wszystkie zakończone implementacje INTERCAL Jestem świadomy wsparciaNEXT
dla kompatybilności wstecznej, a wszystkie oprócz jednej domyślnie ją obsługują. Więc Nie czuję potrzeby, aby w tytule wymieniać INTERCAL-72).Podczas
NEXT
tworzenia pętli należy użyćRESUME
lubFORGET
w celu zwolnienia miejsca, które wykorzystuje do zapamiętania, gdzie był program;RESUME
z mocą wstecznąNEXT
zamienia to w coś podobnego do wywołania funkcji (chociaż możesz powrócić z funkcji innych niż ta, w której się znajdujesz), podczasFORGET
gdy zamienia to w coś bardziej podobnego do instrukcji GOTO. Jeśli tego nie zrobisz (a ten program nie), program ulegnie awarii po 80 iteracjach (takie zachowanie jest faktycznie określone w specyfikacji INTERCAL).Niejednoznaczne jest, czy liczy się to jako nieograniczona rekurencja (niedozwolone w pytaniu); z pewnością możesz użyć tego rodzaju
NEXT
do zaimplementowania wywołania funkcji, w którym to przypadku byłaby to funkcja rekurencyjna, ale nie ma tu wystarczających informacji, aby ustalić, czy wykonujemy wywołanie funkcji, czy nie. Przynajmniej i tak to publikuję, ponieważ nie narusza to jednoznacznie reguł, a implementacja INTERCAL, która zoptymalizowała „wywołanie ogonowe”, nie tylko naruszyłaby specyfikację, ale także spowodowałaby awarię większości istniejących programów, ponieważ powrót z „zła funkcja” jest głównym sposobem wykonania odpowiednika instrukcji JEŻELI.Oto wynikowy komunikat o błędzie wygenerowany przez C-INTERCAL:
(Zauważ, że druga linia jest wcięta tabulatorem, a trzecia ośmioma spacjami. Wygląda to poprawnie w terminalu lub w prawie każdym programie, który ma tabulatory w wielokrotnościach 8. Jednak Markdown ma tabulatory w wielokrotnościach cztery, co narusza założenia większości starszych programów dotyczące kart, więc komunikat o błędzie jest tutaj nieco zniekształcony).
źródło
CORRECT SOURCE AND RESUBNIT
? Jak w literówce w oryginalnym komunikacie o błędzie C-INTERCAL?Pyth, 3 bajty
Wypróbuj online.
W1
jest tylkowhile 1:
w Pythonie. Ciało pętli drukuje wiersz odczytany ze STDIN, który ulega awarii dla drugiej iteracji, gdy kod jest uruchamiany z pustym wejściem.Jeśli pętle używające
#
(loop-till-error) są zbanowane (zakładam, że tak), myślę, że jest to najkrótszy możliwy.źródło
Python 3, 29 bajtów
Naprawdę proste. Przy drugim wywołaniu do x nie ma mnie i Python narzeka na to.
źródło
Labirynt , 3 bajty
Wypróbuj online!
Podobnie jak większość języków 2D, Labirynt nie ma żadnych wyraźnych konstrukcji pętli. Zamiast tego każdy kod, który jest tak ułożony, że jest wykonywany wiele razy z rzędu, jest pętlą w tych językach. W przypadku Labiryntu prosty program liniowy działa jak pętla, ponieważ wskaźnik instrukcji będzie się na nim podskakiwał. Jeśli program jest
abc
(dla niektórych poleceńa
,b
ac
), wówczas rzeczywista realizacja będzieabcbabcbabcb...
tak, że działaabcb
w nieskończonej pętli.Jeśli chodzi o to, dlaczego ten konkretny program ulega awarii podczas drugiej iteracji tej pętli, oto, co robią poszczególne polecenia. Zauważ, że stos Labiryntu zawiera ukrytą nieskończoną liczbę zer na dole:
źródło
Bash, 11 (Granica niekonkurująca)
Ten skrypt rekurencyjnie wykonuje się, dołączając
1
do argumentów przekazywanych przy każdej iteracji. Myślę, że liczy się to jako całkowity koszt posiadania, ponieważ exec ponownie wykorzystuje przestrzeń procesu, ale nie zużywa stosu. Jest to granica niekonkurencyjna, ponieważ zabicie na mojej maszynie - YMMV, trwało około 10 minut.źródło
exec $0 1$@$@
kończy się znacznie szybciej, ale ma dwa znaki dłużej.cmd, 34 bajty
Będzie to cyklicznie
%i
od 0 do 10. Polecenie (starożytne)color
z radością przyjmie każdy argument, który ma 2 (szesnastkowo) cyfry dziesiętne. Z argumentem100
nie powiedzie się, drukując komunikat pomocy i ustawiającERRORLEVEL
na 1.Dowód, że pętla działa co najmniej raz: Kolor twojej powłoki będzie inny!
źródło