Кратчайшее сообщение об ошибке

135

Вызов

Напишите самую короткую программу, которая при компиляции или выполнении выдает сообщение о фатальной ошибке, которое меньше самой программы. Сообщение об ошибке не может быть сгенерировано самой программой, такой как Python raise. Действительный ответ должен включать как код, так и сообщение об ошибке. Самый короткий действительный ответ выигрывает.

Никакое сообщение об ошибке не считается сообщением об ошибке.

Пример (Луа)

Код (46 байт):

[
--aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

Ошибка (45 байт):

[string "[..."]:1: unexpected symbol near '['
user72528
источник
Комментарии не для расширенного обсуждения; этот разговор был перемещен в чат .
Деннис
1
@ Денис Я думаю, это один из способов решения проблемы «ОП не редактирует уточнения в вопрос».
Орджан Йохансен
1
Спасибо, что приняли мой ответ, который получил наибольшее количество голосов; однако, это было помечено code-golf , поэтому вы должны принять этот ответ , который является самым коротким.
MD XF
@smartpeople это: " __main__.CodeException: Raised an &rror." моя ошибка или это: " Raised an &rror."
FantaC
TrumpScript работает в Китае?
Стэн Струм

Ответы:

58

ed , 3 байта

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

Код (с завершающим переводом строки):

??

Ошибка (с завершающим переводом строки):

?

Андерс Касеорг
источник
19
На самом деле, это невозможно победить. : P
полностью человек
1
Может ли ed проводить тестирование на сложение и первичность? Или это не требуется для этого типа проблемы?
Стивен
4
@StepHen Да, он может выполнять сложение и тестирование простоты в унарном виде с помощью обычного трюка с регулярными выражениями.
Андерс Касеорг
1
Очень умно, но "?" не смертельно.
Марк Плотник
2
Как указано во флаге, ошибка является фатальной, если код не читается с терминала. Попробуйте онлайн!
Деннис
59

C (современный Linux), 19 байт

Сделал бы мой знаменитый сегфо, но полностью человек украл его.

main(){longjmp(0);}

Выход (18 байт):

Segmentation fault
MD XF
источник
У вас сейчас больше очков, чем у меня, так что ... беспроигрышный?
полностью человек
Нет ли другой локали с более короткой версией (чтобы потом ее можно было использовать main(){main();})?
12431234123412341234123
@ 12431234123412341234123 Не то, что я знаю. Кроме того, main(){main();}не гарантируется seg-вина.
MD XF
1
@MDXF Нет гарантии (и с включенной оптимизацией в gcc или clang, она заканчивается бесконечным циклом или игнорирует вызов). Но на Code Golf нам нужна работающая реализация, а не гарантия.
12431234123412341234123
48

Python 2, 35 байт

import sys;sys.tracebacklimit=000;a

Выдает ошибку:

NameError: name 'a' is not defined
orlp
источник
14
изменение предела
трассировки
1
Это умно!
Скайлер
34

JavaScript (Firefox), 31 байт

# This is a comment, right? ...

Выдает эту ошибку:

SyntaxError: illegal character

Протестировано в консоли Firefox 54.0.1 на Windows 7.

ETHproductions
источник
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

totallyhuman
источник
1
Вы можете принять имя файла с одним символом!
Захари
1
Принимая имя файла из 1 символа, вы можете заняться этим .
Эрик Outgolfer
Хех, мило. - - -
полностью человек
1
Но сообщение об ошибке должно быть меньше, чем сама программа ...
Leaky Nun
1
Если вы используете IDLE, вы можете получить \s\sFile "<stdin>", line 1\nSyntaxError: not a chanceтолько 50 байт [ \sэто пробел и \n
новая
20

Haskell, 13 байт

main = (main)

Сохранить как t.hsили другое односимвольное имя, скомпилировать ghcи запустить. Сообщение об ошибке (с завершающим символом новой строки):

t: <<loop>>
Андерс Касеорг
источник
19

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

Switch to plan "abc".

Производит:

error: no such label

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

-17 байт благодаря Engineer Toast

Пытается переключиться на «abc», который не существует. Вы бы [abc]где-нибудь.

Стивен
источник
4
Вы можете получить до 21 байта с Switch to plan "abc".производством error: no such label. Это может быть одной из немногих проблем в гольф-коде, где Такси побеждает некоторые традиционные языки.
Тост инженера
@EngineerToast спасибо, не думал об этом.
Стивен
18

> <> , 26 байт

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

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

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

HyperNeutrino
источник
2
Мне это нравится, и это определенно самое сомнительное из всех решений :-)
Ксан-Кун, Кларк-Дэвис,
@ Xan-KunClark-Дэвис вздохнул, ты должен был ...: P
HyperNeutrino
18

JavaScript (Firefox), 21 байт

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

Ошибка (20 байт) :TypeError: a is null

Оливер
источник
2
D'о! Я знал, что был более короткий ...
ETHproductions
У меня была та же идея, я придумал a = null; a.x01234567890 То же количество байтов
RuteNL
16

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

mount /dev/hda1 /mnt/hda1

Сообщение об ошибке (23 байта):

mount: not a typewriter

«Не пишущая машинка» или ENOTTYкод ошибки, определенный в errno.hсистемах Unix. Это используется для указания того, что в системном вызове ioctl был указан недопустимый номер ioctl (контроль ввода / вывода). В моей системе, /usr/include/asm-generic/errno-base.hя могу найти эту строку:

#define ENOTTY          25      /* Not a typewriter */

В версии 6 UNIX и более ранних версиях ввод-вывод был ограничен терминальными устройствами с последовательным подключением, такими как телетайп (TTY). Они, как правило , удалось через gttyи sttyсистемные вызовы. Если попытаться использовать любой из этих системных вызовов на нетерминальном устройстве, ENOTTYбыло сгенерировано.

В наше время, естественно, нет необходимости использовать телетайп. Когда gttyи sttyбыли заменены ioctl, ENOTTYбыл сохранен. Некоторые системы по-прежнему отображают это сообщение; но большинство говорят «неуместное ioctl для устройства».

MD XF
источник
Пожалуйста, объясните ...
Мега Человек
@MegaMan Обновлено с объяснением.
MD XF
1
Upvote для действительно поучительного объяснения.
Ксан-Кун, Кларк-Дэвис,
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$ '--

Обратите внимание, что оператор дополняется комментарием, чтобы получить его до длины сообщения об ошибке. Да, у меня есть сообщение об ошибке с более короткой программой, и программа с более коротким сообщением об ошибке ...

steenbergh
источник
11

C (современный Linux), 19 байт

Я предложил это в чате, но никто не воспользовался возможностью. : P Отдайте должное веселому ответу MD XF .

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

Сообщение об ошибке, 18 байт

Segmentation fault
totallyhuman
источник
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)случайно?
Янус Бах Жак
11

