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 asdf
for 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>