Un Fragile Quine
Un quine fragile è un quine che soddisfa la proprietà di avere ogni sottostringa rimuovendo un singolo carattere, quando valutato, produce un errore.
Per esempio. Se il tuo programma asdf
è un quine, quindi per essere fragile, i seguenti programmi devono errori:
sdf
adf
asf
asd
Il tuo programma (e tutte le sue sottostringhe) deve essere completamente deterministico e deve essere nella stessa lingua. Un programma che cade in un ciclo infinito (cioè non riesce a terminare), anche se alla fine non produce un errore è considerato "produrre un errore" ai fini di questa sfida.
Si applicano scappatoie standard, comprese le consuete restrizioni di quine (ad esempio, impossibile leggere il proprio codice sorgente).
Ad esempio, print("foo")
non è fragile. Tutte queste sottostringhe devono contenere errori:
rint("foo")
pint("foo")
prnt("foo")
prit("foo")
prin("foo")
print"foo")
print(foo")
print("oo")
print("fo")
print("fo")
print("foo)
print("foo"
Quelli che non sbagliano sono:
print("oo")
print("fo")
print("fo")
Quindi non è fragile.
Una nota importante sulle quines
Per consenso , ogni possibile quine deve soddisfare questo:
Deve essere possibile identificare una sezione del programma che codifica una parte diversa del programma. ("Diverso" significa che le due parti appaiono in posizioni diverse.)
Inoltre, un quine non deve accedere alla propria fonte, direttamente o indirettamente.
Esempio
Dato che considero la funzione # toString di JavaScript "lettura del proprio codice sorgente", non lo autorizzo. Tuttavia, se non dovessi escluderlo, ecco un fragile quine in JavaScript:
f=(n=b=`f=${f}`)=>(a=(n)==`f=${f}`,n=0,a)&(n!=b)?b:q
Tester
Ecco un programma che, dato il codice sorgente del tuo programma, genera tutti i programmi che devono presentare errori.
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>