Debe crear un programa que pueda verificar la sintaxis de los programas de su mismo idioma. Por ejemplo, si lo hace en python, verifica la sintaxis de python. Su programa recibirá un programa en la entrada estándar y verificará si su sintaxis es correcta o no. Si es correcto, la salida es "verdadera" en la salida estándar. Si no, la salida es simplemente "falsa" en la salida estándar.
Sin embargo, su programa debe ser incorrecto en una instancia. Si se alimenta su propio código fuente, solo generará "falso" en la salida estándar. Este es el código de golf, ¡así que el programa más corto gana!
Nota: Aunque esto no es técnicamente una quine, debe seguir las reglas de quine, lo que significa que no puede acceder a su código fuente a través del sistema de archivos o lo que sea.
Nota: No puede reclamar un programa que no se pudo ejecutar debido a un error de sintaxis que resuelve este desafío, ya que debe ser ejecutable.
try:exec(raw_input())...
permitido?Respuestas:
Ruby 2.0, 65
76 164caracteresEsto utiliza el verificador de sintaxis incorporado de Ruby (
ruby -c
) para verificar la sintaxis de la entrada, lo que significa que el código no será evaluado.Ejemplo de uso básico:
Explicación
Esta solución está (estaba) basada en el estándar Ruby quine:
%p
es el especificador de formato paraarg.inspect
, que se puede comparar conuneval
: cuando seeval
ingresa la cadena devueltaarg.inspect
, (generalmente) obtiene el valor original nuevamente. Por lo tanto, al formatear laq
cadena consigo misma como argumento, el%p
interior de la cadena se reemplazará con la cadena citada (es decir, obtenemos algo así"q=\"q=%p;puts q%%q\";puts q%q"
).Generalizar este tipo de quine lleva a algo como lo siguiente:
Sin embargo, este enfoque tiene un gran inconveniente (al menos en code-golf ): todo el código debe duplicarse. Afortunadamente,
eval
se puede usar para evitar esto:Lo que sucede aquí es que el código pasado a eval se almacena dentro
r
antes de queeval
se llame. Como resultado,eval
se puede obtener el código fuente completo de la declaración'eval r=%p'%r
. Si hacemos esto dentro deleval
código d y nos aseguramos de que el nivel superior de nuestro consiste solo en unaeval
declaración, esa expresión en realidad nos da el código fuente completo de nuestro programa, ya que cualquier código adicional pasadoeval
ya está almacenado dentror
.Nota al margen: este enfoque en realidad nos permite escribir un quine Ruby en 26 caracteres:
eval r="puts'eval r=%p'%r"
Ahora, en esta solución, el código adicional ejecutado en su interior
eval
consta de cuatro declaraciones:Primero, leemos todas las entradas de STDIN y las guardamos implícitamente en ellas
$_
.Luego, rebobinamos STDIN para que la entrada esté disponible nuevamente para el subproceso que comenzamos en el siguiente paso.
Esto inicia Ruby en su modo de verificación de sintaxis incorporado, leyendo el código fuente de stdin. Si la sintaxis del script proporcionado (nombre de archivo o stdin) es correcta, se imprime
Syntax OK
en su stdout (que es capturado por el proceso principal), pero en caso de un error de sintaxis, se imprime una descripción del error en stderr , lo que ser visible, por lo que redirigimos eso a nirvana (2>&0
) en su lugar.Luego, verificamos el código de salida del subproceso
$?
, que es 0 si la sintaxis era correcta. Por último, la entrada que leemos antes ($_
) se compara con nuestro propio código fuente (que, como describí anteriormente, se puede obtener con'eval r=%p'%r
).Editar: ¡Salvé 14 caracteres gracias a @histocrat!
fuente
.write
con<<
y>>1<1
con==0
.==
losProcess::Status
documentos. ¡Muchas gracias!Rebol - 69 o 74
75totalmente compatible con todas las reglasNuevas versiones de trabajo gracias a @rgchris! No estoy seguro si el primero falla el requisito de "no acceder a la fuente", ya que el intérprete contiene el código cargado y analizado que se ha pasado como un parámetro de línea cmd en el objeto del sistema (
system/options/do-arg
) que se utiliza para reconocerse a sí mismo.Este sigue todas las reglas:
Ejemplo de uso:
Primero imprime un número entero válido, el segundo imprime un número entero inválido.
Versión totalmente compatible:
Explicación:
Primera versión
Esto utiliza la función integrada de Rebols
load
para analizar y cargar el código desde stdin, pero no lo ejecuta.El
try
bloque detecta cualquier error de sintaxis y laerror?
función convierte el error en un simple booleano.El
i = system/options/do-arg
compara la entrada de la entrada estándar (asignado ai
) con el código aprobado en eldo-arg
argumento (pero muy astuto de golf :).any
es una gran función que devuelvetrue
si seany
evalúa algo en el bloquetrue
(por ejemplo,any [ false false true ]
volveríatrue
).not
luego solo invierte el valor booleano para darnos la respuesta correcta yprobe
muestra el contenido del valor devuelto.Versión totalmente compatible
Veamos esto en orden ...
Asigne la palabra
b
al bloque [] que sigue.Use la
do
función para interpretar eldo
dialecto en elb
bloque.Dentro del
b
bloque ...Establezca la palabra
i
para referirse al contenido de stdin (input
).Ahora,
if
colocamosjoin
la cadena "do b:" en elmold
bloque 'edb
y no es igual (<>
) a la entrada stdin,i
entonces intentamosload
la entradai
.Si el resultado es un,
block
entonces hemosload
editado los datos pasados correctamente; de lo contrario, recibiríamos unnone
errorif
.Use
prin
para mostrar el resultado delblock?
cual devuelve verdadero si el resultado es un bloque. Usarprin
en lugar deprint
no muestra un retorno de carro después de la salida (y nos ahorra otro carácter).fuente
print not error? try[load/all input]
c:[c: compose/only [c: (c)]print not error? try[if c = load/all input[1 / 0]]]
(prin none? attempt[load/all input] halt) 1a
El entero inválido fallaría en la evaluación de la sintaxis, pero la detención detendría un error en la operación normalchecksum/secure
utilizar su programa e incluir el hash dentro de la propia fuente para fines de comparación, me gustaría incluir sus servicios en mi sindicato de delitos informáticos. Salvo eso, comience desde mi código, que funciona. :-)do B[pb bl? iu a jn "do B" ml b [try [ld/all a]]]
Javascript -
8682Pegue en la consola Javascript de su navegador para probar.
Explicación:
Nota: @ m.buettner trajo a colación el punto de que el programa regresa
true
para una declaración de devolución desnuda, comoreturn 0;
. Debido a que Javascript no arroja un error de sintaxis para una declaración de devolución ilegal hasta que realmente se ejecute (lo que significa que el código comoif (0) { return 0; }
no arroja un error de sintaxis), no creo que haya alguna forma de solucionar este problema al escribir un analizador de Javascript en Javascript . Por ejemplo, considere el código:Si se ejecuta el código, se bloqueará debido al bucle. Si el código no se ejecuta, no se generará ningún error para la declaración de devolución ilegal. Por lo tanto, esto es tan bueno como Javascript puede obtener para este desafío. Siéntase libre de descalificar Javascript si cree que esto no cumple el desafío lo suficiente.
fuente
return 0
.Haskell - 222 bytes
Tenga en cuenta que esto utiliza un verdadero analizador. No depende de
eval
funciones similares de lenguajes dinámicos.Esta solución no es particularmente bonita, pero funciona.
fuente
if take ...
instrucción verifica si la entrada coincide con un literal de cadena que es la primera parte del programa.Creo que esto sigue las reglas:
JS (✖╭╮✖)
function f(s){if(s==f.toString())return false;try{eval(s)}catch(e){return false}return true}
El código será evaluado si es correcto.
Es necesario echar un vistazo a la notación de flecha para ver si no se puede acortar más.!function f(){try{s=prompt();return"!"+f+"()"!=s?eval(s):1}catch(e){return 0}}()
Después de un par de intentos fallidos y revierte, ¡nueva versión!!function f(){try{s=prompt();"!"+f+"()"!=s?eval(s):o}catch(e){return 1}}()
¡Y estoy de vuelta!!function f(){try{s=prompt();"!"+f+"()"!=s?eval(s):o}catch(e){return !(e instanceof SyntaxError)}}()
Y me fui! Desafortunadamente, debido a la naturaleza de eval y gracias a @scragar (¡maldito seas @scragar!), Este enfoque no funcionará (ya que
throw new SyntaxError
es un código JS válido, que marca este método), como tal, diría que es imposible crear un verificador de sintaxis (al menos usando eval o cualquier variación de los mismos)(* ver los comentarios!)
fuente
eval("x=function(){"+t+"}");
}//
o};{
.Error
, noException
.throw new Error('')
Causa el comportamiento incorrecto.Pitón (95)
fuente
c=u'#\u1e91'
porqueord('#') + ord(u'\u1e91') == 7860
PHP - 140
Comentario necesario para mantener el 'hash' (una copia descarada de s, ɐɔıʇǝɥʇuʎs). Usando php -l / lint para verificar errores.
fuente
C 174
Explicación -Wall necesitaba producir un error del sistema sin dejar de ser compilable. El error de sintaxis es no
return 0;
Para ingresar mediante stdin en la consola de Windows, escriba Ctrl-Z después de pegar y presione Intro.Golfed
Sin golf:
fuente
T-SQL - 110
Bastante simple, he estado queriendo probar un desafío aquí por un tiempo, finalmente pude hacerlo. Este no es el código más elegante, pero no obstante me divertí.
La versión 'golfizada'.
Una versión mejor formateada.
Es bastante autoexplicativo, utiliza SET NOEXEC, lo que hace que simplemente analice la consulta en lugar de devolver ningún resultado. el resto es principalmente el try / catch que uso para determinar lo que necesito imprimir.
EDITAR: Debería haber agregado que esto técnicamente fallará por sí mismo. porque utiliza SQL dinámico, las comillas simples en la entrada deben duplicarse '->' '
fuente