Хрупкая Куайн

30

Хрупкая Куайн

Хрупкая квинета - это квинна, которая удовлетворяет свойству, заключающемуся в том, что каждая подстрока сделана путем удаления одного символа, когда вычисляется, выдает ошибку.

Например. Если ваша программа 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>

Конор О'Брайен
источник
Могу ли я получить HQ9 +?
Оливер Ни
1
@OliverNi Нет
Конор О'Брайен,
3
Это делает предположения о языковых особенностях - не все языки имеют «ошибки».
Mego
2
@Mego Бесконечные циклы также допускаются вместо ошибок. Каждый полный по Тьюрингу язык имеет бесконечные циклы.
feersum
1
@ Мего это не имеет значения. Зачем вообще поднимать общий случай, если для каждой задачи применяется только конечное подмножество?
Конор О'Брайен

Ответы:

6

Бурлеск ,32 28 25 байт

{3SHWD{Je!}.+{Sh}\msh}Je!

Попробуй это здесь.

Таким образом, большинство инструкций в бурлеск - 2 символа. И гораздо проще написать квинку в бурлеск, чем в марбелоусе. Je!или ^^e!означает _~в CJam.

jimmy23013
источник
1
Подождите ... если это не игра в гольф (и, безусловно, самая короткая здесь), то я не могу представить, что такое гольф! +1
Даниил
@Dopapp Проблема в том, что у Бурлеск слишком много инструкций, так что, скорее всего, я что-то пропустил.
jimmy23013
11

Python 3, 45 байт

c='print(end="c=%r;exec(c"%c+c[8*4])';exec(c)

Переключение на Python 3, чтобы можно было легко удалить завершающий перевод строки.

Я начал с глупой структуры, в которой было 2 переменные вместо 1, но переключение на 1 переменную только сделало его на 4 байта короче.

- (4 + 3) байта от Дениса.

feersum
источник
не знал об утверждении. Хорошая работа
Разрушаемый Лимон
2
Было бы здорово, если бы вы добавили объяснение.
Сардж Борщ
Объединяя вашу execструктуру с моим %трюком, мы получаем c='print(end=len(c)%5*"c=%r;exec(c)"%c)';exec(c)48 байтов.
Деннис
1
c='print(end="c=%r;exec(c"%c+c[8*4])';exec(c)экономит еще 3 байта.
Деннис
7

Python, 91/92 67 байт

Это было весело!

Теперь я знаю об утверждении:

s='s=%r;assert len(s)==34;print(s%%s)';assert len(s)==34;print(s%s)

Если символ из строки удален, подтвердите ошибку. Я бы сделал это раньше, если бы знал об этой функции, утверждаю.

Разрушаемый Лимон
источник
2
Я забыл о последнем вопросе новой строки ... если вы посчитаете его, то наши ответы будут недействительными, поскольку их можно безопасно удалить.
февраля
7

Python 2, 51 50 46 байтов

lambda s='lambda s=%r:s[22:]%%s%%s':s[22:]%s%s

Проверьте это на Ideone .

Деннис
источник
Квины функций действительно разрешены.
Конор О'Брайен
1
А? Я никогда не слышал о том, чтобы функции были разрешены в качестве quines ... есть ли примеры для этого?
feersum
@feersum Quine javascript запроса дает несколько результатов.
Деннис
@feersum стандартное приложение Mathematica quine также основано на использовании (использовании #0).
Мартин Эндер
2
Я только что посмотрел по-другому, и большинство JS или Mathematica quines фактически также вызывают функцию. Так что было бы правильнее называть их реплином. Тем не менее, пример, предоставленный Конором в спецификации этого вызова, является просто функцией, так что я думаю, что, по крайней мере, она здесь действительна.
Мартин Эндер
4

C #, 145 байт

_=>{var@s="_=>{{var@s={1}{0}{1};for(;79!=s.Length;){{}}System.Console.Write(s,s,'{1}');}};";for(;79!=s.Length;){}System.Console.Write(s,s,'"');};

Я раньше не писал Quine на C #, но более высокие оценки лучше в гольфе, верно? :)

Бесконечный цикл, если символ удаляется из строки или цифра из магического констант 79. Удаление любого другого символа приводит к ошибке компиляции.

Ungolfed:

/* Action<object> Quine = */ _ => // unused parameter
{
    // String of the function (well, mostly).
    // {0} placeholder for s, so the output contains the function and string.
    // {1} placeholder for " since it requires escaping.
    var@s = "_=>{{var@s={1}{0}{1};for(;79!=s.Length;){{}}System.Console.Write(s,s,'{1}');}};";

    // Infinite loop if a char is removed from the above string or if the 7 or 9 is removed.
    for(;79!=s.Length;){}

    // Print the quine.
    System.Console.Write(s,s,'"');
};
молоко
источник
3

JavaScript, 90 байт

a="a=%s;a[44]!=')'?x:console.log(a,uneval(''+a))";a[44]!=')'?x:console.log(a,uneval(''+a))

Работает в консоли Firefox 48 и должен работать в любой другой среде с unevalи console.log. Разбивка ошибок:

a="                                             "; [  ]!=' '?x:           (a       (''+a))   // SyntaxError
   a=%s;a[44]!=')'?x:console.log(a,uneval(''+a))  a 44    )                                  // ReferenceError from calling `x`
                                                               console.     ,uneval          // ReferenceError from calling `onsole.log`, `auneval`, etc.
                                                                       log                   // TypeError from calling `console.og`, etc.
ETHproductions
источник
Вау, не знал о неравных. Также приятно видеть вас хоть немного назад! : D
Конор О'Брайен
@ ConorO'Brien Приятно (хотя бы немного) вернуться! Я отправил несколько более Куайн-Y ответы , используя эту технику.
ETHproductions
2

Python 2, 59 байт

x='x=%r;1/(len(x)==30);print x%%x';1/(len(x)==30);print x%x

Выдает a, ZeroDivisionErrorесли 0, 3 или символ удаляются из строки. Удаление другого символа приводит к a NameErrorили a SyntaxError.

Даниил
источник
2

Груша , 50 байтов

a="print('a='.repr(a).';eval(a)');#f+QF>";eval(a)

Попробуйте онлайн!

Не самый короткий ответ, но довольно полный; удаление любого символа из этой программы приводит к тому, что она не может проверить контрольную сумму, поэтому интерпретатор A Pear Tree даже не попытается запустить ее. (Например, вы получаете сообщение об ошибке, если удаляете завершающий символ новой строки.) ;#f+QF>Используется, чтобы гарантировать, что программа в целом имеет CRC-32, равный 0 (и f+QF>является одной из трех возможных 5-байтовых строк, которые можно поместить в комментарий для достижения этого во время пребывания в ASCII; здесь важно использовать ASCII, потому reprчто в противном случае он не сможет правильно выполнить обход в обратном направлении).


источник