Javascript (V8), 24 байта

decodeURIComponent('%');

Ошибка, 23 байта:

URIError: URI malformed

Протестировано на Nodejs v6.11.0 и Google Chrome v59.0.3071.115 .

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

Обратите внимание, что TIO расширяет сообщение об ошибке.

Макс Синев
источник
5
Добро пожаловать в PPCG!
Стивен
11

TrumpScript , 30 байт

We love NATO!
America is great

Сообщение об ошибке:

Trump doesn't want to hear it
Timtech
источник
3
PS Коды ошибок есть в constants.py
Timtech
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
AdmBorkBork
источник
Мне было задано три вопроса в комментариях, один из которых вы задавали, но два вопроса, которые вы не задавали, относились к вашему ответу, а не к вашему.
user72528
@ user72528 Да, я тоже нашел это забавным.
AdmBorkBork
Вы можете использовать одно имя файла!
Захари
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
Ха, даже не заметил этого , когда я отправил мое . Всегда приятно видеть другого пользователя
MD XF
8

R , 29 28 байт

-1 байт благодаря JarkoDubbeldam

a #abcdefghijklmnopqrstuvwxy

Выдает ошибку, Error: object 'a' not foundкоторая составляет 27 байт.

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

Giuseppe
источник
2
a #abcdefghijklmnopqrstuvwxyОшибка Error: object 'a' not foundна один байт короче.
JAD
@JarkoDubbeldam спасибо.
Джузеппе
7

