Хрупкая Куайн
Хрупкая квинета - это квинна, которая удовлетворяет свойству, заключающемуся в том, что каждая подстрока сделана путем удаления одного символа, когда вычисляется, выдает ошибку.
Например. Если ваша программа 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>
источник
Ответы:
Бурлеск ,
322825 байтПопробуй это здесь.
Таким образом, большинство инструкций в бурлеск - 2 символа. И гораздо проще написать квинку в бурлеск, чем в марбелоусе.
Je!
или^^e!
означает_~
в CJam.источник
Python 3, 45 байт
Переключение на Python 3, чтобы можно было легко удалить завершающий перевод строки.
Я начал с глупой структуры, в которой было 2 переменные вместо 1, но переключение на 1 переменную только сделало его на 4 байта короче.
- (4 + 3) байта от Дениса.
источник
exec
структуру с моим%
трюком, мы получаемc='print(end=len(c)%5*"c=%r;exec(c)"%c)';exec(c)
48 байтов.c='print(end="c=%r;exec(c"%c+c[8*4])';exec(c)
экономит еще 3 байта.Python,
91/9267 байтЭто было весело!
Теперь я знаю об утверждении:
Если символ из строки удален, подтвердите ошибку. Я бы сделал это раньше, если бы знал об этой функции, утверждаю.
источник
Python 2,
515046 байтовПроверьте это на Ideone .
источник
#0
).C #, 145 байт
Я раньше не писал Quine на C #, но более высокие оценки лучше в гольфе, верно? :)
Бесконечный цикл, если символ удаляется из строки или цифра из магического констант 79. Удаление любого другого символа приводит к ошибке компиляции.
Ungolfed:
источник
JavaScript, 90 байт
Работает в консоли Firefox 48 и должен работать в любой другой среде с
uneval
иconsole.log
. Разбивка ошибок:источник
Python 2, 59 байт
Выдает a,
ZeroDivisionError
если 0, 3 или символ удаляются из строки. Удаление другого символа приводит к aNameError
или aSyntaxError
.источник
Груша , 50 байтов
Попробуйте онлайн!
Не самый короткий ответ, но довольно полный; удаление любого символа из этой программы приводит к тому, что она не может проверить контрольную сумму, поэтому интерпретатор A Pear Tree даже не попытается запустить ее. (Например, вы получаете сообщение об ошибке, если удаляете завершающий символ новой строки.)
;#f+QF>
Используется, чтобы гарантировать, что программа в целом имеет CRC-32, равный 0 (иf+QF>
является одной из трех возможных 5-байтовых строк, которые можно поместить в комментарий для достижения этого во время пребывания в ASCII; здесь важно использовать ASCII, потомуrepr
что в противном случае он не сможет правильно выполнить обход в обратном направлении).источник