Como parte de su respuesta a Cometer un error Quine! @Falko propuso el siguiente algoritmo:
¿Cómo crear su propia solución en 2 minutos?
- Abra un nuevo archivo en un IDE de su elección.
- Golpea tu cabeza con el teclado frente a ti.
- Compilar.
- Reemplace el código con el mensaje de error del compilador.
- Repita los pasos 3 y 4 hasta que el código converja.
¡Apuesto a que tal procedimiento termina bastante rápido en la mayoría de los casos!
Tarea
Tu tarea es demostrar que está equivocado.
Escriba un programa completo que satisfaga lo siguiente:
Cuando se compila o interpreta, produce un mensaje de error que, cuando se compila o interpreta a su vez, también genera un mensaje de error.
Si repite el paso 1 una y otra vez, eventualmente encontrará un punto fijo, es decir, un error quine.
Reglas adicionales
El mensaje de error final debe tener una longitud positiva. Sin embargo, los mensajes de error anteriores y el código fuente original pueden estar vacíos.
La longitud del código fuente original no puede exceder 1024 bytes.
Ni el código original ni el código generado en ninguno de los pasos pueden producir resultados sin errores.
La salida debe ser claramente identificable como un mensaje de error, que debe ser generado por el compilador / intérprete debido a un error de sintaxis, error de tiempo de ejecución, referencia indefinida, etc.
Es posible que su programa no reciba ninguna entrada o requiera ningún indicador para producir el bucle.
Su programa puede depender de una implementación específica de su idioma o versión del mismo.
Tanteo
Su puntaje es el número finito de pasos que requiere su código fuente antes de producir un error quine. La presentación con la puntuación más alta gana.
La longitud del código fuente original se utilizará como disyuntor. Más corto es mejor.
Ejemplo
En pollo , el programa
genera el siguiente mensaje de error:
TypeError: Cannot read property 'NaN' of undefined
Si este mensaje de error es, a su vez, interpretado, produce el mensaje de error
Error on line 1: expected 'chicken'
que, si se interpreta a su vez, se produce a sí mismo.
Por lo tanto, el puntaje del programa Chicken vacío es 2.
Contraejemplo
El código PHP
ab<?=c
genera el mensaje de error
PHP Parse error: syntax error, unexpected '?' in Command line code on line 1
que se produce cuando se interpreta.
Sin embargo, el segundo código fuente imprime el mensaje en STDOUT, lo que invalida esta secuencia.
Segmentation fault (core dumped)
.Respuestas:
Bash, 9223372036854775810
Inspirado por la respuesta de Doorknob.
Debe ejecutarse con
bash < file.sh
, o usar el mismo nombre de archivo para cada programa, para deshacerse de los diferentes nombres de archivo en los mensajes de error.Los primeros errores son (con
LANG=C
):Y finalmente:
lo cual es un error quine.
fuente
bc
o escribo mi propio código para decrementar.Pip 0.15.05.29 , más de 10 100,000
Técnicamente no es válido porque requiere la
-w
bandera para la salida de advertencia. Dicho esto, Pip por diseño no muestra ningún error de tiempo de ejecución a menos que realmente bloquee el programa (recursión infinita, por ejemplo); Los problemas con este código son cosas de las que otros idiomas definitivamente se quejarían.El número exacto de pasos depende solo del valor asignado
i
, por lo que podría ser arbitrariamente grande (hasta que el intérprete de Python se quede sin memoria). Además, tomaría más tiempo que la edad del universo completar la secuencia anterior. (La pregunta se especifica "lento"!)Explicación:
Me tomó un tiempo revisar el intérprete antes de encontrar un error que me permitiera poner un código arbitrario en el mensaje de advertencia. Después de eso, esencialmente estaba modificando las técnicas estándar de quine. El ejemplo aquí usa un
i
valor de5
para propósitos de explicación.Después de la configuración
i
, almacene una cadenad
y luego intente ejecutar laS
instrucción wap. Swap espera dos variables (más exactamente, valores).s
está bien, pero la segunda expresión esi?dRo--iRsRPda
. Sii
es verdadero (distinto de cero, para nuestros propósitos), el ternario evalúa adRo--iRsRPd
, que utilizad
desde antes para formar una quina cercana, solo coni
decremento. Esta expresión no es un valor, por lo que Pip se queja:... que luego comienza todo de nuevo. (
Attempting to swap non-lvalue
es un montón de no-ops:At
calcula el valor ASCII det = 10
,n-l
resta nueva línea menos cada valor de una lista vacía, y todas las letras minúsculas son solo variables).El proceso continúa de manera similar hasta:
Cuando esto se ejecuta,
i
ahora es falso. La expresión ternaria se evalúa en la rama elsea
es un valor l. Por lo tanto, el intercambio ya no se queja. En cambio, obtenemos:Y al ejecutar esto, por fin, tenemos un error de sintaxis real:
... en ese punto, ya que el "programa" comienza con
R
, Pip continuará quejándose de queR
no es un operador unario para siempre.La mejor solución que no usa
-w
es de longitud 3:fuente
-w
cuenta como un lenguaje de programación de acuerdo con meta consensoJulia, 3
Una simple para hacer rodar la pelota ...
Programa inicial:
Error 1:
Puede que no esté definido, pero si es español , también es inesperado. Nadie espera la inquisición española.
Error 2:
Error 3:
El tercer mensaje de error, cuando se envía como un programa, produce el mismo error, de ahí la puntuación de 3.
¡Trabajo en progreso! Seguramente puedo hacerlo mejor que 3.
fuente
R, 5
Programa inicial:
Error 1:
Error 2:
Error 3:
Error 4:
Error 5 (Quine):
fuente
Bash, 3
Script de shell muy rudimentario para probarlo:
fuente
stdout
. Si existestdout
ystderr
, no funcionará correctamente.Rubí, 5
Programa inicial
1
2
3
4 4
5 (Quine)
fuente
Java, 5
Estos son muy largos ... así que verifiqué la igualdad de cadenas usando un script Python, y generé esta publicación formateada, para no tener que insertar pestañas manualmente en 400 líneas.
Programa inicial
1
2
3
4 4
5 (Quine): se omite debido a la longitud de la publicación.
fuente
javac -version
)?Javascript, 3 niveles de error
Esto no es esa 'cuchilla' ni nada, pero lo encontré bastante extraño ...
Error 0 (original):
Error 1:
Error 2:
Error 3 (quine):
Todo esto se devolvió en Internet Explorer 11.0.9600.17416, siendo los errores traducidos al inglés.
Imprimir pantalla:
* Los mensajes de error se muestran en portugués y se pueden traducir fácilmente al inglés.
fuente
JS en Firefox 66.0; 3 niveles de error
Entrada:
6?4;
Error # 1 = Entrada # 2:
missing : in conditional expression
Error # 2 = Entrada # 3:
expected expression, got keyword 'in'
Error # 3 = Entrada # 4 = Error # 4:
unexpected token: identifier
Esto es lo más alto que obtuve.
fuente