Najkrótszy komunikat o błędzie


135

Wyzwanie

Napisz najkrótszy program, który po skompilowaniu lub uruchomieniu generuje fatalny komunikat o błędzie mniejszy niż sam program. Komunikat o błędzie może nie zostać wygenerowany przez sam program, taki jak Python raise. Prawidłowa odpowiedź musi zawierać zarówno kod, jak i komunikat o błędzie. Najkrótsza ważna odpowiedź wygrywa.

Żaden komunikat o błędzie nie jest liczony jako komunikat o błędzie.

Przykład (Lua)

Kod (46 bajtów):

[
--aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

Błąd (45 bajtów):

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

Komentarze nie są przeznaczone do rozszerzonej dyskusji; ta rozmowa została przeniesiona do czatu .
Dennis

1
@Dennis Myślę, że to jeden ze sposobów rozwiązania problemu „OP nie edytuje wyjaśnień na pytanie”.
Ørjan Johansen

1
Dziękuję za zaakceptowanie mojej odpowiedzi, która uzyskała najwięcej głosów; zostało to jednak oznaczone kodem golfowym , dlatego należy zaakceptować tę odpowiedź , która jest najkrótsza.
MD XF,

@smartpeople to: „ __main__.CodeException: Raised an &rror.” mój błąd lub czy to: „ Raised an &rror.
FantaC,

TrumpScript działa w Chinach?
Stan Strum

Odpowiedzi:


58

ed , 3 bajty

Uwaga: Większość odpowiedzi tutaj ignoruje licznik końcowy wydrukowany jako część komunikatu o błędzie. Ale nie widzę w pytaniu niczego, co uzasadniałoby zignorowanie go, a autor skomentował, że nowy wiersz powinien zostać uwzględniony . Więc jeśli pytanie nie zostanie zmienione, dołączę je.

Kod (z końcowym znakiem nowej linii):

??

Błąd (z końcowym znakiem nowej linii):

?


19
W rzeczywistości nie da się tego pokonać. : P
całkowicie ludzki,

1
Czy ed może przeprowadzać testy dodawania i testowania pierwotności? Czy nie jest to wymagane w przypadku tego rodzaju wyzwań?
Stephen

4
@StepHen Tak, może przeprowadzać test dodawania i sprawdzania pierwotności w sposób jednolity za pomocą zwykłej sztuczki regex-with-backreferences.
Anders Kaseorg

1
Bardzo sprytne, ale „?” nie jest śmiertelne.
Mark Plotnick

2
Jak wskazano w flagi, błąd jest krytyczny, jeśli kod nie zostanie odczytany z terminala. Wypróbuj online!
Dennis

59

C (nowoczesny Linux), 19 bajtów

Zrobiłbym mój słynny segfault, ale całkowicie ludzki go ukradł.

main(){longjmp(0);}

Wyjście (18 bajtów):

Segmentation fault

Obecnie masz wyższy wynik niż ja, więc ... Win-win?
całkowicie ludzki,


Czy nie ma innych ustawień narodowych z krótszą wersją (abyś mógł wtedy użyć main(){main();})?
12431234123412341234123 27.07.17

@ 12431234123412341234123 Nie wiem o tym. Ponadto, main(){main();}nie jest gwarantowane seg winy.
MD XF,

1
@MDXF Nie ma gwarancji (a przy włączonej optymalizacji w gcc lub clang, kończy się ona w nieskończonej pętli lub ignoruje wywołanie). Ale w Code Golf potrzebujemy działającego wdrożenia, a nie gwarancji.
12431234123412341234123

48

Python 2, 35 bajtów

import sys;sys.tracebacklimit=000;a

Podaje błąd:

NameError: name 'a' is not defined

14
modyfikowanie limitu
śledzenia

1
To jest sprytne!
Skyler

34

JavaScript (Firefox), 31 bajtów

# This is a comment, right? ...

Zgłasza ten błąd:

SyntaxError: illegal character

Testowany w konsoli Firefox 54.0.1 w systemie Windows 7.


26

Python 2 , 87 79 bajtów

-8 bajtów dzięki Zacharý i Erik the Outgolfer.

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

Wypróbuj online!

Komunikat o błędzie, 78 bajtów:

Zakładając, że kod jest przechowywany w pliku o nazwie a.

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

To jest naprawdę fajne małe jajko wielkanocne w Pythonie. :RE


1
Możesz założyć jednoznakową nazwę pliku!
Zacharý

1
Zakładając nazwę pliku 1-char można golf do tego .
Erik the Outgolfer

Hej, miło. - - -
całkowicie ludzki

1
Ale komunikat o błędzie musi być mniejszy niż sam program ...
Leaky Nun

1
Jeśli używasz IDLE, możesz uzyskać \s\sFile "<stdin>", line 1\nSyntaxError: not a chancetylko 50 bajtów [ \sjest to spacja i \nznak nowej linii], więc możesz otrzymać program 51-bajtowy.
boboquack

20

Haskell, 13 bajtów

main = (main)

Zapisz jako t.hslub inną jednoznakową nazwę, skompiluj ghci uruchom. Komunikat o błędzie (z końcowym znakiem nowej linii):

t: <<loop>>

19

Taxi , 38 21 bajtów

Switch to plan "abc".

Produkuje:

error: no such label

Wypróbuj online!

-17 bajtów dzięki Inżynierowi Toastowi

Próbuje przejść na „abc”, który nie istnieje. Miałbyś [abc]gdzieś.


4
Możesz Switch to plan "abc".produkować do 21 bajtów error: no such label. To może być jedno z niewielu wyzwań związanych z golfem kodowym, w których Taxi pokonuje tradycyjne języki.
Inżynier Toast

@EngineerToast dzięki, nie myślałem o tym.
Stephen

18

> <> , 26 bajtów

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

Wypróbuj online!

Każdy komunikat o błędzie w Fish jest something smells fishy..., więc to po prostu przesuwa wskaźnik wystarczająco długo, aby był dłuższy, i próbuje duplikować górę stosu, który jest pusty w tym czasie.


2
Lubię to i to zdecydowanie najbardziej podejrzane ze wszystkich rozwiązań :-)
Xan-Kun Clark-Davis