Рубин ( 33 32 байта)

32 байта

&
#abcdefghijklmnopqrstuvwxyz12

Выдает ошибку (при условии, что в файле с именем "a"):

31 байт

a:1: syntax error, unexpected &

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

ameketa
источник
1
Добро пожаловать в PPCG!
Мартин Эндер
@EricDuminil хорошо! Я думал, что все односимвольные операторы были указаны в сообщении об ошибке, но вы правы: &нет. Ухоженная! Кроме того, хорошая находка с помощью шестнадцатеричного выхода Я изо всех сил пытался найти более короткое и фатальное сообщение об ошибке трассировки не в стеке, кроме синтаксической ошибки.
Амекета
@ameketa: Я на самом деле написал программу bruteforce и протестировал все возможные 1, 2 и 3-байтовые программы Ruby: D Спасибо за ссылку.
Эрик
5

Brainf ** k, 17 байт, этот интерпретатор

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

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

HyperNeutrino
источник
Я думаю, что выбор переводчика - такая же сложная задача, как и выбор языка.
user72528
@ user72528 Здесь мы определяем язык по его интерпретатору, поэтому задача состоит в том, чтобы выбрать переводчика с самыми короткими сообщениями об ошибках :)
HyperNeutrino
1
Кто побеждает бред? Никто? Хорошо.
Эрик Outgolfer
Непревзойденным решением будет двухбайтовое решение, которое вызывает ошибку в 1 символ.
Захари
@ Zacharý Конечно LOL
HyperNeutrino
5

Common Lisp , 20 байт

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

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

Сообщение об ошибке

/: division by zero
Cheldon
источник
11
o_o несбалансированные скобки в Лиспе ... вы узнаете что-то новое каждый день.
Захари
1
Если вы замените 0 на 1, это вызовет ошибку в скобках, но это не так далеко с 0. Мне просто нужно было добавить символы длиннее сообщения
Челдон
5

TryAPL, 11 байт

Код (11):

'abcdefghij

Ошибка (10):

open quote
Zachary
источник
5

Javascript (Firefox), 29 27 байт

new Date('-').toISOString()

бросает RangeError: invalid dateчто составляет 24 байта. Протестировано на Firefox 54.0.1 на Windows 10.

SuperStormer
источник
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$/

Выводит новую строку для одного байта.

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

aschepler
источник
._. Теперь ... если бы только ошибки Perl в пустом файле!
Захари
4
Подождите, это нарушение "не может быть сгенерировано самой программой"? Я не понял, о чем говорило это правило.
aschepler
1
@ Zacharý ... выдает сообщение об ошибке с отрицательной общей длиной?
aschepler
1
Это может быть неверно ... или нет, зависит от того, означал ли OP ошибку или сообщение об ошибке
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>"к сообщению об ошибке.

aschepler
источник
1
Это кажется мне неуместным. IIRC dieдля программы, чтобы выйти.
sergiol
1
Чем это отличается от Python raise?
Эрик
Ну, OP, возможно, имел в виду либо генерацию ошибки, либо сообщение об ошибке . Я прокомментировал, что он имел в виду.
Захари
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)
TemporalWolf
источник
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 байт)

Timtech
источник
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 beta), 23 символа

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

Вывод: (22 символа)

Segmentation fault: 11

Я не помню, давали ли предыдущие версии macOS более традиционный Segmentation fault (core dumped)ответ, но добавление пробелов в код для дополнения этого кода довольно тривиально.

пушистый
источник