Un quine fragile
Un quine fragile est un quine qui satisfait la propriété d'avoir chaque sous-chaîne faite en supprimant un seul caractère, lorsqu'elle est évaluée, produit une erreur.
Par exemple. Si votre programme asdf
est une quine, alors pour qu'il soit fragile, les programmes suivants doivent afficher une erreur:
sdf
adf
asf
asd
Votre programme (et toutes ses sous-chaînes) doit être entièrement déterministe et doit être dans la même langue. Un programme tombant dans une boucle infinie (c'est-à-dire ne se terminant pas), même s'il ne produit finalement pas d'erreur, est considéré comme "produisant une erreur" aux fins de ce défi.
Les failles standard s'appliquent, y compris les restrictions de quine habituelles (par exemple, pas en mesure de lire son propre code source).
Par exemple, print("foo")
n'est pas fragile. Toutes ces sous-chaînes doivent contenir des erreurs:
rint("foo")
pint("foo")
prnt("foo")
prit("foo")
prin("foo")
print"foo")
print(foo")
print("oo")
print("fo")
print("fo")
print("foo)
print("foo"
Ceux qui ne font pas d'erreur sont:
print("oo")
print("fo")
print("fo")
Ce n'est donc pas fragile.
Une note importante sur les quines
Par consensus , toute quine possible doit satisfaire à ceci:
Il doit être possible d'identifier une section du programme qui code pour une autre partie du programme. ("Différent" signifie que les deux parties apparaissent dans des positions différentes.)
De plus, un quine ne doit pas accéder à sa propre source, directement ou indirectement.
Exemple
Étant donné que je considère la fonction # toString de JavaScript comme "la lecture de son propre code source", je la rejette. Cependant, si je ne l'interdisais pas, voici une quine fragile en JavaScript:
f=(n=b=`f=${f}`)=>(a=(n)==`f=${f}`,n=0,a)&(n!=b)?b:q
Testeur
Voici un programme qui, compte tenu du code source de votre programme, génère tous les programmes qui doivent être en erreur.
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>