@ Xan-KunClark-Davis westchnienie , które
musiałeś

18

JavaScript (Firefox), 21 bajtów

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

Błąd (20 bajtów) :TypeError: a is null


2
Nie! Wiedziałem, że jest krótszy ...
ETHprodukcje

Miałem ten sam pomysł, wpadłem na = null; a.x01234567890 Taka sama ilość bajtów
RuteNL

16

Powłoka systemu V, 25 bajtów

mount /dev/hda1 /mnt/hda1

Komunikat o błędzie (23 bajty):

mount: not a typewriter

„Nie jest maszyną do pisania” lub ENOTTYjest kodem błędu zdefiniowanym w errno.hsystemach Unix. Służy to do wskazania, że ​​w wywołaniu systemowym ioctl podano nieprawidłowy numer ioctl (kontrola wejścia / wyjścia). W moim systemie /usr/include/asm-generic/errno-base.hmogę znaleźć następującą linię:

#define ENOTTY          25      /* Not a typewriter */

W wersji 6 UNIX i starszych, operacje we / wy były ograniczone do szeregowo podłączonych urządzeń końcowych, takich jak teletype (TTY). Zwykle były one zarządzane za pomocą wywołań systemowych gttyi stty. Jeśli ktoś spróbuje użyć któregoś z tych wywołań systemowych na urządzeniu innym niż terminal, ENOTTYzostanie wygenerowane.

W dzisiejszych czasach nie ma oczywiście potrzeby korzystania z teletype. Kiedy gttyi sttyzostały zastąpione ioctl, ENOTTYzostał zachowany. Niektóre systemy nadal wyświetlają ten komunikat; ale większość mówi zamiast tego „nieodpowiedni ioctl dla urządzenia”.


Proszę wyjaśnij ...
Mega Man,

@MegaMan Zaktualizowano z wyjaśnieniem.
MD XF

1
Głosuj za faktycznie pouczającym wyjaśnieniem.
Xan-Kun Clark-Davis

11

QBasic, 11 bajtów

Istnieją dwa rozwiązania z 11 bajtami w QBasic, z których jedno może być dalej rozgrywane w golfa. Najkrótszy komunikat o błędzie QBasic ma overflowi można go wywołać jako taki:

i%=i%+32677

Wyrzuca to, overflowponieważ maksimum dla liczby całkowitej ( i%) wynosi 32676. Nie mogłem grać w 32677golfa bez automatycznego rzucania QBasic za długo ...

Kolejny błąd, przy 11 bajtach, to out of data. QBasic ma DATAinstrukcje przechowujące dane w programie, do których później można uzyskać dostęp za pomocą READinstrukcji. Wydanie więcej READniż DATAs powoduje błąd:

READ a$ '--

Zauważ, że instrukcja jest wypełniona komentarzem, aby uzyskać długość komunikatu o błędzie. Tak, mam komunikat o błędzie z krótszym programem i program z krótszym komunikatem o błędzie ...


