Sua tarefa é simples: escreva um programa (ou função) que não aceite e não envie (ou retorne) seu código-fonte. O problema é que, quando o programa é empacotado "quotes"
(caractere Unicode 34), ele deve emitir novamente seu código-fonte (agora citado).
Aplicam-se regras padrão para quines. Isso é código-golfe , então o programa mais curto (em bytes) vence.
!
..."
? Alguns idiomas suportam dois ou três caracteres de aspas.Respostas:
Noodel ,
97 bytesEsta versão funciona da mesma maneira que a outra, só que eu esqueci que o Noodel tem uma maneira de executar um bloco de código uma vez e eu fiz o idioma ...
Ḷ1ḥ-Ð1ḥ@€
Tente:)
Como funciona
Quote-Safety
A colocação do
"
caractere antes e depois do programa funciona porque o Noodel possui um conjunto de caracteres dedicados ao que chamo de imprimíveis . Eles são analisados imediatamente como literais de string quando colocados sozinhos e permitem imprimir facilmente algo na tela. Portanto, diferentemente da maioria dos idiomas, Noodel vê o conjunto ASCII normal que é considerado digno de impressão como literal de string direta (exceto espaço e alimentação de linha), citando o código apenas como sendo pressionado por strings."Tente:)"
Trechos
fonte
e
é válido. A pergunta não pede o caractere codificado como o byte 34, mas o caractere Unicode 34. Independentemente da codificação usada, existe apenas um:"
"
? (Desculpe, apenas tentando ter certeza de que entendi o que você está dizendo) Além disso, devo remover todo o texto da resposta referente ao usoe
?"
funciona, eu apenas removia a discussão e simplesmente usava"
.Python
23,181152130124122 bytesExperimente online! O TIO vem com um cabeçalho e rodapé que testa automaticamente a validade do quine. Você pode limpá-los para apenas executar o quine.
Esse código funciona usando as seqüências de caracteres triplas no Python.
""" """
é igual a' '
e"""" """
é igual a'" '
.O código usa
exec
, mas não a maneira "não-eficiente" de executar dados como código, apenas para definir uma variável de dentro de uma expressão. oexec
está codificado corretamente nos dados.A primeira instrução compara a string, possivelmente com uma citação anexada, a
" "
e define a variáveloct
acordo. (A variável poderia ter sido curta).O restante do código implementa a quine tradicional do Python usando
%r
formatação de string, com algum código adicional que retira as aspas extras seoct
não for alterado.Uma versão alternativa usando o "barato"
exec
vem em 126 bytes com menos código repetido:Experimente online!
fonte
StandardML ,
182 176108 bytesVersão sem aspas : Experimente no codingground.
Versão citada : Experimente no codingground.
Observe que a saída se parece com isso
porque o código é interpretado declaração por declaração (cada
;
uma termina uma declaração) e mostra o valor e o tipo de cada declaração.fundo
No SML, existe um quine do formulário
<code>"<code in quotes>"
:e um na forma
"<code in quotes>"<code>
:Ambos confiam no fato de que a
<code>
parte-não contém aspas e, portanto, pode ser citada sem a necessidade de escapar de nada, o"
necessário para produzir a coluna é dado porstr(chr 34)
.Eles também dependem muito do identificador implícito
it
que é usado quando nenhum identificador explícito é fornecido em uma declaração.Na primeira linha,
str(chr 34);
ligait
- se à cadeia que contém"
,fn x=>
inicia uma função anônima usando um argumentox
, concatenax^it^x^it
e imprime a string resultante. Essa função anônima é aplicada diretamente a uma sequência que contém o código do programa, portanto a concatenaçãox^it^x^it
gera<code>"<code>"
.O segundo quine começa com apenas o código do programa como string ao
";str(chr 34)^it;print(it^it)";
qual está vinculadoit
. Entãostr(chr 34)^it;
concatena uma cotação para o início da sequência e, como nenhum identificador explícito é fornecido, a sequência resultante"<code>
é vinculadait
. Por fim,print(it^it)
concatena a string com ela mesma, produzindo a"<code>"<code>
qual é impressa.Explicação
Editar: não está mais atualizado com a versão de 108 bytes, no entanto, pode-se entender também depois de ler esta explicação.
O quine seguro para cotação combina as duas abordagens acima e é ele próprio da forma
"<code>"<code>
. Colocando isso novamente entre aspas""<code>"<code>"
, obtemos uma string vazia e, em seguida, uma coluna da outra forma.Isso significa que o programa recebe sua própria fonte no formulário
"<code>
pelo identificadorit
ouit
é justo"
e recebemos nossa própria fonte<code>
como argumento e, portanto, deve ser uma função que lida com esse argumento.Para identificar em qual caso estamos, verificamos se o tamanho de
it
é maior que 1. Se não, entãoit
é"
e estamos no segundo caso, portanto, aelse
parte-retorna uma função anônimafn x=>print(it^it^x^it^x^it)
que é chamada então porque é seguida pela origem como string . Observe a liderançait^it^
necessária para a sequência vazia no início do programa.Se
size it
for maior que 1, estamos nathen
parte e apenas executamosprint(it^it)
, certo? Não exatamente porque deixei de lhe dizer que SML é fortemente tipado, o que significa que uma condicionalif <cond> then <exp_1> else <exp_2>
deve sempre ter o mesmo tipo, o que novamente significa que as expressões<exp_1>
e<exp_2>
precisam ter o mesmo tipo. Já sabemos o tipo daelse
peça: uma função anônima que pega uma string e depois chamaprint
possui typestring -> <return type of print>
, eprint
typestring -> unit
(unit
é de alguma forma semelhante avoid
outros idiomas), portanto o tipo resultante é novamentestring -> unit
.Portanto, se a
then
peça tivesse apenas oprint(it^it)
tipounit
, receberíamos um erro de incompatibilidade de tipo. Então, que talfn _=>print(it^it)
? (_
é um curinga para um argumento que não é usado) Essa função anônima, por si só, possui um tipo'a -> unit
onde'a
representa um tipo arbitrário; portanto, no contexto de nossa condicional que aplica umstring -> unit
tipo, isso funcionaria. (A variável type'a
é instanciada com typestring
.) No entanto, nesse caso, não imprimiríamos nada, pois a função anônima nunca é chamada! Lembre-se, quando entramos nathen
parte -part, o código geral é"<code>"<code>
, então a<code>
parte-avalia como uma função, mas, como nada vem depois dela, ela não é chamada.Em vez disso, usamos uma sequencialização que tem a forma para
(<exp_1>; ...; <exp_n>)
onde pode ter tipos arbitrários e o tipo de fornece o tipo de toda a sequencialização. Do ponto de vista funcional, os valores de to são simplesmente descartados, no entanto, o SML também suporta construções imperativas, para que as expressões possam ter efeitos colaterais. Em resumo, tomamos como parte, imprimindo primeiro e retornando a função que tem o tipo correto.<exp_1>
<exp_n-1>
<exp_n>
<exp_1>
<exp_n-1>
(print(it^it);print)
then
print
fonte
V ,
27, 23 bytesExperimente online!
Como contém alguns caracteres não imprimíveis, aqui está uma versão legível:
e aqui está um hexdump:
Então a primeira coisa que precisamos fazer é determinar se o primeiro caractere é uma citação.
éP
insere um caractere de 'P', mas"éP
é um NOOP. Depois disso, corremos uma ligeira modificação na Quine extensível padrão, que é:Nós vamos fazer isso de maneira um pouco diferente. Primeiro, precisamos inserir o texto "éP" inicial. Então nós fazemos
Aqui é onde a ramificação acontece. O texto atualmente no buffer é
A menos que envolveu-o entre aspas, nesse caso, o 'P' nunca teria sido inserido, e o buffer é:
Como ainda estamos gravando, podemos fazer o que quisermos aqui, e ele será adicionado ao buffer quando isso
"qp
acontecer. Portanto, a partir daqui, é muito fácil excluir as aspas condicionalmente:fonte
JavaScript (ES6),
239237 bytesTente experimentar cada versão em um ambiente novo (por exemplo, uma nova guia do navegador)
Tem que haver pelo menos uma maneira de simplificar isso ...
fonte