Хрупкая Куайн
Хрупкая квинета - это квинна, которая удовлетворяет свойству, заключающемуся в том, что каждая подстрока сделана путем удаления одного символа, когда вычисляется, выдает ошибку.
Например. Если ваша программа 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>