11

C (nowoczesny Linux), 19 bajtów

Zasugerowałem to na czacie, ale nikt nie skorzystał z okazji. : P Podziękowania dla przezabawnej odpowiedzi MD XF .

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

Komunikat o błędzie, 18 bajtów

Segmentation fault

1
Ale komunikat o błędzie musi być mniejszy niż sam program ...
Leaky Nun

Liczby bajtów były popieprzone, moje złe.
całkowicie ludzki,

9
Jest to ogólny komunikat drukowany przez powłokę, gdy podproces kończy się kodem wyjścia 139. Sam program C nie generuje żadnego komunikatu o błędzie.
Dennis

7
@Dennis Kod zakończenia 139 jest w rzeczywistości kolejnym kłamstwem wymyślonym przez powłokę. Unix rozróżnia sygnał 11 ( W_EXITCODE(0, 11) == 11) od kodu wyjścia 139 ( W_EXITCODE(139, 9) == 139 << 8). Powłoki ustawione są w sposób $?nieinwazyjny WIFEXITED(wstatus) ? WEXITSTATUS(wstatus) : WTERMSIG(wstatus) + 128, ale większość języków ujawnia różnicę.
Anders Kaseorg

2
@Anders Czy jest to przypadek WIFEXITED(wstatus)równoważny DIVORCE(alimony)?
Janus Bahs Jacquet

11

JavaScript (V8), 24 bajty

decodeURIComponent('%');

Błąd, 23 bajty:

URIError: URI malformed

Testowane na Nodejs v6.11.0 i Google Chrome v59.0.3071.115 .

Wypróbuj online!

Pamiętaj, że TIO rozszerza komunikat o błędzie.


5
Witamy w PPCG!
Stephen


10

PowerShell , 215 189 bajtów

[]
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111

Wypróbuj online!

Więc PowerShell ma ... pełne ... komunikaty o błędach. Ponadto większość komunikatów o błędach innych niż składniowe to wyjątki czasu wykonywania, co oznacza, że ​​nie powodują one śmierci, co ogranicza ten problem do konieczności znalezienia krótkiego błędu analizy.

I pomyśleć to jedna z najkrótszych, jeśli nie najkrótsza, @TessellatingHeckler wykazał to najkrótsza błąd parsowania, i wciąż waży 188bajtów tylko dla komunikatu o błędzie. Dlatego w zasadzie musimy dodać wystarczającą liczbę 1s, aby dotrzeć do 189bajtów „kodu”.

Na c:\a.ps1przykład uruchomienie tego lokalnie zmniejszy liczbę bajtów o garstkę, ponieważ jest to tylko krótsza ścieżka pliku, ale wtedy nie jest dostępna w TIO.

Powoduje błąd:

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

W komentarzach zadano mi trzy pytania, z których jedno zadałeś, ale dwa, o które nie pytałeś, dotyczyły twojej odpowiedzi, a nie twojej.
user72528,

@ user72528 Tak, uważam to również za zabawne.
AdmBorkBork

Możesz użyć nazwy pliku o jednym znaku!
Zacharý

1
@ Zacharý Mogę, ale to nie jest powtarzalne w TIO ze względu na to, jak TIO obsługuje piaskownicę. Wolę pozostawić go użytecznym na TIO niż zaoszczędzić kilka bajtów.
AdmBorkBork

2
Co może []wyglądać na krótszy błąd Missing type name after '['i w zależności od tego, jak dokładnie policzyć, może wynosić około 190 - tio.run/##K8gvTy0qzkjNyfn/PzqWy3Dogv//AQ (wzięty z ciągów parsera tutaj, który wygląda mi na najkrótszy błąd parsera ([xml](gc .\ParserStrings.resx)).root.data.value | sort { $_.length } -Desc).
TessellatingHeckler

9

Commodore 64 Basic, 15 bajtów

?SYNTAX   ERROR

Produkuje

?SYNTAX  ERROR

(Zwróć uwagę na dwie spacje w komunikacie o błędzie, gdzie program ma trzy)

?SYNTAX ERRORjest powiązany z ?VERIFY ERRORtrzecim najkrótszym komunikatem o błędzie, jaki może wygenerować C64 Basic, i najkrótszym, który może być niezawodnie wywołany przez kod (najkrótszy komunikat BREAK IN 1, wymaga interakcji użytkownika, podczas gdy ?LOAD ERRORwymaga wadliwej taśmy lub dyskietki i ?VERIFY ERRORwymaga obecności dyskietka lub taśma zawierająca plik, który nie pasuje do programu w pamięci RAM).


