Помилка (або попередження) квінта, яка також є звичайною лайкою [закрита]


9

(Натхненний цим коментарем до старого питання.)

Фон

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

Завдання

У цьому виклику ми шукаємо: що також є помилковим quine. Після виконання програми програма повинна нормально надрукувати власний вихідний код (тобто не як повідомлення про помилку / попередження); це повинно бути належним quine (тобто деяка частина програми повинна кодувати іншу частину результату). Крім того, компіляція та виконання програми також повинні спричинити друк вихідного коду програми - і нічого іншого - як повідомлення про помилки чи попередження. (Зверніть увагу, що це означає, що ви не зможете використовувати помилки під час компіляції на мовах, де вони не дозволяють програмі нормально виконувати.) Отже, іншими словами, вихідний код програми буде надрукований двічі, один раз через кожен метод.

Роз'яснення

  • У більшості випадків буде очевидно, що таке, а не повідомлення про помилку / попередження; ми тут не розрізняємо двох. У неоднозначних випадках визначте повідомлення про помилку / попередження як будь-який текст, який виводиться реалізацією або: 1. як наслідок чогось іншого, ніж виконання команди (або будь-якого найближчого еквівалента в мові); або 2. що не було частиною входу до команди, яка видала його як вихід.
  • Частина помилки / попередження у квитки не повинна бути належною ланкою (хоча в більшості випадків це буде випадково, оскільки більшість повідомлень про помилки та попередження містять значну кількість фіксованого тексту).
  • Програма прийнятна для виведення декількох помилок / попереджень, які утворюють джерело програми при об'єднанні разом. Неприпустимо виводити помилки / попередження, які не відображаються у джерелі.
  • На відміну від багатьох викликів, комутатори, надані компілятору, і ім'я файлу програми, ймовірно, будуть дуже актуальними в цьому виклику. Зважаючи на те, що виклик може бути неможливим інакше, я готовий бути гнучким тут, хоча якщо ви запускаєте реалізацію незвичним чином, пам’ятайте, що правила PPCG стягують за це байтовий штраф (рівний кількості додаткових символів, які вам потрібно буде додати в командному рядку найкоротший "звичайний" спосіб запуску програми), і, таким чином, вам потрібно буде вказати розмір штрафу у своїй посаді. (Наприклад, якщо інтерпретатор, який ви використовуєте, читає програму з файлу і не має особливих обмежень на ім'я файлу, найкоротшим нормальним способом запуску програми було б файл з ім'ям файлу з 1 символом; таким чином,
  • Версія для компілятора / інтерпретатора, яку ви використовуєте, цілком може бути доречною, тому, як частина подання, вкажіть, будь ласка, конкретний компілятор або інтерпретатор, над яким працює ваша програма та яка версія потрібна. (Наприклад, подання на C може містити в заголовку "C (gcc 6.2.0)".)
  • Зауважте, що це завдання можливо не в усіх мовах. На мовах, де він є, найпростішим методом буде, швидше за все, пошук помилки або попереджувального повідомлення, для якого можливо налаштувати деякий підмножина тексту (шляхом зміни назви чогось, що цитується в повідомленні; назви файлів - це звичайний вибір тут, але не єдиний). Я буду особливо вражений (і здивований), якщо хтось знайде спосіб це зробити, використовуючи лише повідомлення про помилки та попередження, текст яких виправлений.

Стан перемоги

Це виклик, тому запис вважається кращим, якщо він має менший кількість байтів. Таким чином, після того, як ваша програма взагалі працює, ви хочете оптимізувати її, щоб максимально знизити кількість байтів. (Однак, не варто перешкоджати, якщо вже є коротший запис, особливо якщо мова йде на іншій мові; те, що ми насправді шукаємо тут, - максимально скоротити певний алгоритм чи ідею програми, але бачити кілька рішення на різних мовах або, які покладаються на різні принципи, завжди варті.)


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

