Хрупкая Куайн
Хрупкая квинета - это квинна, которая удовлетворяет свойству, заключающемуся в том, что каждая подстрока сделана путем удаления одного символа, когда вычисляется, выдает ошибку.
Например. Если ваша программа asdfявляется quine, то для того, чтобы она была хрупкой, следующие программы должны выдавать ошибку:
sdf
adf
asf
asd
Ваша программа (и все ее подстроки) должны быть полностью детерминированными и должны быть на одном языке. Программа, попадающая в бесконечный цикл (т. Е. Не прерывающая работу), даже если она в конечном итоге не выдает ошибку, считается "сгенерировавшей ошибку" для целей этой задачи.
Применяются стандартные лазейки, включая обычные ограничения quine (например, не в состоянии читать собственный исходный код).
Например, print("foo")не хрупкий. Все эти подстроки должны содержать ошибку:
rint("foo")
pint("foo")
prnt("foo")
prit("foo")
prin("foo")
print"foo")
print(foo")
print("oo")
print("fo")
print("fo")
print("foo)
print("foo"
Те, которые не ошибаются:
print("oo")
print("fo")
print("fo")
Так что это не хрупкий.
Важное примечание о Quines
По общему мнению , любая возможная квинна должна удовлетворять этому:
Должна быть возможность идентифицировать раздел программы, который кодирует другую часть программы. («Разное» означает, что две части появляются в разных позициях.)
Кроме того, квайн не должен иметь доступ к своему собственному источнику, прямо или косвенно.
пример
Поскольку я считаю, что функция JavaScript # toString «читает собственный исходный код», я запрещаю это. Однако, если бы я не запретил это, вот хрупкий quine в JavaScript:
f=(n=b=`f=${f}`)=>(a=(n)==`f=${f}`,n=0,a)&(n!=b)?b:q
тестер
Вот программа, которая, учитывая исходный код вашей программы, генерирует все программы, которые должны выдавать ошибку.
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>