1
Ha, nawet tego nie widziałem, kiedy opublikowałem mój . Zawsze dobrze jest widzieć innego użytkownika BASIC ... +1
MD XF

8

R , 29 28 bajtów

-1 bajt dzięki JarkoDubbeldam

a #abcdefghijklmnopqrstuvwxy

Zgłasza błąd, Error: object 'a' not foundktóry wynosi 27 bajtów.

Wypróbuj online!


2
a #abcdefghijklmnopqrstuvwxyBłąd Error: object 'a' not foundjest o jeden bajt krótszy.
JAD

@JarkoDubbeldam dziękuję.
Giuseppe,

7

Rubinowy ( 33 32 bajty)

32 bajty

&
#abcdefghijklmnopqrstuvwxyz12

Zgłasza błąd (zakładając, że w pliku o nazwie „a”):

31 bajtów

a:1: syntax error, unexpected &

Edit : ogolone bajt off stosując &zamiast <<dzięki Eric , który również pojawił się z jeszcze krótszym rozwiązania Ruby: http://codegolf.stackexchange.com/a/135087/65905


1
Witamy w PPCG!
Martin Ender

@EricDuminil nice! Myślałem, że wszystkie operatory jednoznakowe zostały zacytowane w komunikacie o błędzie, ale masz rację: &nie. Schludny! Również dobre znalezisko z ucieczką heksów. Z trudem znajdowałem krótszy i nieśledzący komunikat o błędzie krytycznym inny niż błąd składniowy.
ameketa

@ameketa: Napisałem program bruteforce i przetestowałem każdy możliwy 1, 2 i 3 bajtowy program Ruby: D Dzięki za link.
Eric Duminil,

5

Brainf ** k, 17 bajtów, ten interpreter

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

Brainf ** k jest tak prostym językiem, że prawie każdy tłumacz ma inny komunikat o błędzie. Ten wykorzystuje, Memory Error: -1gdy wskaźnik przesuwa się za bardzo w lewo i próbujesz wykonać inną operację


Wydaje mi się, że wybór tłumacza stanowi tyle samo wyzwania, co wybór języka.
user72528,

@ user72528 Cóż, tutaj definiujemy język przez jego tłumacza, więc w tym wyzwaniu chodzi o wybór tłumacza z najkrótszymi komunikatami o błędach :)
HyperNeutrino

1
Kto bije w dupę? Nikt? W porządku.
Erik the Outgolfer

Bezkonkurencyjnym rozwiązaniem byłoby rozwiązanie dwubajtowe, które powoduje błąd 1 znaku.
Zacharý

@ Zacharý Na pewno lol
HyperNeutrino

5

Common Lisp , 20 bajtów

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

Wypróbuj online!

Komunikat o błędzie

/: division by zero

11
o_o niezrównoważone nawiasy w Lisp ... każdego dnia uczysz się czegoś nowego.
Zacharý

1
Jeśli zamienisz 0 na 1, spowoduje to błąd na parens, ale nie zajdzie tak daleko na 0. Potrzebowałem tylko dodać znaki, by były dłuższe niż wiadomość
Cheldon


5

JavaScript (Firefox), 29 27 bajtów

new Date('-').toISOString()

wyrzuca RangeError: invalid date24 bajty. Testowany na Firefox 54.0.1 w systemie Windows 10.


5

ZX Spectrum Basic, 9 bajtów

RUN USR 8

produkuje:

Komunikat o błędzie

Wyjaśnienie:

Liczę (wyjątkowo) reprezentację programu ASCII dla celów długości, w tym końca linii (nie jest to tak naprawdę ważne, ponieważ zawsze możemy wstawić krótszy program spacjami).

Zwykle komunikaty o błędach ZX Spectrum są dłuższe i bardziej pomocne - procedura ROM pod 0x0008 oczekuje kodu błędu po wywołaniu kodu maszynowego na RST 8. I pobiera losowy (deterministyczny) bajt z ROM, co powoduje ten nonsensowny komunikat o błędzie M. 5jest numerem błędu, ,jest dodawany przez procedurę drukowania błędów i 0:1jest wierszem: pozycja polecenia błędu.


W rzeczywistości jest to zwykle 9 bajtów, ponieważ ZX Spectrum nie ocenia liczb w czasie wykonywania, więc w rzeczywistości istnieje 6 ukrytych bajtów, które pozwalają mu na bezpośredni dostęp do binarnej reprezentacji 8.
Neil


4

Perl 5 , 5 bajtów

die$/

Wysyła znak nowej linii dla jednego bajtu.

