Su tarea es escribir un programa completo o función que no toma en entrada y ejecuta cualquier tipo de bucle ( while
, for
, foreach
, do
, do-while
, do-loop
, goto
, recursividad, etc) que terminará en la causa de un error, lo que significa que el programa debe pararse en ejecución y salida.
Reglas:
- El error debe ser un error en tiempo de ejecución, una excepción no controlada o cualquier cosa que haga que el programa finalice por sí mismo.
- El error debe producir la detención y la salida del programa sin llamar explícitamente
exit;
(o equivalente) en algún momento. - Los mensajes como
Warning:
,Notice:
etc., que no provocan que el programa finalice por sí solo no son válidos. Por ejemplo, en PHP, las divisiones por cero producen unWarning
mensaje, pero el programa no se detendrá y seguirá ejecutándose, esta no es una respuesta válida. - El bucle debe ejecutar al menos un ciclo completo. En otras palabras, el error puede ocurrir a partir del segundo ciclo y más. Esto es para evitar causar el error usando una sintaxis de código incorrecta: el código debe ser sintácticamente correcto.
- El bucle puede ser incluso infinito (ejemplo
for(;;);
) si respeta las reglas mencionadas anteriormente, pero no debe tomar más de 2 minutos para terminar en un error de tiempo de ejecución. - La recursión sin optimización de llamadas de cola no es válida ( 1 , 2 ).
- Este es el código de golf, por lo que gana el código más corto.
- Las lagunas estándar están prohibidas.
Ejemplo de C # ( prueba en línea ):
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
Tabla de clasificación:
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>
Gracias a Martin Ender por el fragmento de la tabla de posiciones
for(a;b;c)d;
, ¿después de qué declaración termina el primer ciclo? ¿Es válido interrumpir en la primera evaluación de lac
declaración?a, b, d, c, b, d, c, ...
,b
es el inicio del ciclo, y debe ejecutarse al menos una segunda vez.Respuestas:
MATL ,
51 byteIdea tomada de la respuesta CJam de @ MartinEnder
Pruébalo en línea!
Versión antigua
Pruébalo en línea!
fuente
Python, 16 bytes
El enfoque de división 0 no interesante:
La primera iteración calcula
1 / 1
, que funciona bien. La segunda iteración intenta calcular0 / 0
, lo que resulta en unZeroDivisionError
lanzamiento.17 bytes (favorito personal)
Inicialmente, lo
i=1
cual es verdadero, por lo que se ingresa el ciclo.La primera vez que se ejecuta el ciclo, la variable
i
se elimina.Esto significa que, la segunda vez,
i
ya no es una variable y, por lo tanto, su evaluación falla conNameError: name 'i' is not defined.
Otra solución de 15 bytes sería
def _():_()
(nueva línea)_()
, porque Python no optimiza la recursividad de cola. Sin embargo, esto viola la regla # 6.fuente
while i
conwhile 1
porque intenta eliminari
nuevamente;del
truco con un built-in para cortar un poco más:while 1:del id
.del id
no funciona. No puede eliminar los builtins de esa manera .Jalea ,
32 bytesSe suicida al quedarse sin memoria. Localmente lo hace después de ~ 100 segundos.
Pruébalo en línea! (certificado de defunción en el cajón de depuración )
Cómo funciona
Las primeras iteraciones producen:
Después de eso, se pone muy feo, muy rápido.
fuente
V , 2 bytes
Pruébalo en línea!
¡Este es el desafío perfecto para V porque ya lo hago todo el tiempo! De hecho, V ni siquiera tiene condicionales, solo tiene funciones que se rompen en caso de error. En este caso, los
ò
medios "repetir para siempre" y losl
medios "moverse hacia la derecha".En un búfer vacío (sin entrada), esto se romperá en la primera pasada y no producirá salida. Si no es de entrada, se romperá una vez que avanzamos publicar el último carácter de entrada y salida de la totalidad de la entrada (haciendo esto también un programa de gato)
fuente
l
significa "moverse a la derecha"? No "moverl
eft"?JavaScript (ES6), 13 bytes
Esta es una función recursiva que funciona bien una vez, luego se lanza
ReferenceError: a is not defined
y se cierra.Aquí hay una versión de 15 bytes que no es ES6:
Esto funciona bien una vez, luego se tira
TypeError: i is undefined
y se cierra.fuente
Bash 4.2, 22 bytes
No funciona en TIO porque tiene Bash 4.3, y el error en el que confío finalmente se solucionó.
Verificación
Esto se bloquea una vez que el programa intenta calcular 2 63 mod -1 , que se bloquea en Bash 4.2 y versiones anteriores debido a un error conocido.
fuente
PHP,
22212018 bytesEsto se basa en PHP que le permite a uno dar un nombre de función a una variable e intentar ejecutarlo.
Esto simplemente concatena el nombre de la
pi
función dos veces. Esto mata PHP con aFatal Error: Uncaught Error: Call to undefined function pipi() in [...][...]
.Esto funciona de manera similar a mi vieja respuesta.
Respuesta anterior, 20 bytes
PHP le permite incrementar caracteres, utilizando el operador de incremento. Solo funciona en el
a-z
rango, pero es suficiente.Creo que esto cumple con todos los puntos requeridos y el ciclo se ejecuta una vez.
Puede ver si obtendrá el error
Fatal error: Function name must be a string
.Cómo funciona esto, paso a paso:
pi
a$x
.Como
pi
se está utilizando como una constante, PHP verificará si existe.Como no es así, PHP muestra una advertencia que dice
Use of undefined constant pi - assumed 'pi'
(Básicamente: dado que la constante no existe, se supone que es una cadena)$x()
.Como
$x
tiene el valorpi
, ejecutará la funciónpi()
.$x
.$x
ahora tiene π, en lugar depi
$x()
.Como
$x
tiene π, ejecutará la función3.14159...()
.Fatal Error
.¡Gracias a @Titus por encontrar la
pi()
función, ahorrándome 1 byte!fuente
$x
aabt
antes de que el cuerpo del bucle se ejecuta. Podrías arreglar eso incrementando después del ciclo.for($x=abs;;++$x)echo$x,$x();
para probar. Debería mostrarloabs0abt Fatal error[...]
. O similar.pi
lugar deabs
. Eso ni siquiera da una advertencia antes de arrojar lo fatal._
está definida en algunos sistemas, pero no es confiable. Pero gracias por encontrar eso!GNU sed ,
15 135 bytes-2 Gracias a seshoumara
-8 Gracias a zeppelin
Esto rápidamente se queda sin memoria:
fuente
s:a\?:&a:g
? Es 1 byte menos y duplica el tamaño del patrón por iteración también.echo -n | sed 's:a\?:&a:g'
y no obtuvo salida. Sería lo mismosed 's::a:'
que no coincidiría con nada.echo -n
absolutamente nada se pasa a sed, pero sed no puede comenzar sin entrada por diseño. Verifique este metaenlace para ver que esaecho|sed
es la forma aceptada de iniciar sed para los desafíos que invocan una regla de no entrada.R,
22 25 22 2018 bytesEditar: Gracias a @Mego por señalar que R no admite la optimización de llamadas de cola.
Edit4: encontré una solución aún más corta que es simple pero bastante compleja.
La respuesta utiliza la variable de verdad booleana incorporada,
T
que se disminuye indefinidamente en el ciclo de repetición. La funciónls()
se llama cada iteración que enumera todos los objetos en el entorno actual. Sin embargo, el primer argumentoname
especifica desde qué entorno desde el cual listar objetos. De la documentación R encontramos que:Esto significa principalmente que en la primera iteración ejecutamos
ls(-1)
lo que devolveríacharacter(0)
(estándar cuando se intenta acceder aleverything-except-the-first
elemento inexistente de cualquier objeto de tipo de carácter). Durante la segunda iteración,T
se disminuye por dos y posteriormente llamamos, lols(-3)
que a su vez devuelve el error:Esto se debe a que intentamos enumerar el
everything-except-the-third
elemento, pero el entorno local solo contiene la variableT
en este punto (como tal,ls()
devolvería una lista de longitud1
en esta iteración) y se devuelve un error.fuente
Befunge-93, 3 bytes (posiblemente 1 o 0)
Pruébalo en línea!
En la primera iteración del bucle, la pila está vacía, lo que equivale a todos los ceros. La
!
operación (no) convierte la parte superior de la pila en 1, y la%
operación (módulo) calcula 0 mod 1, dejando 0. La siguiente!
operación convierte ese 0 en 1 antes de que el contador del programa se enrolle y comience el ciclo nuevamente.En la segunda iteración, las primeras
!
operaciones convierten el 1 que ahora está en la parte superior de la pila a 0. La%
operación calcula 0 mod 0, que produce una división por cero error en el intérprete de referencia, y así termina el programa.También está la respuesta más aburrida de 1 byte, aunque no estoy seguro de si esto se considera válido.
Pruébalo en línea!
Este
"
comando inicia una cadena, por lo tanto, cada espacio en el resto de la línea se inserta en la pila hasta que el contador del programa se enrolla y encuentra el"
cierre de la cadena nuevamente. Luego tendrá que ajustarse una segunda vez para repetir el proceso comenzando otra cadena y empujando otros 79 espacios en la pila. Eventualmente, esto se quedará sin memoria (el comportamiento del intérprete de referencia) o producirá un desbordamiento de la pila.Ahora, si realmente quiere impulsar las reglas, técnicamente también existe una solución de cero bytes.
Si se toma esta decisión en el sentido de que cualquier intérprete define el lenguaje (como muchos aquí hace), entonces podemos suponer por un momento que el lenguaje Befunge se define por este intérprete . Y una de las "características" de ese intérprete es que empuja un valor Indefinido en la pila para cada bucle del campo de juego cuando ejecuta un programa en blanco. Dado el tiempo suficiente, eventualmente se quedará sin memoria.
La rapidez con que eso ocurra dependerá de la velocidad de la computadora, la memoria disponible y el navegador utilizado. En mi máquina descubrí que Microsoft Edge funcionaba mejor, pero aun así era "solo" usando 500 MB después de dos minutos. No fue hasta alrededor de los quince minutos (con varios gigabytes utilizados) que Edge decidió matar el proceso y actualizar la pestaña. Por lo tanto, es poco probable que sea por debajo del límite de tiempo de dos minutos, pero con las condiciones adecuadas que no estarían necesariamente fuera de discusión.
fuente
FALSO, 8 bytes
Realmente me gusta este lenguaje.
Esto empuja a
1
, luego se repite[$][.]#
mientras$
es verdadero (duplicar la parte superior de la pila) y (.
) lo genera. Este intérprete se bloquea después de que1
se imprime el single (evidencia de que el bucle se ejecuta al menos una vez). Parece ser un error en este intérprete. El siguiente programa de 9 bytes debería funcionar en todos los intérpretes compatibles:fuente
.
vacía la pila de datos, mientras que en el segundo bucle$
intenta duplicar el elemento superior de la pila vacía, lo que debería conducir a un error (bueno, mi intérprete hace ) La segunda versión no debería ser válida porque ni siquiera termina el primer ciclo porque ya intenta acceder a la pila vacía antes de tiempo.C, 21 bytes
Aquí
i
está garantizado comenzar como0
.Se puede confirmar que esto se ejecuta una vez así:
Lo cual, en mi máquina, resulta en:
La solución recursiva más corta que puedo encontrar es de 22 bytes :
gcc
solo elimina la llamada de cola en-O2
o más alto, en ese punto necesitamos llamar a una función comoputs
para evitar que todo se optimice. Confirmación de que esto funciona:El siguiente es un programa completo, que supone que se llama sin argumentos de línea de comando, a 22 bytes :
que es equivalente a la función de la misma longitud:
fuente
MATLAB, 18 bytes
Esto se puede ejecutar como un script:
La primera iteración está bien, ya que
j(1)
es justa1
. La segunda iteración se bloquea con un error de matriz fuera de límites, ya quej(2)
excede las dimensiones dej
, que es una matriz 1x1.Esto también se puede ejecutar como un script, pero solo funciona la primera vez que lo ejecuta. Aún así, es un abuso lo suficientemente hilarante de las constantes predefinidas de MATLAB que pensé que lo incluiría. También es de 18 bytes.
Cuando se ejecuta en un espacio de trabajo en el que la variable
i
aún no se ha definido, esto supone quei
es la unidad imaginaria, entoncesi/i = 1
. En el primer bucle, la asignacióni={}
crea una matriz de celdas vacía llamadai
. En la segunda iteración, el ciclo sale con "Operador indefinido '/' para argumentos de entrada de tipo 'celda'".fuente
j(2)
normalmente dará una matriz de 2 por 2 con0+1i
Perl 6 , 13 bytes
Indiza un literal entero en un bucle infinito.
Se basa en el hecho de que en los valores escalares, la sintaxis de indexación de matriz se puede usar con el índice
0
(devolviendo el valor en sí), pero arroja unIndex out of range
error para cualquier otro índice.fuente
QBasic, 17 bytes
Este código es muy raro.
Cómo funciona
En QBasic, las variables se preinicializan. Una variable regular sin ningún tipo de sufijo, como
i
aquí, se preinicializa a cero.Excepto si intenta subíndice en esa variable como una matriz ... en cuyo caso, es una matriz de 11 ceros. *
Por primera vez a través del ciclo, por lo tanto,
i
es0
ya
es una matriz.a(i)
da el elemento cero de la matriz (que es0
). Todo bien y bien. Nos ponemosi
a11
y bucle. Pero ahora11
no es un índice válido para la matriza
, y el programa se detiene conSubscript out of range
.Una versión de 19 bytes que muestra mejor lo que está sucediendo:
Esto se imprimirá
0
once veces antes de equivocarse.* Conceptualmente, es una matriz de 10 elementos. La mayoría de las cosas en QBasic están indexadas en 1, pero las matrices no, posiblemente por razones de implementación. Para que las cosas funcionen como se espera para los programadores, QBasic agrega una entrada adicional para que pueda usar los índices 1 a 10. Sin embargo, el índice 0 sigue siendo perfectamente accesible. Imagínate.
fuente
i=1+a(i)
?i=i+1+a(i)
. De lo contrario, el índice nunca sube1
, lo cual no es un error.Haskell, 15 bytes
f"a"
se ejecuta recursivamente a través de la cadena "a" al soltar el primer carácter y finalmente falla al final con unaNon-exhaustive patterns in function f
excepción, porquef
solo se define para cadenas no vacías.fuente
C #,
7138 bytesDado que proporcionó un ejemplo en C # aquí, otra versión de golf
Y gracias a pinkfloydx33
Más corto que
Parse.ToString()
e incluso queParse($"{c--}")
me tiró mentalmentechecked
por ser una palabra clave demasiado larga. Resistente, ciertamente es más corto queParse(c.ToString())
Respuesta original
Esto iniciará
c=0
luego disminuirlo, cuandoc=-1
lauint.Parse
va a causar una:Versión sin golf y verificar que el ciclo se ejecuta al menos una vez
fuente
for(int c=0;;)uint.Parse($"{c--}");
checked{for(uint c=1;;)c--;}
CJam , 4 bytes
Pruébalo en línea!
La primera iteración del
{}g
bucle vacío muestra el1
, que le dice que continúe. La segunda iteración intenta hacer aparecer otro condicional, pero la pila está vacía, por lo que el programa se bloquea.fuente
Ensamblado x86 (sintaxis AT&T), 40 bytes
Declara una función f que divide 1 por 1 en su primera iteración y luego intenta dividir 0 por 0 y errores.
fuente
CJam, 4 bytes
P`
genera la cadena3.141592653589793
.:~
evalúa cada personaje.3
es un código válido en CJam que simplemente devuelve 3. En la siguiente iteración,.
causa un error porque requiere un dígito o un operador que lo siga.fuente
Rubí, 14 bytes
Salidas por
ZeroDivisionError: divided by 0
$. The current input line number of the last file that was read
Ruby Docs
fuente
> <> , 3 bytes
Pruébalo aquí!
Explicación
fuente
Lote,
2220 bytesExplicación
Este es un bucle infinito que agrega un
1
a una cadena inicialmente vacía. Eventualmente, esto pasará la longitud máxima de cadena de 8192 y se bloqueará. En mi máquina, esto lleva unos 30 segundos.fuente
JavaScript, 9 bytes
Esto se ejecuta una vez, luego arroja lo
ReferenceError: i is not defined
que detiene el bucle.Tomando lo siguiente como ejemplo, ¿es el
<increment>
final del primer ciclo o el comienzo del segundo ciclo?1 / lo veo
Después de pasar de las líneas 0 a la línea 3 y luego volver a la línea 0, parece que se ha completado un ciclo completo.
Eso haría
<increment>
el comienzo del segundo ciclo.- Primer ciclo:
<init>
-><test>
-><statement>
- Segundo ciclo:
<increment>
-><test>
-><statement>
2 /
While
equivalenteEn este equivalente
while
al<increment>
es el final del primer ciclo y se siente como si fuera el mismo con elfor
.Eso haría
<increment>
el final del primer ciclo.- Primer ciclo:
<test>
-><statement>
-><increment>
- Segundo ciclo:
<test>
-><statement>
-><increment>
3 / Una declaración se encuentra dos veces
Un ciclo completo se completa cuando una declaración se encuentra dos veces.
La primera declaración encontrada dos veces es
<test>
.Eso haría
<increment>
el final del primer ciclo.- Primer ciclo:
<test>
-><statement>
-><increment>
- Segundo ciclo:
<test>
-><statement>
-><increment>
4 / Es una configuración
El
<init>
solo está configurando lo que sea necesario para el primer ciclo.El
<increment>
solo está configurando lo que sea necesario para el segundo ciclo.Eso haría
<increment>
el comienzo del segundo ciclo.- Primer ciclo:
<init as a setup>
-><test>
-><statement>
- Segundo ciclo:
<increment as a setup>
-><test>
-><statement>
La especificación de idioma ECMAScript® 2016
Tiempo de ejecución de
for(<init>;<test>;<increment>)<statement>;
Hay tres formas, así que tomé la más corta aquí, no hay diferencia:
- Sea lo
<init>
que sea, no es parte de la primera iteración.- Lo relevante es en ForBodyEvaluation.
Los detalles de ForBodyEvaluation (
<test>
,<increment>
,<statement>
, «», labelset)6 / Lo veo
Un ciclo completo una ejecución completa de la parte de repetición.
Eso haría
<increment>
el final del primer ciclo.- Primer ciclo:
<test>
-><statement>
-><increment>
/ En otras palabras, de la línea 3 a la línea 13- Segundo ciclo:
<test>
-><statement>
-><increment>
/ En otras palabras, de la línea 3 a la línea 137 / Un ciclo es una iteración
Un ciclo comienza con
CreatePerIterationEnvironment
.Entonces, cuando
CreatePerIterationEnvironment
se encuentra, comienza un nuevo ciclo, terminando así el anterior.Eso haría
<increment>
el comienzo del segundo ciclo.- Primer ciclo:
<test>
-><statement>
/ En otras palabras, desde la línea 1 a la línea 9- Segundo ciclo:
<increment>
-><test>
-><statement>
/ En otras palabras, desde la línea 10 en bucle hasta la línea 9¿Es el
<increment>
final del primer ciclo o el comienzo del segundo ciclo?fuente
for(a;b;c)d;
es más o menos equivalente aa;while(b){d;c;}
, me inclino a decir que el error todavía se produce en la primera iteración (antes de que se verifique la condición del bucle por segunda vez).INTERCAL , 12 bytes
Pruébalo en línea!
NEXT
es el comando de flujo de control principal de INTERCAL-72. (Se introdujeron revisiones posterioresCOME FROM
, que se hicieron más famosas, pero no estaba en la versión original del lenguaje; y todas las implementaciones de INTERCAL terminadas conozco el soporteNEXT
para la compatibilidad con versiones anteriores, con todos menos uno habilitando el soporte por defecto. Entonces No siento la necesidad de nombrar INTERCAL-72 específicamente en el título).Cuando se usa
NEXT
para formar un bucle, se supone que debe usarRESUME
oFORGET
para liberar el espacio que usa para recordar dónde ha estado el programa;RESUME
retroactivamente convierte el elementoNEXT
en algo parecido a una llamada de función (aunque puede regresar de funciones distintas a la que está) mientrasFORGET
que lo convierte en algo más similar a una declaración GOTO. Si no lo hace (y este programa no lo hace), el programa se bloqueará después de 80 iteraciones (este comportamiento se especifica realmente en la especificación INTERCAL).Es algo ambiguo si esto cuenta como una recursión ilimitada (no permitida en la pregunta); ciertamente puede usar este tipo de
NEXT
para implementar una llamada a la función, en cuyo caso sería efectivamente una función recursiva, pero aquí no hay suficiente información para determinar si estamos haciendo una llamada a la función o no. Al menos, estoy publicando esto de todos modos porque no viola las reglas inequívocamente, y una implementación INTERCAL que optimizó la "llamada de cola" no solo violaría la especificación, sino que también causaría la ruptura de la mayoría de los programas existentes, porque al regresar de la "función incorrecta" es la forma principal de hacer el equivalente de una declaración IF.Aquí está el mensaje de error resultante, generado por C-INTERCAL:
(Tenga en cuenta que la segunda línea está sangrada con una pestaña, y la tercera con ocho espacios. Esto parece correcto en un terminal, o en casi cualquier programa que tenga tabulaciones en múltiplos de 8. Sin embargo, Markdown tiene tabulaciones en múltiplos de cuatro, violando los supuestos que la mayoría de los programas más antiguos hacen acerca de las pestañas, por lo que el mensaje de error está un poco malformado aquí).
fuente
CORRECT SOURCE AND RESUBNIT
? ¿Como en un error tipográfico en el mensaje de error C-INTERCAL original?Pyth, 3 bytes
Pruébalo en línea.
W1
es solowhile 1:
en Python. El cuerpo del bucle imprime una línea leída de STDIN, que se bloquea para la segunda iteración cuando el código se ejecuta con una entrada vacía.Si los bucles que usan
#
(bucle hasta error) están prohibidos (supongo que sí), creo que esto es lo más corto que puede ser.fuente
Python 3, 29 bytes
Muy simple En la segunda llamada a x, no estoy allí, y Python se queja al respecto.
fuente
Laberinto , 3 bytes
Pruébalo en línea!
Como la mayoría de los lenguajes 2D, Labyrinth no tiene construcciones de bucle explícitas. En cambio, cualquier código que se presente de manera tal que se ejecute varias veces seguidas es un bucle en estos idiomas. Para el caso de Labyrinth, un programa lineal simple actúa como un bucle, porque el puntero de instrucción rebotará hacia adelante y hacia atrás. Si el programa es
abc
(para algunos comandosa
,b
yc
), entonces la ejecución real seráabcbabcbabcb...
para que se ejecuteabcb
en un bucle infinito.En cuanto a por qué este programa en particular se bloquea en la segunda iteración de este ciclo, esto es lo que hacen los comandos individuales. Tenga en cuenta que la pila de Labyrinth contiene una cantidad infinita implícita de ceros en la parte inferior:
fuente
Bash, 11 (límite no competidor)
Este script se ejecuta recursivamente, agregando
1
los argumentos pasados en cada iteración. Creo que esto cuenta como TCO porque el ejecutivo reutiliza el espacio del proceso pero no se come la pila. No está en competencia ya que tardó unos 10 minutos en ser asesinado en mi máquina: YMMV.fuente
exec $0 1$@$@
termina mucho más rápido pero tiene dos caracteres más.cmd, 34 bytes
Esto pasará
%i
de 0 a 10. Elcolor
comando (antiguo) aceptará felizmente cualquier argumento que tenga 2 dígitos hexadecimales. Con el argumento100
fallará, imprimiendo el mensaje de ayuda y configurandoERRORLEVEL
a 1.Prueba de que el ciclo se ejecuta al menos una vez: ¡El color de su caparazón será diferente!
fuente