Крихка королева


30

Крихка королева

Неміцна квінка - це лайка, яка задовольняє властивість створення кожної підрядки шляхом видалення одного символу, коли оцінюється, створює помилку.

Наприклад. Якщо ваша програма asdfє кволою, такі програми повинні бути помилковими:

sdf
adf
asf
asd

Ваша програма (і всі її підрядки) повинні бути повністю детермінованими та мати однакову мову. Програма, що потрапляє в нескінченний цикл (тобто не вдається припинити), навіть якщо в кінцевому підсумку не призведе до помилки, вважається "помилкою" для цілей цього виклику.

Застосовуються стандартні лазівки, включаючи звичайні обмеження для квин (наприклад, не в змозі прочитати власний вихідний код).

Наприклад, 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")

Тож воно не тендітне.

Важлива примітка про лайках

За консенсусом , будь-яка можлива квітка повинна задовольняти цьому:

Повинно бути можливим визначити розділ програми, який кодує іншу частину програми. ("Різне" означає, що обидві частини відображаються в різних положеннях.)

Крім того, квітка не повинна мати прямий чи опосередкований доступ до власного джерела.

Приклад

Оскільки я вважаю функцію # toString JavaScript "читанням власного вихідного коду", я забороняю її. Однак, якщо я не заборонив його, ось тендітна лайка у 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 Ні
Conor O'Brien

3
Це робить припущення щодо особливостей мови - не всі мови мають "помилки".
Mego

2
@Mego Нескінченні цикли також допускаються замість помилок. Кожна мова Тюрінга має нескінченну кількість циклів.
feersum

1
@Mego це не має значення. Навіщо навіть турбуватися під час загального випадку, якщо для кожної проблеми застосовується лише кінцевий підмножина?
Conor O'Brien

Відповіді:


6

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

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

Спробуйте тут.

Тож більшість інструкцій в Бурлеску - це 2 символи. І набагато простіше написати квінку в бурлеску, ніж в Марбелосі. Je!або ^^e!означає _~в CJam.


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) байт Денніса.


не знав про ствердження. Гарна робота
Зруйнований лимон

2
Було б чудово, якщо ви додасте пояснення.
Sarge Borsch

Поєднавши свою 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

Пітон, 91/92 67 байт

Це було весело!

Тепер я знаю про твердження:

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

Якщо значок із рядка видалено, стверджуйте про помилку. Я би зробив це раніше, якби знав про цю особливість, запевняю.


2
Я забув про останнє запитання про новий рядок ... якщо ви його порахуєте, то наші відповіді недійсні, оскільки його можна безпечно видалити.
feersum

7

Python 2, 51 50 46 байт

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

Перевірте це на Ideone .


Функціональні лайки дійсно дозволені.
Conor O'Brien

1
Так? Я ніколи не чув, щоб функції дозволені як лайки ... чи є приклади для цього?
feersum

@feersum Запит JavaScript quine дає кілька результатів.
Денніс

@feersum стандартна квітка Mathematica також заснована на функціях (за допомогою #0).
Мартін Ендер

2
Я просто мав інший вигляд, і більшість лайків JS або Mathematica насправді також називають функцію. Тому правильніше було б називати їх лайками REPL. При цьому, приклад, наданий Конором у специфіці цього виклику, є лише функцією, тому я припускаю, що принаймні тут він дійсний.
Мартін Ендер

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,'"');};

Я раніше не писав лайки в C #, але більш високі бали краще в гольфі, правда? :)

Нескінченний цикл, якщо значок вилучено з рядка або цифра з магічного констату 79. Видалення будь-яких інших символів призводить до помилки компіляції.

Безголовки:

/* 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.

Нічого не знав про нерівність. Також приємно бачити вас хоч трохи назад! : D
Conor O'Brien

@ 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

При цьому ZeroDivisionErrorвиводиться символ, якщо з рядка видалено символ 0, 3 або символ. Видалення іншого символу призводить до NameErrorабо а 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в іншому випадку це не вдасться правильно обійти).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.