@ Денніс: Я принципово погоджуюся, що ситуація не велика, але з іншого боку не можу придумати конкретного способу її покращення; вилучення виключення з речей, які, очевидно, повідомляють про помилки, ймовірно, можуть призвести до деяких дуже ненавмисних ситуацій на деяких мовах, що може спричинити більший збиток, ніж виліковує; якщо ви думаєте, що можете вдосконалити питання, я не заперечую проти його редагування (і я не думаю, що питання щодо PPCG все одно повинні мати "право власності", хоча це вже інше питання)

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

1
Я поки що зупинив виклик. Я сподіваюся, що ви переглянете її повторним розміщенням у пісочниці. Дуже цікава ідея, і було б соромно відпускати її на сміття.
Денніс

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

Відповіді:


9

JavaScript (Firefox 50), 153 байти

Error: "Error: 1.replace(/.+/,x=>{alert(x=x.replace(1,uneval(x)));throw x.slice(7)})".replace(/.+/,x=>{alert(x=x.replace(1,uneval(x)));throw x.slice(7)})

Пояснення

Ідея тут полягала в тому, щоб почати з найбільш легко модифікованої JS quine, яку я знайшов ще:

".replace(/.+/,x=>alert(uneval(x)+x))".replace(/.+/,x=>alert(uneval(x)+x))

throwКлючове слово є простим способом зробити це кинути свій власний код , а також:

".replace(/.+/,x=>{alert(x=uneval(x)+x);throw x})".replace(/.+/,x=>{alert(x=uneval(x)+x);throw x})

Однак є невелика проблема: Firefox попередньо викидає повідомлення Error:. На щастя, Error: mycodeнасправді дійсний JavaScript! (Щоб дізнатися більше про це, відвідайте MDN .)

Error: ".replace(/.+/,x=>{alert(x=uneval(x)+x);throw x})Error: ".replace(/.+/,x=>{alert(x=uneval(x)+x);throw x})

На жаль, це попереджає неправильну річ:

".replace(/.+/,x=>{alert(x=uneval(x)+x);throw x})Error: ".replace(/.+/,x=>{alert(x=uneval(x)+x);throw x})Error: 

Оскільки лапка вже не знаходиться на початку коду, uneval(x)+xне дасть нам правильного результату. Найкращий спосіб виправити це - додати заповнювач замість вкладеного рядка:

Error: "Error: 1.replace(/.+/,x=>{alert(x=x.replace(1,uneval(x)));throw x})".replace(/.+/,x=>{alert(x=x.replace(1,uneval(x)));throw x})

А-о, тепер у повідомленні Error:про помилку є додаткове . Давайте виправимо це, нарізавши рядок:

Error: "Error: 1.replace(/.+/,x=>{alert(x=x.replace(1,uneval(x)));throw x.slice(7)})".replace(/.+/,x=>{alert(x=x.replace(1,uneval(x)));throw x.slice(7)})

І нарешті, і вихід, і повідомлення про помилку ідентичні коду! Я додав би фрагмент стека, але він, схоже, не працює в фрагменті в жодному браузері.


5

Python 2, 217 80 51 байт

Потрібна подача каналу в рядку.

s='s=%r;print s%%s;exit(s%%s)';print s%s;exit(s%s)

Спробуйте в Інтернеті

Я почав з простої лайки:

s='s=%r;print s%%s';print s%s

Потім я додав raiseв кінці, щоб кинути IOError.

s='s=%r;print s%%s;raise IOError(s%%s)';print s%s;raise IOError(s%s)

На жаль, прослідкування викликало проблеми (я не міг змусити його повністю відійти), і назва винятку завжди друкувалася спереду, як IOError: <code here>, навіть якщо я видаляв трекбек.

Тоді я знайшов цю корисну відповідь і змінив її для своїх цілей.

Потім я виявив, що можу пропустити створення власного класу і просто можу використовувати sys.exit, що робить мій код набагато коротшим.


1
Я не думаю, що це відповідає визначенню помилки в специфіці виклику, оскільки це не є наслідком чогось іншого, ніж виконання команди, а також не є частиною входу до команди, яка виробляла її як вихід . Однак, звичайна exitробота тут просто чудова. Не потрібно sys.
Денніс

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