Найкоротше повідомлення про помилку


135

Виклик

Напишіть найкоротшу програму, яка при компілюванні чи виконанні видає повідомлення про фатальну помилку, меншу, ніж сама програма. Повідомлення про помилку може не генеруватися самою програмою, наприклад, Python raise. Дійсна відповідь повинна містити і код, і повідомлення про помилку. Виграє найкоротша правильна відповідь.

Жодне повідомлення про помилку не вважається повідомленням про помилку.

Приклад (Lua)

Код (46 байт):

[
--aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

Помилка (45 байт):

[string "[..."]:1: unexpected symbol near '['

Коментарі не для розширеного обговорення; ця розмова переміщена до чату .
Денніс

1
@Dennis Я думаю, що це один із способів вирішення проблеми "ОП не редагує роз'яснення під питанням".
Ørjan Johansen

1
Дякуємо, що прийняли мою відповідь, яка отримала найбільше голосів; однак це було позначено кодом-гольф , тому ви повинні прийняти цю відповідь , яка є найкоротшою.
MD XF

@smartpeople це: " __main__.CodeException: Raised an &rror." моя помилка чи це така: " Raised an &rror."
FantaC

TrumpScript працює в Китаї?
Стен Струм

Відповіді:


58

ред. , 3 байти

Примітка: Більшість відповідей тут ігнорує прорисований новий рядок як частину повідомлення про помилку в їх кількості. Але я не бачу нічого в питанні, яке б виправдовувало її ігнорування, і автор прокоментував, що слід включити новий рядок . Тому, якщо питання не буде змінено, я його включаю.

Код (із заднім рядком):

??

Помилка (із заднім рядком):

?


19
Власне, це неможливо перемогти. : P
повністюлюдський

1
Чи можна редагувати додавання та тестування первинності? Або це не потрібно для такого типу викликів?
Стівен

4
@StepHen Так, він може робити тестування додавання та первинності в унарній формі, використовуючи звичайний трюк із зворотними регенераціями.
Anders Kaseorg

1
Дуже розумно, але "?" не є смертельним.
Марк Плотнік

2
Як зазначено в прапорі, помилка є фатальною, якщо код не читається з терміналу. Спробуйте в Інтернеті!
Денніс

59

C (сучасний Linux), 19 байт

Зробив би мого знаменитого сегментарію, але абсолютно нелюдський його вкрав.

main(){longjmp(0);}

Вихід (18 байт):

Segmentation fault

У вас зараз більший бал, ніж у мене, так що ... Безпрограшний?
повністюлюдський


Чи немає іншого локалу із скороченою версією (щоб потім ви могли використовувати main(){main();})?
12431234123412341234123

@ 12431234123412341234123 Не те, що я знаю. Крім того, main(){main();}не гарантовано виникла помилка.
MD XF

1
@MDXF Гарантії немає (і при ввімкненій оптимізації в gcc або clang, вона опиняється в нескінченному циклі або ігнорує виклик). Але на Code Golf нам потрібна робоча реалізація, а не гарантія.
12431234123412341234123


34

JavaScript (Firefox), 31 байт

# This is a comment, right? ...

Ця помилка:

SyntaxError: illegal character

Тестовано на консолі Firefox 54.0.1 у Windows 7.


26

Python 2 , 87 79 байт

-8 байт завдяки Захарі та Еріку Похиту.

from __future__ import braces
#i am most surely seriously actually totallyhuman

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

Повідомлення про помилку, 78 байт:

Припустимо, що код зберігається у файлі з назвою a.

  File "a", line 1
    from __future__ import braces
SyntaxError: not a chance

Це насправді приємна маленька писанка в Python. : D


1
Ви можете припустити однозначне ім'я файлу!
Zacharý

1
Припускаючи 1-char ім'я файлу, ви можете перейти до цього .
Ерік Аутгольфер

Хе, приємно. - - -
тотальнолюдський

1
Але повідомлення про помилку має бути меншим, ніж сама програма ...
Leaky Nun

1
Якщо ви використовуєте IDLE, ви можете отримати \s\sFile "<stdin>", line 1\nSyntaxError: not a chanceлише 50 байт [ \sце пробіл і \nце новий рядок], тож ви можете отримати програму на 51 байт ..
boboquack

20

Haskell, 13 байт

main = (main)

Збережіть як t.hsчи інше ім’я з одним символом, компілюйте ghcі запускайте. Повідомлення про помилку (із заднім рядком):

t: <<loop>>

19

Таксі , 38 21 байт

Switch to plan "abc".

Виробляє:

error: no such label

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

-17 байт завдяки інженеру Toast

Намагається перейти на "abc", якого не існує. Ви б [abc]десь були.


4
Ви можете опуститись до 21 байта при Switch to plan "abc".створенні error: no such label. Це може бути однією з небагатьох проблем із кодовим гольфом, де таксі перемагає деякі традиційні мови.
Інженер Тост

@EngineerToast дякую, не думав про це.
Стівен

18

> <> , 26 байт

>>>>>>>>>>>>>>>>>>>>>>>>>:

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

Кожне повідомлення про помилку у Fish є something smells fishy..., тому це просто переміщує вказівник достатньо право в рази, щоб бути довшим за це, і намагається дублювати верхню частину стека, яка на даний момент порожня.


2
Мені це подобається, і це, безумовно, найбільш рибне з усіх рішень :-)
Ксан-Кун Кларк-Девіс,

