Você deve criar um programa que possa verificar a sintaxe dos programas do mesmo idioma. Por exemplo, se você fizer isso em python, ele verifica a sintaxe do python. Seu programa receberá um programa com entrada padrão e verifique se a sintaxe está correta ou não. Se estiver correto, a saída é apenas "verdadeira" na saída padrão. Caso contrário, envie apenas "false" na saída padrão.
Seu programa deve estar incorreto em uma instância. Se alimentado com seu próprio código-fonte, ele apenas emitirá "false" na saída padrão. Isso é código de golfe, e o programa mais curto vence!
Nota: Embora isso não seja tecnicamente adequado, você deve seguir as regras do quine, o que significa que não pode acessar seu código-fonte através do sistema de arquivos ou o que for.
Nota: Você não pode reivindicar um programa que não pôde ser executado devido a um erro de sintaxe resolve esse desafio, pois ele precisa ser executável.
try:exec(raw_input())...
permitido?Respostas:
Ruby 2.0, 65
76 164personagensIsso usa o verificador de sintaxe interno do Ruby (
ruby -c
) para verificar a sintaxe da entrada, o que significa que o código não será avaliado.Exemplo de uso básico:
Explicação
Esta solução é (foi) baseada no padrão Ruby quine:
%p
é o especificador de formato para oarg.inspect
qual pode ser comparadouneval
: aoeval
inserir a string retornada porarg.inspect
, você (normalmente) obtém o valor original novamente. Assim, ao formatar aq
string como argumento, o%p
interior da string será substituído pela própria string citada (ou seja, obtemos algo parecido"q=\"q=%p;puts q%%q\";puts q%q"
).A generalização desse tipo de quine leva a algo como o seguinte:
Essa abordagem tem uma enorme desvantagem (pelo menos no código-golfe ): Todo o código precisa ser duplicado. Felizmente,
eval
pode ser usado para contornar isso:O que acontece aqui é que o código passado para eval é armazenado dentro
r
antes deeval
ser chamado. Como resultado, o código fonte completo daeval
instrução pode ser obtido com'eval r=%p'%r
. Se fizermos isso dentro doeval
código d e garantirmos que o nível superior de nosso consistir apenas em umaeval
instrução, essa expressão realmente nos fornecerá o código fonte completo do nosso programa, pois qualquer código adicional passadoeval
já está armazenador
.Nota lateral: Essa abordagem nos permite escrever um Ruby Quine em 26 caracteres:
eval r="puts'eval r=%p'%r"
Agora, nesta solução, o código adicional executado dentro
eval
consiste em quatro instruções:Primeiro, lemos toda a entrada do STDIN e a salvamos implicitamente
$_
.Em seguida, rebobinamos o STDIN para que a entrada fique novamente disponível para o subprocesso que iniciaremos na próxima etapa.
Isso inicia o Ruby no modo de verificação de sintaxe embutido, lendo o código fonte do stdin. Se a sintaxe do script fornecido (nome do arquivo ou stdin) estiver correta, ela será impressa
Syntax OK
no seu stdout (que é capturado pelo processo pai), mas no caso de um erro de sintaxe, uma descrição do erro será impressa no stderr - o que seria fique visível, então redirecionamos isso para o nirvana (2>&0
).Depois, verificamos o código de saída do subprocesso
$?
, que é 0 se a sintaxe estiver correta. Por fim, a entrada que lemos anteriormente ($_
) é comparada com nosso próprio código-fonte (que, como descrevi anteriormente, pode ser obtido com'eval r=%p'%r
).Editar: salvou 14 caracteres graças a @histocrat!
fonte
.write
por<<
e>>1<1
com==0
.==
dosProcess::Status
documentos. Muito obrigado!Rebol - 69 ou 74
75totalmente compatível com todas as regrasNovas versões de trabalho graças a @rgchris! Não tenho certeza se o primeiro falha, o requisito "não acesse a fonte", pois o intérprete retém o código carregado e analisado e passou como um parâmetro de linha cmd no objeto do sistema (
system/options/do-arg
) que é usado para se reconhecer.Este segue todas as regras:
Exemplo de uso:
Primeiro imprimindo um número inteiro válido, o segundo imprimindo um número inteiro inválido.
Versão totalmente compatível:
Explicação:
Primeira versão
Isso usa a função incorporada do Rebols
load
para analisar e carregar o código do stdin, mas não o executa.O
try
bloco captura qualquer erro de sintaxe e aerror?
função converte o erro em um booleano simples.O
i = system/options/do-arg
compara a entrada de stdin (atribuída ai
) com o código passado nodo-arg
argumento (sorrateiro, mas muito golf :).any
é uma ótima função que retornatrue
seany
-thing no bloco é avaliado comotrue
(por exemplo,any [ false false true ]
retornariatrue
).not
em seguida, apenas inverte o booleano para fornecer a resposta correta eprobe
exibe o conteúdo do valor retornado.Versão totalmente compatível
Vamos passar por isso em ordem ...
Atribua a palavra
b
ao bloco [] a seguir.Use a
do
função para interpretar odo
dialeto nob
bloco.Dentro do
b
quarteirão ...Defina a palavra
i
para se referir ao conteúdo de stdin (input
).Agora,
if
temosjoin
a string "do b:" nomold
bloco 'edb
e não é igual (<>
) à entrada stdin,i
então tentamosload
a entradai
.Se o resultado for um,
block
então nósload
editamos os dados passados corretamente, caso contrário, receberíamos umnone
da falhaif
.Use
prin
para exibir o resultado doblock?
qual retorna true se o resultado for um bloco. Usarprin
em oposição aprint
não exibe um retorno de carro após a saída (e economiza outro caractere).fonte
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
O inteiro inválido falharia avaliação sintaxe, mas a parada iria parar um erro na operação normalchecksum/secure
seu programa e incluir o hash dentro da própria fonte para fins de comparação, gostaria de incluir seus serviços no meu sindicato de crimes cibernéticos. Salvo isso, comece pelo meu código, que funciona. :-)do B[pb bl? iu a jn "do B" ml b [try [ld/all a]]]
Javascript -
8682Cole no console Javascript do seu navegador para testar.
Explicação:
Nota: @ m.buettner levantou a questão de que o programa retorna
true
para uma declaração de retorno nu, comoreturn 0;
. Como o Javascript não gera um erro de sintaxe para uma declaração de retorno ilegal até que seja realmente executado (ou seja, código comoif (0) { return 0; }
não gera um erro de sintaxe), não creio que haja maneira de corrigir isso sem escrever um analisador Javascript em Javascript. . Por exemplo, considere o código:Se o código for executado, ele será interrompido por causa do loop. Se o código não for executado, nenhum erro será gerado para a declaração de retorno ilegal. Portanto, isso é tão bom quanto o Javascript pode obter para esse desafio. Sinta-se à vontade para desqualificar o Javascript se achar que isso não cumpre o desafio suficientemente.
fonte
return 0
.Haskell - 222 bytes
Observe que isso usa um analisador verdadeiro. Não depende de
eval
funções semelhantes de linguagens dinâmicas.Esta solução não é particularmente bonita, mas funciona.
fonte
if take ...
instrução verifica se a entrada corresponde a uma string literal que é a primeira parte do programa.Eu acho que isso segue as regras:
JS (✖╭╮✖)
function f(s){if(s==f.toString())return false;try{eval(s)}catch(e){return false}return true}
O código será avaliado se estiver correto.
Precisa dar uma olhada na notação de seta para ver se ela não pode ser reduzida mais.!function f(){try{s=prompt();return"!"+f+"()"!=s?eval(s):1}catch(e){return 0}}()
Depois de algumas tentativas fracassadas e reverte - nova versão!!function f(){try{s=prompt();"!"+f+"()"!=s?eval(s):o}catch(e){return 1}}()
E eu voltei!!function f(){try{s=prompt();"!"+f+"()"!=s?eval(s):o}catch(e){return !(e instanceof SyntaxError)}}()
E eu fui embora! Infelizmente, devido à natureza de eval e, graças a @scragar (maldição, @scragar!), Essa abordagem não funcionará (visto que
throw new SyntaxError
é um código JS válido, que marca esse método) -, como tal, eu diria que é impossível criar um verificador de sintaxe (pelo menos usando eval ou qualquer variação dos mesmos)(* veja os comentários!)
fonte
eval("x=function(){"+t+"}");
}//
ou};{
.Error
, nãoException
.throw new Error('')
causa o comportamento incorreto.Python (95)
fonte
c=u'#\u1e91'
porqueord('#') + ord(u'\u1e91') == 7860
PHP - 140
Comentário necessário para manter o 'hash' (uma cópia descarada de s, ɐɔıʇǝɥʇuʎs). Usando php -l / lint para verificar se há erros.
fonte
C 174
Explicação -Wall necessário para produzir erro do sistema enquanto ainda está sendo compilável. O erro de sintaxe é não.
return 0;
Para inserir via stdin no console do Windows, digite Ctrl-Z após colar e pressione enter.Golfe
Ungolfed:
fonte
T-SQL - 110
Bastante simples, eu tenho vontade de tentar um desafio aqui há um tempo, finalmente consegui fazê-lo. Este não é o código mais chique, mas eu me diverti.
A versão 'golfed'.
Uma versão melhor formatada.
É bastante auto-explicativo, usa SET NOEXEC, o que faz com que apenas analise a consulta em vez de retornar quaisquer resultados. o resto é principalmente a tentativa / captura que eu uso para determinar o que preciso imprimir.
Edição: Eu deveria ter adicionado que isso tecnicamente falhará por si mesmo. porque ele usa SQL dinâmico, qualquer aspas simples na entrada devem ser duplicadas '->' '
fonte