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:
%pes el especificador de formato paraarg.inspect, que se puede comparar conuneval: cuando seevalingresa la cadena devueltaarg.inspect, (generalmente) obtiene el valor original nuevamente. Por lo tanto, al formatear laqcadena consigo misma como argumento, el%pinterior 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,
evalse puede usar para evitar esto:Lo que sucede aquí es que el código pasado a eval se almacena dentro
rantes de queevalse llame. Como resultado,evalse puede obtener el código fuente completo de la declaración'eval r=%p'%r. Si hacemos esto dentro delevalcódigo d y nos aseguramos de que el nivel superior de nuestro consiste solo en unaevaldeclaración, esa expresión en realidad nos da el código fuente completo de nuestro programa, ya que cualquier código adicional pasadoevalya 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
evalconsta 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 OKen 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
.writecon<<y>>1<1con==0.==losProcess::Statusdocumentos. ¡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
loadpara analizar y cargar el código desde stdin, pero no lo ejecuta.El
trybloque detecta cualquier error de sintaxis y laerror?función convierte el error en un simple booleano.El
i = system/options/do-argcompara la entrada de la entrada estándar (asignado ai) con el código aprobado en eldo-argargumento (pero muy astuto de golf :).anyes una gran función que devuelvetruesi seanyevalúa algo en el bloquetrue(por ejemplo,any [ false false true ]volveríatrue).notluego solo invierte el valor booleano para darnos la respuesta correcta yprobemuestra el contenido del valor devuelto.Versión totalmente compatible
Veamos esto en orden ...
Asigne la palabra
bal bloque [] que sigue.Use la
dofunción para interpretar eldodialecto en elbbloque.Dentro del
bbloque ...Establezca la palabra
ipara referirse al contenido de stdin (input).Ahora,
ifcolocamosjoinla cadena "do b:" en elmoldbloque 'edby no es igual (<>) a la entrada stdin,ientonces intentamosloadla entradai.Si el resultado es un,
blockentonces hemosloadeditado los datos pasados correctamente; de lo contrario, recibiríamos unnoneerrorif.Use
prinpara mostrar el resultado delblock?cual devuelve verdadero si el resultado es un bloque. Usarprinen lugar deprintno 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) 1aEl 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/secureutilizar 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
truepara 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
evalfunciones 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 SyntaxErrores 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') == 7860PHP - 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