@ Xan-KunClark-Davis зітхнув, що ти повинен був ...: P
HyperNeutrino

18

JavaScript (Firefox), 21 байт

(a=null)=>a.charAt(1)

Помилка (20 байт) :TypeError: a is null


2
D'oh! Я знав, що є коротший ...
ETHproductions

У мене була така ж ідея, я придумав a = null; a.x01234567890 Така сама кількість байтів
RuteNL

16

Оболонка системи V, 25 байт

mount /dev/hda1 /mnt/hda1

Повідомлення про помилку (23 байти):

mount: not a typewriter

"Не друкарська машинка" або ENOTTYкод помилки, визначений в errno.hсистемах Unix. Це використовується для вказівки, що в виклику системи ioctl було вказано недійсне число йоктл (контроль вводу / виводу). У моїй системі в /usr/include/asm-generic/errno-base.h, я можу знайти цей рядок:

#define ENOTTY          25      /* Not a typewriter */

У версії 6 UNIX і пізнішої версії введення / виведення обмежувалося послідовно підключеними термінальними пристроями, такими як телетайп (TTY). Вони, як правило , вдалося через gttyта sttyсистемні виклики. Якби спробувати використовувати будь-який із цих системних дзвінків на нетермінальному пристрої, ENOTTYбуло створено.

У наш час, природно, немає необхідності використовувати телетайп. Коли gttyі sttyзамінили ioctl, ENOTTYзберігали. Деякі системи все ще відображають це повідомлення; але більшість кажуть натомість "невідповідний йоктл для пристрою".


Будь ласка, поясніть ...
Мега Ман

@MegaMan Оновлено з поясненнями.
MD XF

1
Резюме для насправді освітянського пояснення.
Ксан-Кун Кларк-Девіс,

11

QBasic, 11 байт

У QBasic є два рішення з 11 байтів, одне з яких може бути подано в гольф. Найкоротше повідомлення про помилку, яке має QBasic, є overflowі може спрацьовувати як таке:

i%=i%+32677

Це кидає, overflowоскільки макс для цілого числа ( i%) є 32676. Я не міг отримати 32677гольф без QBasic автоматичного кастингу це надовго ...

Ще одна помилка - 11 байт out of data. QBasic має DATAзаяви, які зберігають дані в програмі, до яких згодом можна отримати доступ READ. Видача більше READs ніж DATAs викликає помилку:

READ a$ '--

Зауважте, що у викладі додано коментар, щоб довести його до довжини повідомлення про помилку. Так, у мене є повідомлення про помилку із скороченою програмою та програма із коротшим повідомленням про помилку ...


11

C (Сучасний Linux), 19 байт

Я запропонував це у чаті, але ніхто не брав уваги. : P Подяка на веселу відповідь MD XF .

