El desafío es encontrar una cadena de caracteres que no puedan aparecer en ningún programa legal en el lenguaje de programación de su elección. Eso incluye comentarios, cadenas u otras partes "no ejecutables".
Desafío
- Su programa puede ser específico para una versión particular o implementación del compilador / intérprete / entorno de tiempo de ejecución de su idioma. En caso afirmativo, especifique los detalles.
- Solo se permiten las opciones estándar de compilador / intérprete / tiempo de ejecución. No puede pasar un indicador extraño a su compilador para obtener un resultado específico (por ejemplo, pasar un indicador para convertir las advertencias en errores).
- Si su lenguaje de programación requiere una codificación específica (por ejemplo, UTF-8), su cadena también debe estar codificada correctamente (es decir, las cadenas que fallan únicamente debido a errores de decodificación de caracteres no están permitidas).
- Cada personaje individual en su presentación debe ser admisible en un programa legal; es decir, no puedes usar un personaje que siempre se rechaza.
- El compilador / intérprete / runtime debe dar un error cuando se le da cualquier código fuente que contenga su cadena como una subcadena. El error no tiene que ser el mismo en todos los programas: una incrustación de su cadena puede causar un error de sintaxis, mientras que otro puede causar un error de tiempo de ejecución.
Puntuación
- La cadena ilegal más corta para cada idioma gana.
- Debe explicar por qué su cadena es ilegal (por qué no puede aparecer en ningún lugar de un programa legal).
- Disputa soluciones incorrectas en los comentarios. Más específicamente, debe proporcionar un enlace a TIO o equivalente que demuestre un programa legal (es decir, uno que no produzca ningún error) que contenga la subcadena propuesta.
- Algunos lenguajes (por ejemplo, Bash, Batch, Perl) permiten agregar datos binarios arbitrarios a un programa sin afectar la validez (por ejemplo, usar
__DATA__
en Perl). Para dichos idiomas, puede enviar una solución que solo puede aparecer en dicha sección final. Asegúrese de anotar eso en su respuesta. (La definición de esta "sección final" depende del idioma, pero generalmente significa cualquier texto después de que el analizador haya dejado de leer el guión).
Ejemplo
En Python, podría enviar
x
"""
'''
pero esto puede integrarse en el programa más grande
"""
x
"""
'''
y
'''
entonces no es admisible.
code-challenge
restricted-source
nneonneo
fuente
fuente
Respuestas:
Changeling , 2 bytes
Eso es dos avances de línea. Changeling válido siempre debe formar un cuadrado perfecto de caracteres ASCII imprimibles, por lo que no puede contener dos saltos de línea seguidos.
El error siempre es un error del analizador y siempre es el mismo:
acompañado por el código de salida 1 .
Pruébalo en línea!
fuente
Java, 4 bytes
Pruébalo en línea!
Esta es una secuencia de escape Unicode no válida y causará un error en el compilador.
fuente
"\\u;"
.\uXXXX
escapes antes de hacer cualquier otra cosa , así que sí, esto funcionará incluso dentro de comments.zaCOBOL (GNU) , 8 bytes
Primero, un salto de línea para evitar que pongas mi palabra en una línea comentada.
Luego, históricamente, los programas COBOL se imprimieron en hojas de codificación, el compilador se basa en gran medida en líneas limitadas de 80 caracteres, no hay comentarios multilínea y los primeros 6 caracteres son comentarios (a menudo utilizados como números de línea editables), puede poner casi cualquier cosa allí , HASTA DONDE SE. Elegí
THEGAM
al comienzo de la siguiente línea.Luego, el séptimo símbolo en cualquier línea solo acepta una lista muy restringida de caracteres: Espacio (sin efecto), Asterisco (comenta el resto de la línea), Guión, Barra oblicua, puede haber otros, pero ciertamente no
E
.El error dado por GnuCobol, por ejemplo, es:
Pruébalo en línea!
Además, acabas de perder el juego.
fuente
Also, you just lost the game.
Casi voté en contraJavaScript, 7 bytes
Tenga en cuenta la nueva línea principal.
\u)
es una secuencia de escape Unicode no válida y es por eso que esta cadena no es válida//
al principio todavía no funcionará debido a la nueva línea principal, dejando la segunda línea sin comentar/*
no descomentará la cadena por completo debido al cierre*/
que la completa, dejando al\u)
descubierto/
cadena después de la cadena, por lo que al tener el)
frente de la\u
, podemos asegurar que el literal de expresión regular siempre sea inválido1||1(string)/
para evitar tener que evaluar la expresión regular. El punto y coma al principio de la segunda línea evita que eso suceda al terminar la expresión1||1
antes de que llegue a la segunda línea, forzando un SyntaxError con el;*
.¡Intentalo!
Mostrar fragmento de código
fuente
/* */\u0045 = 3
Parece un código JavaScript válido.3 */\u;/
aun es válido./
(no es que necesite corregirlo). (Además,;
no fuerza el análisis de la expresión regular mala, fuerza un SyntaxError con el*
.)#if 0
como se ve aquí: ¡ Pruébelo en línea!Python, 10 bytes (no cpython)
Tenga en cuenta la nueva línea principal. No se puede comentar debido a la nueva línea, y ninguna combinación de cadenas entre comillas triples debería funcionar si lo pensara correctamente.
@feersum en los comentarios parece haber roto por completo cualquier programa cpython en Windows, por lo que puedo decir, agregando el carácter 0x1A al comienzo de un archivo. Parece que tal vez (?) Esto se deba a la forma en que el sistema operativo maneja este personaje, aparentemente se traduce a un EOF a medida que pasa a través de stdin debido a algún estándar heredado de DOS.
En un sentido muy real, esto no es un problema con Python sino con el sistema operativo. Si crea una secuencia de comandos de Python que lee el archivo y usa el incorporado
compile
en él, proporciona el comportamiento más esperado de arrojar un error de sintaxis. Pypy (que probablemente hace esto internamente) también arroja un error.Editar:
¡Debido a la diligencia de @feersum para encontrar formas oscuras de romper el intérprete de Python, esta respuesta es completamente invalidada para cualquier entorno típico de cpython hasta donde puedo decir! (Python 2 y 3 para Windows y Linux) Todavía creo que estas grietas no funcionarán para Pypy en ninguna plataforma (la única otra implementación de Python que he probado).
fuente
"""?'''"""
C (clang) , 16 bytes
Pruébalo en línea!
*/
cierra cualquier/*
comentario, y el espacio principal se asegura de que no solo hayamos comenzado uno. La nueva línea cierra cualquier//
comentario y rompe cualquier cadena literal. Luego, causamos un error#else without #if
o#else after #else
(independientemente de cuántos#if 0
s podamos tener dentro).fuente
-std=c99
, pero intentemos cambiar a clang.R"foobar(...)foobar"
y solo un parren derecho seguido del delimitador correspondiente y un La cita lo cerrará.Pyth, 6 bytes
¡
es un carácter no implementado, lo que significa que si el analizador Pyth lo evalúa alguna vez, generará un error con un PythParseError. El código asegura que esto sucederá en uno de los¡
s.Hay tres formas en que un byte puede estar presente en un programa Pyth y no analizarse: en un literal de cadena (
"
o."
, que se analizan de manera equivalente), en un literal de Python ($
) e inmediatamente después de a\
.Este código evita
\
que se evalúe sin error, porque eso solo afecta el byte inmediatamente siguiente y los segundos¡
errores.$
incrusta el código dentro de la$
s directamente en el código compilado de Python. No hago suposiciones sobre lo que podría pasar allí.Si el programa alcanza este código en un
$
contexto, terminará en el$
, y¡
justo después hará el error del analizador. Los literales de Pyth en Python siempre terminan en el siguiente$
, independientemente de lo que esté haciendo el código de Python.Si el programa se inicia en un
"
contexto,"
finalizará la cadena y el final¡
generará el error del analizador.fuente
Ada - 2 bytes
Creo que esto debería funcionar:
Eso es subrayado de nueva línea. Newline termina los comentarios y no está permitido en una cadena. Un guión bajo no puede seguir espacios en blanco; solía permitirse solo después de letras y números, pero la introducción de Unicode hizo las cosas complicadas.
fuente
Código de máquina x86 de 32 bits, 11 bytes (y 64 bits a prueba de futuro)
Esto es
times 9 nop
/ud2
. Básicamente es un trineo NOP , por lo que todavía se ejecuta como 0 o másnop
sy luegoud2
genera una excepción, independientemente de cuántos0x90
bytes se hayan consumido como operandos a un código operativo anterior. Otras instrucciones de un solo byte (comotimes 9 xchg eax, ecx
) también funcionarían.Código de máquina x86 de 64 bits, 10 bytes (CPU actuales)
Hay algunas instrucciones ilegales de 1 byte en el modo de 64 bits, hasta que una futura extensión ISA los reutilice como prefijos o partes de códigos de operación de varios bytes solo en el modo de 64 bits, separados de su significado en el modo de 32 bits.
0x0e
estápush cs
en modo de 32 bits, pero es ilegal en las CPU actuales (probadas en Intel Skylake) en 64 bits.Interpretación de reglas para código máquina ejecutable :
Los bytes no se pueden saltar (como la restricción "no analizada"), porque las CPU no generan excepciones hasta que realmente intentan decodificar / ejecutar (no especulativamente).
Los medios ilegales siempre generan una excepción, por ejemplo, una excepción de instrucción ilegal. (Los programas reales pueden detectarlo con un controlador de excepción en el metal desnudo o instalar un controlador de señal del sistema operativo, pero creo que esto captura el espíritu del desafío).
Funciona porque una cadena de bytes más corta que termina en
ud2
podría aparecer como un imm32 y / o parte del modo de direccionamiento para otra instrucción, o dividirse en un par de instrucciones . Es más fácil pensar en esto en términos de lo que podría poner antes de la cadena para "consumir" los bytes como parte de una instrucción, y dejar algo que no fallará.Creo que una instrucción puede consumir como máximo 9 bytes de material arbitrario: un byte SIB, un disp32 y un imm32. es decir, los primeros 2 bytes de esta instrucción pueden consumir 8 NOP y un ud2, pero no 9.
No se puede vencer a 9 nops:
Modo de 64 bits:
Pero los bytes para 8 NOPs + ud2 (o
times 9 db 0x0e
) pueden aparecer como parte de otros insns:fuente
ud2
? Parece que estás diciendo que interpretas las reglas como prohibiendo saltar sobre los bytes, porud2
lo que funcionaría bien solo, ¿no? Oh ... supongo que estás diciendo que el problema es queud2
puede aparecer como un prefijo a una instrucción válida. La segunda parte de esta respuesta fue un poco difícil de entender para mí.ud2
pueden aparecer enimm32
cualquier instrucción. Estaba pensando en esto en términos de qué bytes puede poner antes de una cadena que "consume"0f 0b
como parte de una instrucción anterior en lugar de decodificar comoud2
. No estaba totalmente contento con la forma en que terminé presentándolo, pero quería ilustrar por qué solo 8nop
s no era suficiente y qué sucedió con 9nop
s +ud2
.%else
/%else
podría funcionar para vencer%if 0
, lo que normalmente puede proteger cualquier texto no válido de ser analizado. (idea de una respuesta de CPP)C #, 16 bytes
Funciona porque:
//
el comentario no funcionará debido a la nueva línea/*
comentario no funcionará debido a la*/
#if false
al inicio no funcionará debido a la#endif
"
cierra cualquier cadena literal<#@#>
directiva no tiene nombre, por lo que falla para las plantillas T4./
al principio no engañará al*/
Cada variación falla con un error de compilación.
fuente
APL y MATL y Fortran , 3 bytes
Newline, Quote, Newline siempre arroja un error ya que los comentarios de bloque no existen:
unbalanced quotes
string literal not closed
Invalid character in name
fuente
Haskell alfabetizado , 15 bytes
Reparando un intento eliminado por nimi.
Pruébalo en línea!
El intento original de nimi son las dos últimas líneas, basadas en Literate Haskell que no permite
>
que el código de estilo literario esté en una línea vecina a una línea de comentario literario (5
aquí). Falló porque se puede incrustar en un comentario en el estilo de codificación alfabetizado alternativo ("LaTeX"):Sin embargo, el
\begin{code}
estilo de Literate Haskell no se anida, ni en sí mismo ni en los{- -}
comentarios multilínea, por lo que al poner una línea\end{code}
justo antes de la línea con el5
, esa solución falla, y no veo uno diferente.fuente
Pascal gratis, 18 bytes
Primero cierre todos los comentarios posibles, luego maneje la compilación condicional.
Comenta aquí si olvidé algo.
fuente
begin end.
.end.
la pregunta permite los códigos después de la validez.Commodore 64 Basic, 2 bytes
(esa es una nueva línea seguida de la letra "B").
Cualquier línea en un programa Commodore 64 debe comenzar con un número de línea o una palabra clave BASIC, y los programas almacenados solo permiten números de línea. No hay palabras clave que comiencen con "B" (o "H", "J", "K", "Q", "X", "Y" o "Z").
fuente
=0
, esto se convierte en una declaración de asignación ...Brain-Hack (una variación de Brain-Flak ),
32 bytesGracias a Wheat Wizard por señalar que Brain-Hack no admite comentarios, lo que me ahorra un byte.
Pruébalo en línea!
fuente
#
TIO(()){()}
.CJam , 7 bytes
Pruébalo en línea!
fuente
VBA, 2 bytes
Un salto de línea seguido de un guión bajo: las
_
funciones como el carácter de continuación de línea en VBA, y como no hay nada en la línea directamente a la izquierda o por encima de la continuación de línea, junto con la falta de comentarios multilínea de VBA significa que esto siempre arrojará la compilación error de tiempoCompile Error:
Invalid character
fuente
_
, solo que no hay una línea válida a la izquierda o por encima de ellamyfunction(
\n_
)
:?Public Function Foo( ByVal bar as Integer, _
(nueva línea)bas as long) as double
, por lo que sí, se produciría un error si llamara a la función que describiómyfunction( _
\n_
)
. Perdón por la confusion. Para decirlo de otra manera, debería haber usado dos líneas nuevas.SmileBASIC, 2 bytes
Nada continúa más allá del final de una línea, por lo que todo lo que necesita es un salto de línea seguido de algo que no puede ser el comienzo de una declaración.
!
es el operador lógico no, pero no puede ignorar el resultado de una expresión, por lo que incluso algo como!10
sería inválido (mientrasX=!10
funciona, por supuesto)Cosas similares funcionarán en cualquier idioma donde todo termine al final de una línea, siempre que analice el código antes de ejecutarlo.
Hay muchos caracteres alternativos que podrían usarse aquí, por lo que creo que sería más interesante enumerar los que PODRÍAN ser válidos.
@
es el comienzo de una etiqueta, por ejemplo@DATA
;(
podría ser parte de una expresión como la(X)=1
que está permitida por alguna razón; cualquier letra o_
podría ser un nombre de variableX=1
, llamada de funciónLOCATE 10,2
o palabra claveWHILE 1
;'
es un comentario; y?
es la abreviatura dePRINT
.fuente
INTERCAL , 12 bytes
¡Intenta descifrarlo en línea!
El enfoque de INTERCAL a los errores de sintaxis es un poco especial. Esencialmente, una declaración inválida no generará un error a menos que el programa intente ejecutarla. De hecho, la sintaxis idiomática para los comentarios es comenzar con ellos
PLEASE NOTE
, lo que realmente solo comienza una declaración, declara que no se debe ejecutar y luego comienza con la letraE
. Si su código estáDODO
en el medio, puede anteponerDOABSTAINFROM(1)(1)
y agregar cualquier declaración válida al final y estará bien, si es así,DODODO
puede doblar la ejecución a su alrededor como(1)DON'TDODODOCOMEFROM(1)
. Aunque INTERCAL carece de sintaxis literal de cadena para escapar de ellas, no hay forma de usar errores de sintaxis para crear una cadena ilegal, incluso agotando cada número de línea posible con(1)DO(2)DO...(65535)DODODO
, ya que parece que es muy posible tener números de línea duplicadosCOME FROM
trabajando con cualquiera de ellos.Para hacer una cadena ilegal, que realmente se necesita utilizar una declaración perfectamente válido:
TRY AGAIN
. Incluso si no se ejecuta, debe ser estrictamente la última declaración de un programa si está en el programa. Según mi conocimiento, 12 bytes es el más corto que puede usar una cadena ilegalTRY AGAIN
, porque debe garantizar que haya una declaración después (ejecutada o no), por lo queDOTRYAGAIN
es solo un código normal, y debe asegurarse de que toda la declaración de hechoTRY AGAIN
,TRYAGAINDO
no funciona porque puede convertirse fácilmente en un error de sintaxis normal ignorado:DON'TRYAGAINDOGIVEUP
oPLEASE DO NOT TRY TO USE TRYAGAINDO NOT THAT IT WOULD WORK
. No importa lo que pone a cada lado deDOTRYAGAINDO
, usted de error, ya sea conICL993I I GAVE UP LONG AGO
,ICL079I PROGRAMMER IS INSUFFICIENTLY POLITE
oICL099I PROGRAMMER IS OVERLY POLITE
.fuente
ICL993I I GAVE UP LONG AGO
.COME FROM
línea, puede ser un poco difícil desviar el flujo de control alrededor del bloque, ¡pero no hay nada que lo detengaGIVING UP
!AWK , 4 bytes
Pruébalo en línea!
Como
AWK
no tiene un método para hacer comentarios de varias líneas, necesita 2 líneas nuevas antes y 1 después/
para evitar comentar o convertir esto en una expresión regular, por ejemplo, agregar1/
. El mensaje más común es `nueva línea inesperada o final de cadena.Con crack anterior
fuente
Fortran, 14 bytes
No hay comentarios multilínea o directivas de preprocesador en Fortran.
fuente
JavaScript (Node.js) ,
98 bytesPruébalo en línea!
Creo que esto debería ser lo suficientemente ilegal.
Intentos anteriores de JS en otras respuestas
Explicación
Esto es ilegal en sí mismo y también bloquea todas las comillas simples y dobles porque esas comillas no pueden abarcar líneas sin un
\
al final de una líneay
Bloquea los comentarios al introducir secuencias de escape ilegales
Bloquea el backtick inicial al introducir el literal RegExp no terminado
Bloquea los literales de plantilla etiquetados mediante la introducción de un operador esperado entre dos backticks
fuente
Rockstar ,
45 bytesTachado 4 sigue siendo 4 :(
Rockstar es un lenguaje muy ... prolijo.
Si bien
"
se puede utilizar para definir una cadena, por lo que séPut "Hello" into myVar
, no hay forma de que aparezcan 3 citas fuera de un comentario, y el paréntesis cercano asegura que eso tampoco suceda (Los comentarios en Rockstar están encerrados entre paréntesis, como esta).Rockstar también tiene una sintaxis literal poética, en la que se ignora la puntuación, por lo que la nueva línea se asegura de que las 3 citas sean el comienzo de una línea de código, que siempre debe ser inválida
fuente
(()""")
, no sería eso un no-op?""")
analiza como código, que no es válidoGoethe says )"""
es válido .)
y"""
Powershell,
1081214131416 bytes-2 bytes gracias a Mazzy que encuentra una mejor manera de romperlo
+4 -1 bytes gracias a IsItGreyOrGray
Espero que esto funcione.
'
y"
para protegerse de las comillas,#>
para romper el comentario de bloque, nuevas líneas para detener el comentario de una sola línea, tanto'@
y"@
para capturar otro estilo de cadenas, y luego comienza una matriz incorrecta para arrojar un error de sintaxis.La lógica es que no pueden usar ningún conjunto de comillas para ingresar, no pueden bloquearlo, comentarlo.Si se
@"
usa, creará una cadena aquí que no puede tener un token después, y si déjalo en paz, intentará hacer una matriz rota. Esta declaración quiere vivir tan duro que sigo encontrando aún más agujeros en la armadura.fuente
@=
Encantamientos rúnicos, 3 bytes
Una de las muchas variaciones posibles.
Pruébalo en línea!
Runic utiliza caracteres de combinación unicode en un "
M
modifica el comportamiento deC
" (dondeC
es un comando). Como tal, no se permiten dos modificadores para modificar el mismo comando y el analizador arrojará un error si se encuentra tal ocurrencia.Del mismo modo, ciertos comandos que redirigen la IP no se pueden modificar de ninguna manera, debido a la existencia de caracteres modificadores de modificación de dirección (y ambos en la misma celda no tienen sentido).
No hay forma de escapar o literalizar la cadena para que sea válida. El enlace Tio contiene un
;
para evitar el error "sin terminador" de mayor prioridad.fuente
TI-Basic (83 + / 84 + / SE, 24500 bytes)
(24500 veces)
TI (-83 + / 84 + / SE) -Basic verifica la sintaxis solo en las declaraciones que alcanza, por lo que incluso 5000
End
declaraciones seguidas se pueden omitir con aReturn
. Esto, por el contrario, no puede caber en la RAM de una TI-83 + / 84 + / SE, por lo que ningún programa puede contener esta cadena. Ser un poco conservador con el personaje cuenta aquí.La TI-83 original tiene 27000 bytes de RAM, por lo que necesitará 27500
A
s en ese caso.TI-Basic (89 / Ti / 92 + / V200, 3 bytes)
Nueva línea, presupuesto, nueva línea. La nueva línea cierra cualquier comentario (y no permite incrustar el carácter ilegal en una cadena, ya que las constantes de cadena multilínea AFAIK no están permitidas), la otra nueva línea no permite cerrar la cadena y la cita da un error de sintaxis.
Puedes llegar a 2 bytes con
sin la nueva línea, pero no estoy seguro de si esto cuenta porque
±
es válido solo en constantes de cadena.fuente
Go , 6 bytes
¡Intenta descifrarlo en línea!
El acento grave (`) marca un literal de cadena sin procesar, dentro del cual todos los caracteres excepto`, incluidas las líneas nuevas y las barras diagonales inversas, se interpretan literalmente como parte de la cadena. Tres '' seguidos son el núcleo: los literales de cadena adyacentes no son válidos y 'siempre cierra una ' cadena, por lo que no hay forma de darles sentido. Tuve que usar 3 bytes más para evitar la elusión, una nueva línea para que no podamos estar dentro de un comentario de una sola línea o una cadena citada normal, y un * / para que no podamos estar dentro de un comentario de varias líneas.
fuente
SILOS , 4 bytes
Silos es competitivo
SILOS se ejecuta en un intérprete / compilador de dos pasos. Antes de la ejecución, un "compilador" intenta simplificar la fuente en una matriz que describe la fuente Cada línea se trata por separado. x + a es un operador de asignación que agregará ea al valor de x y lo almacenará en x. Sin embargo, el "compilador" se romperá. Por lo tanto, tomamos esta cadena y agregamos una nueva línea antes y después de garantizar que esté en su propia línea y rompa el compilador.
Pruébalo en línea!
fuente
ax+
error?AutoHotkey , 5 bytes
`es el personaje de escape. Solo puede escapar de un "al asignarlo a una variable.
\ n * / evita que se comente o se asigne a una variable.
fuente
JavaScript, 11 caracteres
Los backticks se aseguran de eliminar las cadenas de plantilla, las comillas eliminan las cadenas, la nueva línea evita las líneas comentadas, el final del comentario evita los comentarios de bloque y el último backtick y escape (con un! Para evitar agregar números) intenta iniciar un número inválido cuerda.
Pruébalo en línea!
fuente
)
después de\u
, ¿tal vez eso funcionaría aquí?