Um Quine frágil

30

Um Quine frágil

Um quine frágil é um quine que satisfaz a propriedade de fazer cada substring removendo um único caractere, quando avaliado, produz um erro.

Por exemplo. Se o seu programa asdffor um quine, para que seja frágil, os seguintes programas deverão apresentar um erro:

sdf
adf
asf
asd

Seu programa (e todas as suas substrings) deve ser totalmente determinístico e deve estar no mesmo idioma. Um programa que cai em um loop infinito (ou seja, falha ao finalizar), mesmo que não produza eventualmente um erro, é considerado "produzido um erro" para os propósitos deste desafio.

Aplicam-se brechas padrão, incluindo as restrições usuais de quine (por exemplo, incapazes de ler o próprio código-fonte).

Por exemplo, print("foo")não é frágil. Todas essas substrings devem ter erro:

rint("foo")
pint("foo")
prnt("foo")
prit("foo")
prin("foo")
print"foo")
print(foo")
print("oo")
print("fo")
print("fo")
print("foo)
print("foo"

Os que não cometem erros são:

print("oo")
print("fo")
print("fo")

Portanto, não é frágil.

Uma nota importante sobre os peixes

Por consenso , qualquer solução possível deve satisfazer isso:

Deve ser possível identificar uma seção do programa que codifique uma parte diferente do programa. ("Diferente" significa que as duas partes aparecem em posições diferentes.)

Além disso, um quine não deve acessar sua própria fonte, direta ou indiretamente.

Exemplo

Como considero a função # toString do JavaScript "lendo seu próprio código-fonte", eu a desaprovo. No entanto, se eu não o proibisse, aqui está um quine frágil no JavaScript:

f=(n=b=`f=${f}`)=>(a=(n)==`f=${f}`,n=0,a)&(n!=b)?b:q

Testador

Aqui está um programa que, dado o código fonte do seu programa, gera todos os programas que devem ter erro.

let f = (s) =>
  [...Array(s.length).keys()].map(i =>
    s.slice(0, i) + s.slice(i + 1)).join("\n");

let update = () => {
  output.innerHTML = "";
  output.appendChild(document.createTextNode(f(input.value)));
};

input.addEventListener("change", update);

update();
#output {
  white-space: pre;
}

#input, #output {
  font-family: Consolas, monospace;
}
<input id="input" value="print('foo')">
<div id="output"></div>

Conor O'Brien
fonte
Estou autorizado a HQ9 +?
Oliver Ni
1
@OliverNi No
Conor O'Brien
3
Isso está fazendo suposições sobre os recursos de idioma - nem todos os idiomas têm "erros".
Mego
2
Também são permitidos loops infinitos do @Mego, em vez de erros. Toda linguagem completa de Turing possui infinitas voltas.
feersum 6/09/16
1
@ Mega que é irrelevante. Por que se incomodar em trazer o caso geral se apenas um subconjunto finito se aplica por problema?
Conor O'Brien

Respostas:

6

Burlesco ,32. 28. 25 bytes

{3SHWD{Je!}.+{Sh}\msh}Je!

Experimente aqui.

Portanto, a maioria das instruções em burlesco tem 2 caracteres. E é muito mais fácil escrever um quine em burlesco do que em Marbelous. Je!ou ^^e!significa _~em CJam.

jimmy23013
fonte
1
Espere ... se isso não é golfe (e é de longe o mais curto aqui), então não consigo imaginar o que é golfe! +1
Daniel
@ Dopapp O problema é que o Burlesque tem muitas instruções, então é muito provável que eu tenha perdido alguma coisa.
precisa saber é o seguinte
11

Python 3, 45 bytes

c='print(end="c=%r;exec(c"%c+c[8*4])';exec(c)

Alterne para o Python 3 para que a nova linha à direita possa ser facilmente removida.

Comecei com uma estrutura estúpida que tinha 2 variáveis ​​em vez de 1, mas alternar para 1 variável apenas o tornou 4 bytes mais curto.

- (4 + 3) bytes por Dennis.

feersum
fonte
não sabia sobre afirmar. Bom trabalho
Destructible Lemon
2
Seria ótimo se você adicionar uma explicação.
Sarge Borsch 6/16
Combinando sua execestrutura com meu %truque, há c='print(end=len(c)%5*"c=%r;exec(c)"%c)';exec(c)48 bytes.
Dennis
1
c='print(end="c=%r;exec(c"%c+c[8*4])';exec(c)economiza mais 3 bytes.
Dennis
7

Python, 91/92 67 bytes

Isso foi divertido!

Agora eu sei sobre afirmar:

s='s=%r;assert len(s)==34;print(s%%s)';assert len(s)==34;print(s%s)

Se um caractere da string for removido, afirme o erro. Eu teria feito isso antes se soubesse desse recurso, afirme.

Limão destrutível
fonte
2
Esqueci a pergunta final da nova linha ... se você contar, então nossas respostas são inválidas, pois ela pode ser removida com segurança.
feersum
7

Python 2, 51 50 46 bytes

lambda s='lambda s=%r:s[22:]%%s%%s':s[22:]%s%s

Verifique no Ideone .

Dennis
fonte
Quines de função são realmente permitidos.
Conor O'Brien
1
Hã? Eu nunca ouvi falar de funções permitidas como quines ... existem exemplos para isso?
feersum 6/09/16
@feersum A consulta javascript quine produz alguns resultados.
Dennis
@feersum, o padrão Mathematica quine também é baseado em funções (usando #0).
Martin Ender
2
Acabei de dar uma olhada e a maioria dos jines JS ou Mathematica também chamam a função. Portanto, seria mais correto chamá-los de quines REPL. Dito isto, o exemplo fornecido por Conor na especificação deste desafio é apenas uma função, então acho que pelo menos é válido aqui.
Martin Ender
4

C #, 145 bytes

_=>{var@s="_=>{{var@s={1}{0}{1};for(;79!=s.Length;){{}}System.Console.Write(s,s,'{1}');}};";for(;79!=s.Length;){}System.Console.Write(s,s,'"');};

Eu não escrevi um quine em C # antes, mas pontuações mais altas são melhores no golfe, certo? :)

Loop infinito se um caractere for removido da string ou um dígito da const mágica 79. A remoção de qualquer outro caractere resulta em um erro de compilação.

Ungolfed:

/* Action<object> Quine = */ _ => // unused parameter
{
    // String of the function (well, mostly).
    // {0} placeholder for s, so the output contains the function and string.
    // {1} placeholder for " since it requires escaping.
    var@s = "_=>{{var@s={1}{0}{1};for(;79!=s.Length;){{}}System.Console.Write(s,s,'{1}');}};";

    // Infinite loop if a char is removed from the above string or if the 7 or 9 is removed.
    for(;79!=s.Length;){}

    // Print the quine.
    System.Console.Write(s,s,'"');
};
leite
fonte
3

JavaScript, 90 bytes

a="a=%s;a[44]!=')'?x:console.log(a,uneval(''+a))";a[44]!=')'?x:console.log(a,uneval(''+a))

Funciona no console do Firefox 48 e deve funcionar em qualquer outro ambiente com unevale console.log. Repartição dos erros:

a="                                             "; [  ]!=' '?x:           (a       (''+a))   // SyntaxError
   a=%s;a[44]!=')'?x:console.log(a,uneval(''+a))  a 44    )                                  // ReferenceError from calling `x`
                                                               console.     ,uneval          // ReferenceError from calling `onsole.log`, `auneval`, etc.
                                                                       log                   // TypeError from calling `console.og`, etc.
ETHproductions
fonte
Uau, não sabia sobre uneval. Além disso, prazer em vê-lo pelo menos um pouco de volta! : D
Conor O'Brien
@ ConorO'Brien É bom estar (pelo menos um pouco) de volta! Eu publiquei um casal mais Quine-y respostas usando esta técnica.
ETHproductions
2

Python 2, 59 bytes

x='x=%r;1/(len(x)==30);print x%%x';1/(len(x)==30);print x%x

Isso gera a ZeroDivisionErrorse um 0, um 3 ou um caractere for removido da string. A remoção de um caractere diferente resulta em a NameErrorou a SyntaxError.

Daniel
fonte
2

Uma pereira , 50 bytes

a="print('a='.repr(a).';eval(a)');#f+QF>";eval(a)

Experimente online!

Não é a resposta mais curta, mas bastante abrangente; qualquer exclusão de caractere desse programa faz com que ele falhe na soma de verificação; portanto, o intérprete A Pear Tree nem tentará executá-lo. (Por exemplo, você recebe um erro se excluir a nova linha à direita.) Ele ;#f+QF>é usado para garantir que o programa como um todo tenha um CRC-32 igual a 0 (e f+QF>é uma das três seqüências possíveis de 5 bytes que podem ser colocadas em o comentário para conseguir isso enquanto estiver no ASCII; o uso do ASCII é importante aqui, porque repr, caso contrário, não ocorreria o ida e volta).


fonte