main(){puts('s');;}

Повідомлення про помилку, 18 байт

Segmentation fault

1
Але повідомлення про помилку має бути меншим, ніж сама програма ...
Leaky Nun

Підрахунок байтів був накручений, моя погана.
повністюлюдський

9
Це загальне повідомлення, надруковане оболонкою, коли підпроцес закінчується кодом виходу 139. Сама програма C не видає повідомлення про помилку.
Денніс

7
@Dennis Вихідний код 139 - це ще одна брехня, складена оболонкою. Unix розрізняє сигнал 11 ( W_EXITCODE(0, 11) == 11) та вихідний код 139 ( W_EXITCODE(139, 9) == 139 << 8). Оболонки встановлені $?нееквіктивно WIFEXITED(wstatus) ? WEXITSTATUS(wstatus) : WTERMSIG(wstatus) + 128, але більшість мов піддають різниці.
Андерс Касеорг

2
@Anders Є WIFEXITED(wstatus)рівнозначним DIVORCE(alimony)випадковості?
Жак Янус Бахс



10

PowerShell , 215 189 байт

[]
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111

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

Отже, PowerShell має ... багатослівні ... повідомлення про помилки. Крім того, більшість несинтаксичних повідомлень про помилки - це Винятки під час виконання, це означає, що вони не є фатальними, що зводить цю проблему до необхідності пошуку короткої помилки аналізу.

Я думаю , що це одна з найкоротших, якщо не найкоротших, @TessellatingHeckler продемонструвала це найкоротша помилка синтаксичного аналізу, і вона по- , як і раніше важить 188байти тільки для повідомлення про помилку. Таким чином, нам в основному потрібно додати достатньо 1s, щоб досягти 189байтів "коду".

c:\a.ps1Наприклад, запустивши це локально, наприклад, кількість байтів зменшиться на декілька, оскільки це лише коротший шлях до файлу, але він не доступний у TIO.

Виникає помилка:

At /tmp/home/.code.tio.ps1:1 char:2
+ []
+  ~
Missing type name after '['.
    + CategoryInfo          : ParserError: (:) [], ParseException
    + FullyQualifiedErrorId : MissingTypename

Мені було задано три запитання в коментарях, одне з яких ви задали, але два, яких ви не запитували, застосовувались до вашої відповіді, а не до вашого.
користувач72528

@ user72528 Так, я також виявив це кумедне.
AdmBorkBork

Ви можете використовувати одне ім'я файлу char!
Zacharý

1
@ Zacharý Я можу, але тоді це не відтворюється в TIO через те, як TIO обробляє пісочницю. Я вважаю за краще тримати його корисним у TIO, ніж економити кілька байт.
AdmBorkBork

2
Що з того, []що виглядає як коротша помилка, Missing type name after '['і залежно від того, як саме ви рахуєте, може бути приблизно 190 - tio.run/##K8gvTy0qzkjNyfn/PzqWy3Dogv//AQ (взяті з цих рядків парсера, що для мене виглядає як найкоротша помилка парсера ([xml](gc .\ParserStrings.resx)).root.data.value | sort { $_.length } -Desc).
TessellatingHeckler

9

Commodore 64 Basic, 15 байт

?SYNTAX   ERROR

Виробляє

?SYNTAX  ERROR

(Зверніть увагу на два пробіли у повідомленні про помилку, де в програмі три)

?SYNTAX ERRORпов'язано ?VERIFY ERRORяк третє найкоротше повідомлення про помилку, яке може створити C64 Basic, і найкоротше, яке може бути надійно спрацьоване кодом (найкоротше повідомлення BREAK IN 1, вимагає взаємодії з користувачем, тоді як ?LOAD ERRORпотрібна несправна стрічка або дискета, і ?VERIFY ERRORпотрібна наявність дискета або стрічка, що містить файл, який не відповідає програмі в оперативній пам'яті).


1
Ха, я навіть не бачив цього, коли я розміщував свою . Завжди приємно бачити іншого користувача ОСНОВИ ... +1
MD XF


7

Ruby ( 33 32 байти)

32 байти