Wypróbuj online!


._. Teraz ... jeśli tylko perl błędy na pustym pliku!
Zacharý

4
Zaraz, czy to naruszenie „nie może być generowane przez sam program”? Nie rozumiałem, co mówi ta zasada.
aschepler

1
@ Zacharý ... daje komunikat o błędzie o całkowitej długości jeden ujemny?
aschepler

1
Może to być nieprawidłowe ... lub nie, zależy od tego, czy PO oznaczało błąd, czy komunikat o błędzie
Zacharý

^ wyjaśnienie: czy program bezpośrednio popełnia błąd, czy bezpośrednio tworzy komunikat o błędzie
Zacharý

4

Perl 5 , 11 bajtów

Ponieważ nie jestem pewien, czy moja inna odpowiedź jest zgodna z regułami wyzwań, oto inna alternatywa.

#line 0
die

Wyjście błędu:

Died.

Z końcowym znakiem nowej linii dla 6 bajtów.

Wypróbuj online!

Z jakiegoś powodu wewnętrzna funkcja interpretera Perla Perl_mess_svzawiera:

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

gdzie CopLINE(cop)pobiera numer bieżącego kontekstu kodu. Jeśli więc ten numer wiersza będzie miał wartość zero, Perl pomija dodawanie zwykłego " at <filename> line <n>"komunikatu o błędzie.


1
Wydaje mi się to nieważne. IIRC diesłuży do wyjścia z programu.
sergiol

1
Czym to się różni od Pythona raise?
Eric Duminil

Cóż, OP mógł odnosić się do generowania błędu lub komunikatu o błędzie . Skomentowałem, który miał na myśli.
Zacharý

4

ArnoldC , 150 bajtów

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

Wypróbuj online!

Błąd wynosi 94 bajty (w tym końcowy znak nowej linii):

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

Zachowane, ponieważ myślę, że to jest bardziej zabawne - spoiler: to byli ci cholerni nastoletni dowcipnisie.

ArnoldC , 280 bajtów

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

Pseudo kod:

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

Wypróbuj online!

Generuje błąd „brak danych wejściowych”. (Prawie wszystkie inne błędy w ArnoldC obejmują duży kawałek płyty kotłowej):

279 bajtów (w tym końcowy znak nowej linii):

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 bajtów

Najkrótsze komunikaty o błędach są 8 bajtów każda: ERR:DATE, ERR:MODE, ERR:STAT, i ERR:ZOOM. Nie zastanawiałem się, ERR:DATEponieważ to nie działa na modelach bez wewnętrznego zegara. Poza tym nie zdecydowałem się na ERR:ZOOMto, ponieważ wydawało się to zbyt trudne do uruchomienia.

Program (9 bajtów):

Seq:DrawInv X:::::

Komunikat o błędzie: ERR:MODE(8 bajtów)

Program (9 bajtów):

median({1},{0::

Komunikat o błędzie: ERR:STAT(8 bajtów)


3

Rubin, 25 bajtów

To było fajne ćwiczenie, dzięki! Prawdopodobnie istnieje sposób, aby uzyskać krótszy komunikat o błędzie za pomocą SegFault, ale nie mogłem go znaleźć.

/\x
# Invalid hexa regexp

Komunikat o błędzie:

a:1: invalid hex escape

24 bajty, w tym końcowy znak nowej linii.

Wypróbuj online!

Rubinowy, 26 bajtów

Oto moja poprzednia odpowiedź:

08
# No 8 allowed in octal

Komunikat o błędzie:

a:1: Invalid octal digit

25 bajtów, w tym końcowy znak nowej linii.


Myślę, że powinieneś rozdzielić swoje odpowiedzi.
Solomon Ucko

@SolomonUcko: Masz jakiś powód, dlaczego? Istnieje już wiele odpowiedzi. Chciałem po prostu zostawić ślad mojej poprzedniej odpowiedzi. Ludzie zwykle po prostu edytują liczbę bajtów za pomocą <s> 26 </s> 25, ale często dotyczy to drobnych zmian.
Eric Duminil,

Właściwie nie jestem pewien, dlaczego to powiedziałem, więc nieważne.
Solomon Ucko

3

C ++ (w wersji beta macOS High Sierra), 23 znaki

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

Wyjście: (22 znaków)

Segmentation fault: 11

Nie pamiętam, czy poprzednie wersje systemu macOS zapewniały bardziej tradycyjną Segmentation fault (core dumped)odpowiedź, ale dodawanie spacji do kodu, aby je uzupełnić, jest dość trywialne.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.