&
#abcdefghijklmnopqrstuvwxyz12

Вмикає помилку (припустимо, у файлі під назвою "a"):

31 байт

a:1: syntax error, unexpected &

Edit : Бритий байти з використанням &замість <<завдяки Еріці , який також прийшов з ще більш коротким розчином Ruby: http://codegolf.stackexchange.com/a/135087/65905


1
Ласкаво просимо до PPCG!
Мартін Ендер

@EricDuminil приємно! Я подумав, що всі одиночні оператори символів цитуються у повідомленні про помилку, але ти маєш рацію: &ні. Акуратно! Також хороша знахідка з шестигранною втечею. Я намагався знайти коротше повідомлення про фатальну помилку, яке не є стеком, а не синтаксичну помилку.
ameketa

@ameketa: Насправді я написав грубу програму і протестував усі можливі 1, 2 та 3-байтні програми Ruby: D Дякую за посилання.
Ерік Думініл

5

Brainf ** k, 17 байт, цей перекладач

+++++++++++++++<<

Brainf ** k - така проста мова, що майже кожен перекладач має різні повідомлення про помилку. Цей використовується, Memory Error: -1коли вказівник переміщується ліворуч і ви намагаєтесь здійснити іншу операцію


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

@ user72528 Ну, тут ми визначаємо мову за допомогою її перекладача, тому це завдання полягає у виборі перекладача з найкоротшими повідомленнями про помилки :)
HyperNeutrino

1
Хто б’є мозгу? Ніхто? Добре.
Ерік Аутгольфер

Неперевершене рішення буде двобайтовим рішенням, яке спричиняє помилку в 1 символ.
Zacharý

@ Zacharý Безумовно lol
HyperNeutrino

5

Лист звичайний , 20 байт

(/ 1 0))))))))))))))

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

Повідомлення про помилку

/: division by zero

11
o_o незбалансовані дужки в Ліспі ... ви щодня дізнаєтесь щось нове.
Zacharý

1
Якщо ви заміните 0 на 1, це буде помилка на паронах, але це не так далеко з 0. Мені просто потрібно було додати символи, щоб бути довше повідомлення
Челдон,


5

Javascript (Firefox), 29 27 байт

new Date('-').toISOString()

кидків, RangeError: invalid dateщо становить 24 байти. Тестовано на Firefox 54.0.1 в Windows 10.


5

ZX Spectrum Basic, 9 байт

RUN USR 8

виробляє:

Повідомлення про помилку

Пояснення:

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

Зазвичай повідомлення про помилки ZX Spectrum є довшими та кориснішими, ніж це - порядок ПЗУ на 0x0008 очікує код помилки після виклику машинного коду RST 8. І отримує з ПЗУ якийсь випадковий (детермінований) байт, який видає це безглузде повідомлення про помилку M. 5- це номер помилки, ,додається процедурою друку помилок і 0:1є рядком: командна позиція помилки.


Насправді це зазвичай 9 байт, оскільки ZX Spectrum не оцінює числа під час виконання, тому насправді є 6 прихованих байтів, які дозволяють йому отримувати доступ до бінарного представлення 8 безпосередньо.
Ніл


4

Perl 5 , 5 байт

die$/

Виводить новий рядок на один байт.

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


._. Тепер ... якщо тільки помилки Perl у порожньому файлі!
Zacharý

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

1
@ Zacharý ... подання повідомлення про помилку із загальною від’ємною довжиною?
aschepler

1
Це може бути недійсним ... чи ні, залежить від того, означав ОП помилку чи повідомлення
Zacharý

^ уточнення: чи програма помиляється безпосередньо, чи створює повідомлення про помилку безпосередньо
Zacharý

4

Perl 5 , 11 байт

Оскільки мені не зрозуміло, чи відповідає моя інша відповідь правилам виклику, ось ще одна альтернатива.

#line 0
die

Помилка виводу:

Died.

З новим рядком, що закінчується, на 6 байт.

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

Чомусь внутрішня функція інтерпретатора Perl Perl_mess_svмістить:

if (CopLINE(cop))
    Perl_sv_catpvf(aTHX_ sv, " at %s line %" IVdf,
                    OutCopFILE(cop), (IV)CopLINE(cop));

де CopLINE(cop)отримує номер рядка поточного контексту коду. Отже, якщо цей номер рядка дорівнює нулю, Perl пропускає додавання звичайного " at <filename> line <n>"до повідомлення про помилку.


1
Мені це здається неправдивим. IIRC dieпризначений для виходу програми.
серхіол

1
Чим це відрізняється від пітона raise?
Ерік Думініл

Добре, що ОП могло посилатися або на генерування помилки, або на повідомлення про помилку . Я прокоментував, який саме він мав на увазі.
Zacharý

4

ArnoldC , 150 байт

IT'S SHOWTIME
HEY CHRISTMAS TREE b
YOU SET US UP 0
GET TO THE CHOPPER b
HERE IS MY INVITATION b
HE HAD TO SPLIT 0
ENOUGH TALK
YOU HAVE BEEN TERMINATED

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

Помилка - 94 байти (включаючи трейлінг нового рядка):

Exception in thread "main" java.lang.ArithmeticException: / by zero
    at code.main(Hello.java)

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

ArnoldC , 280 байт

IT'S SHOWTIME
HEY CHRISTMAS TREE BRBDoorBetterNotBeThosePeskyTeenagePranksters
YOU SET US UP 0
GET YOUR ASS TO MARS BRBDoorBetterNotBeThosePeskyTeenagePranksters
DO IT NOW
I WANT TO ASK YOU A BUNCH OF QUESTIONS AND I WANT TO HAVE THEM ANSWERED IMMEDIATELY
YOU HAVE BEEN TERMINATED

Псевдокод:

start program
new variable
set to 0
set new variable to output from function
call function
take input
end program

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

Створює помилку "без введення". (Майже всі інші помилки в ArnoldC включають великий шматок котла):

279 байтів (включаючи прокладку нового рядка):

Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Scanner.java:862)
    at java.util.Scanner.next(Scanner.java:1485)
    at java.util.Scanner.nextInt(Scanner.java:2117)
    at java.util.Scanner.nextInt(Scanner.java:2076)
    at code.main(Hello.java)

4

TI-Basic, 9 байт

Найкоротші повідомлення про помилки 8 байт кожні: ERR:DATE, ERR:MODE, ERR:STAT, і ERR:ZOOM. Я не розглядав, ERR:DATEтому що це не працює на моделях без внутрішнього годинника. Також я не ходивERR:ZOOM тому що це здалося занадто важким для спрацьовування.

Програма (9 байт):

Seq:DrawInv X:::::

Повідомлення про помилку: ERR:MODE(8 байт)

Програма (9 байт):

median({1},{0::

Повідомлення про помилку: ERR:STAT(8 байт)


3

Рубін, 25 байт

Це була весела вправа, дякую! Можливо, є спосіб отримати коротше повідомлення про помилку з SegFault, але я не зміг його знайти.

/\x
# Invalid hexa regexp

Повідомлення про помилку:

a:1: invalid hex escape

24 байти, включаючи зворотний новий рядок.

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

Рубін, 26 байт

Ось моя попередня відповідь:

08
# No 8 allowed in octal

Повідомлення про помилку:

a:1: Invalid octal digit

25 байт, включаючи зворотний новий рядок.


Я думаю, ви повинні розділити свої відповіді.
Соломон Учко

@SolomonUcko: Будь-яка причина? Відповідей уже багато. Я просто хотів залишити слід своєї попередньої відповіді. Люди зазвичай просто редагують кількість байтів з <s> 26 </s> 25, але це часто для незначних змін.
Ерік Думініл

Насправді я не впевнений, чому я це сказав, так що ніколи не маю на увазі.
Соломон Учко

3

C ++ (на бета-версії macOS High Sierra), 23 символи

int main(){*(int*)0=0;}

Вихід: (22 символи)

Segmentation fault: 11

Я не пам'ятаю, чи попередні версії macOS надають більш традиційний Segmentation fault (core dumped)відповідь, але додавання пробілів у код для прокладки, що є досить тривіальним.

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