Ten kod zawiera błędy w * this * i * that *, czy naprawdę jest w nich napisany?

25

Zainspirowany nie jestem językiem, którego szukasz!

Wyzwanie

Wybierz dwa różne języki programowania i napisz program, który wypisze następującą linię na standardowe wyjście (lub równoważne):

This program errors out in <the current language> :P

a następnie generuje inny rodzaj błędu w każdym z dwóch języków.

Zasady

Niektóre zasady pochodzą z oryginalnego wyzwania.

  • W danych wyjściowych nazwy języków powinny dokładnie następować:
    • Nazwa wymieniona w TIO , opcjonalnie z wyłączeniem numeru wersji i / lub nazwy implementacji (np. Jeśli używasz JavaScript (Node.js)jednego z języków, możesz użyć JavaScriptnazwy swojego języka, ale nie JSlub Javascript.)
    • Pełna nazwa na oficjalnej stronie internetowej (lub repozytorium GitHub), jeśli Twój wybrany język nie jest dostępny w TIO.
  • Żaden program nie powinien pobierać żadnych danych wejściowych od użytkownika.
  • Możesz używać komentarzy w dowolnym języku.
  • Dwie różne wersje tego samego języka liczą się jako różne języki.
    • Jeśli tak się stanie, program powinien wypisać numer wersji głównej, a jeśli działa na dwóch różnych wersjach podrzędnych, powinien również zgłosić wersję podrzędną.
    • Nie należy używać wstępnie wbudowanych funkcji wersji (obejmuje to zmienne, które zostały już ocenione w czasie wykonywania).
  • Dwie różne flagi wiersza poleceń w tym samym języku również liczą się jako różne języki zgodnie z tym meta konsensusem , o ile flagi nie zawierają fragmentów kodu (takich jak-Dblahblah... w C).
    • Jeśli tak się stanie, program powinien również wypisać używaną flagę.
  • Dwa błędy są uważane za różne, chyba że oba błędy są generowane przez tę samą semantykę (takie jak „dzielenie przez zero”, „błąd segmentacji” lub „indeks poza zakresem”).
    • Jeśli środowisko wykonawcze języka nie kończy działania po błędzie, ale w jakiś sposób zgłasza błąd użytkownikowi, jest to prawidłowy błąd.
    • Jeśli język nie dyskryminuje komunikatów o błędach, ale ma znaną listę przyczyn, które powodują błąd, musisz podać przyczynę, a nie komunikat o błędzie.
      Przykładem może być ><>tylko jeden komunikat o błędzie something smells fishy..., ale strona wiki esolangs ma listę przyczyn błędów.
  • Błąd składniowy jest niedozwolony, chyba że zostanie wygenerowany przez wywołanie eval()lub w podobny sposób.
  • Rzucanie czymś ręcznie (przez throw(JS), raise(Python), die(Perl) lub podobny) jest dozwolone, ale wszystkie są uważane za jeden rodzaj błędu.
  • Błąd przez nieprawidłowe polecenie w 2D lub golflangs jest również dozwolony (i traktowany jako jeden rodzaj błędu).

Przykłady

Python i Ruby

  • Pyton: This program errors out in Python :P do standardowego, a następnie niezdefiniowanego identyfikatora
  • Ruby: This program errors out in Ruby :Pna standardowe wyjście, a następnie indeksuj poza granicami

C89 i C99

  • C89: This program errors out in C 89 :Pna standardowe wyjście, a następnie dzielenie przez zero
  • C99: This program errors out in C 99 :Pdo standardowego, a następnie do błędu segmentacji

Należy pamiętać, że numer wersji powinien zawsze być oddzielony od nazwy języka spacją.

Python 2.7.9 i Python 2.7.10

  • Python 2.7.9: This program errors out in Python 2.7.9 :Pna standardowe wyjście, a następnie błąd składniowy na eval
  • Python 2.7.10: This program errors out in Python 2.7.10 :Pna standardowe wyjście, a następnie błąd klucza podczas dyktafonu

Perl i Perl -n

  • Perl: This program errors out in Perl :Pdo standardowego, a następnie nieprawidłowego formatu czasu
  • Perl -n: This program errors out in Perl -n :Pna standardowe wyjście, a następnie spróbuj otworzyć plik, który nie istnieje

Warunki wygranej

To jest , więc wygrywa najkrótszy kod w bajtach. Ale zawsze zachęcamy Cię do opublikowania odpowiedzi, która jest zabawna lub interesująca, nawet jeśli nie jest bardzo krótka.

Bubbler
źródło
Czy błąd musi zatrzymać program?
Jo King
Początkowo tak myślałem. Jeśli jednak istnieją pewne języki, które mogą być kontynuowane (być może z nieokreślonym zachowaniem) po czymś takim jak „dzielenie przez zero”, z pewnym mechanizmem potwierdzającym, że program napotkał ten błąd, z przyjemnością na to pozwolę.
Bubbler
Myślę, że już znam odpowiedź, ale na wszelki wypadek: czy zdanie może This program errors out in ...zawierać mieszane tabulatory / spacje zamiast spacji?
Kevin Cruijssen
Powiązane (wydrukuj dwa różne teksty w dwóch różnych językach).
Kevin Cruijssen

Odpowiedzi:

33

Python 2 / Python 3 , 60 bajtów

print("This program errors out in Python %d :P"%(3/2*2))*1;a
  • Python 2 ma NameError: name 'a' is not defined
  • Python 3 ma unsupported operand type(s) for *: 'NoneType' and 'int'

Python 2:

  • /jest dzieleniem całkowitym, 3/2 dostało 1; int (3/2 * 2) to 2.
  • print jest instrukcją, więc pierwsza instrukcja jest czytana jako print((...)*1), tutaj *1oznacza to powtórzenie łańcucha raz.
  • druga instrukcja odwoływała się do nieistniejącej zmiennej, co spowodowało błąd.
  • Wypróbuj online!

Python 3:

  • „/” to zmiennoprzecinkowy podział, 3/2 dostało 1,5; int (3/2 * 2) to 3.
  • print jest funkcją, więc pierwsza instrukcja brzmi jak (print(...))*1.
  • funkcja printzwraca None; Mnożenie nie działaNone x int , więc zgłasza „nieobsługiwany operand”.
  • Wypróbuj online!
tsh
źródło
15

C i C ++, 114 101 bajtów

-13 bajtów dzięki l4m2 !

#include<stdio.h>
main(){auto d=.5;printf("This program errors out in C%s :P",d?"++":"");2[&d]+=1/d;}

Błąd segmentacji w C ++, wyjątek zmiennoprzecinkowy w C.

autojest domyślnie ustawiony na intC, więc (int).5staje się 0, więc próba podzielenia przez to jest w zasadzie dzielenie przez zero.

W C ++ 1/djest 2, dodając go do adresud i próba zmiany wartości tego adresu wywołuje awarię.

Wypróbuj w C ++!
Wypróbuj w C!

betseg
źródło
1
Nie jestem pewien, czy to pomaga, ale jeśli możesz zmapować C / C ++ na 2 i 0, możesz użyć "++"+n, gdzie njest 0C ++ i 2C
Conor O'Brien
2
d?"++":""9 znaków, "++"+4*d8 znaków Ale pobiera C / C ++ do tyłu. Westchnienie.
Jak
1
int main(){auto d=.5;printf("This program errors out in C%s :P",d?"++":"");2[&d]+=1/d;}(105) choć nie wiem dlaczego
14m2
1
Również intmożna pominąć
l4m2
Zaproponuj L"⬫"+!dzamiastd?"++":""
ceilingcat
14

JavaScript + HTML / HTML + JavaScript, 160 bajtów

<!--
document.write`This program errors out in JavaScript + HTML :P`()
--><script>document.write`This program errors out in HTML + JavaScript :P`+X</script>

<!--
document.write`This program errors out in JavaScript + HTML :P`()
--><script>document.write`This program errors out in HTML + JavaScript :P`+X</script>

Nie jestem pewien, czy liczą się dwa języki, ale jest to zabawne.

tsh
źródło
Tak więc, pierwszy z nich jest niezdefiniowanym identyfikatorem, drugi to wywołanie funkcji typu niefunkcyjnego. Technicznie rozważałbym poprzedni HTML i drugi JavaScript, ale naprawdę fajny pomysł.
Bubbler
Dobre wykorzystanie <!-- ... -->jako jednowierszowych znaczników komentarzy (wiem, że jest to w specyfikacji ze względu na kompatybilność wsteczną)
Shieru Asakoto,
12

Java 8 i C99, 172 bajty

//\
interface a{static void main(String[]a){System.out.print("This program errors out in Java 8 :P");a[1]=""/*
main(n){{n=puts("This program errors out in C99 :P")/0/**/;}}

Na podstawie mojej odpowiedzi na wyzwanie „abc” i „cba” .

Wypróbuj w Javie 8 - w wyniku ArrayIndexOutOfBoundsException: 1 .
Wypróbuj w C - w wyniku wyjątku zmiennoprzecinkowego: dzielenie przez zero jest niezdefiniowane .

Wyjaśnienie:

//\
interface a{static void main(String[]a){System.out.print("This program errors out in Java 8 :P");a[1]=""/*
main(n){{n=puts("This program errors out in C99 :P")/0/**/;}}

Jak widać w powyższym kodzie wyróżnionym w Javie, pierwszy wiersz jest komentarzem //, a kod C jest komentarzem /* ... */, w wyniku czego:

interface a{static void main(String[]a){System.out.print("This program errors out in Java 8 :P");a[1]="";}}

Więc drukuje do STDOUT, a następnie próbuje uzyskać dostęp do drugiego argumentu programu (jeśli nie podano żadnego), więc generuje ArrayIndexOutOfBoundsException .


//\
interface a{static void main(String[]a){System.out.print("This program errors out in Java 8 :P");a[1]=""/*
main(n){{n=puts("This program errors out in C99 :P")/0/**/;}}

Nie jestem pewien, jak poprawnie włączyć podświetlanie C, ponieważ lang-cpowoduje to takie samo podświetlanie jak Java. Ale //\skomentuje następny wiersz, którym jest kod Java, w wyniku czego:

main(n){{n=puts("This program errors out in C99 :P")/0;}}

Więc łączy się z STDOUT, a następnie podaje błąd przez zero.

Kevin Cruijssen
źródło
Myślę, że będzie działać zarówno z C89, jak i C99. Nie trzymaj mnie do tego.
SIGSTACKFAULT
//Dodano C C99.
betseg
Dzięki wam obojgu zmieniłem to na C99.
Kevin Cruijssen
Dlaczego a[1]zamiast a[0]?
xehpuk
@xehpuk Bez konkretnego powodu. Nie ma znaczenia, której cyfry używam i którą wypełniłem już 1od samego początku. Mogła wykorzystać 0, 9itp, jak również. Jeśli mam coś do edycji na temat tego wpisu, zmienię go 0również na ten sam czas.
Kevin Cruijssen
11

Java 8 i białe znaki , 439 431 428 408 bajtów

                         






























 interface a{static void    main(String[]a){System.out.print("This program errors out"+
" in Java 8 :P");a[0]="";}}













Wypróbuj w Javie 8 - w wyniku ArrayIndexOutOfBoundsException: 0 .
Wypróbuj to w Whitespace - powodując błąd użytkownika (Can't do Infix Plus) .

Wyjaśnienie:

Java 8:

interface a{static void main(String[]a){System.out.print("This program errors out"+
" in Java 8 :P");a[0]="";}}

Więc drukuje do STDOUT, a następnie próbuje uzyskać dostęp do pierwszego argumentu programu (jeśli nie podano żadnego), więc tworzy wyjątek ArrayIndexOutOfBoundsException .


Biała przestrzeń:

[S S T  T   T   T   T   T   N
_Push_-31_P][S S T  T   T   S T S T N
_Push_-53_:][S S T  T   S S T   T   T   T   N
_Push_-79_space][S S T  T   S T S N
_Push_-10_e][S S T  T   T   S S N
_Push_-12_c][S S T  T   T   T   S N
_Push_-14_a][S S S T    N
_Push_1_p][S S S T  S S N
_Push_4_s][S S T    T   S T S N
_Push_-10_e][S S S T    S T N
_Push_5_t][S S T    T   T   S N
_Push_-6_i][S S T   T   T   T   N
_Push_-7_h][S S T   T   T   S S S N
_Push_-24_W][S T    S S T   S T S N
_Copy_0-based_10th_(-79_space)][S S T   T   N
_Push_-1_n][S S T   T   T   S N
_Push_-6_i][S T S S T   S N
_Copy_0-based_2nd_(-79_space)][S S S T  S T N
_Push_5_t][S S S T  T   S N
_Push_6_u][S S S N
_Push_0_o][S T  S S T   T   N
_Copy_0-based_3rd_(-79_space)][S S S T  S S N
_Push_4_s][S S S T  T   N
_Push_3_r][S S S N
_Push_0_o][S S S T  T   N
_Push_3_r][S N
S _Duplicate_top_(3_r)][S S T   T   S T S N
_Push_-10_e][S T    S S T   T   S N
_Copy_0-based_6th_(-79_space)][S S T    T   S N
_Push_-2_m][S S T   T   T   T   S N
_Push_-14_a][S S S T    T   N
_Push_3_r][S S T    T   S S S N
_Push_-8_g][S S S S (_Note_the_additional_S_here)N
_Push_0_o][S S S T  T   N
_Push_3_r][S S S T  N
_Push_1_p][S T  S S T   T   T   N
_Copy_0-based_7th_(-79_space)][S S S T  S S N
_Push_4_s][S S T    T   T   S N
_Push_-6_i][S S T   T   T   T   N
_Push_-7_h][S S T   T   T   S T T   N
_Push_-27_T][N
S S N
_Create_Label_LOOP][S S S T T   S T T   T   T   N
_Push_111][T    S S S _Add][T   N
S S _Print_as_character][N
S N
N
_Jump_to_Label_LOOP]

Litery S(spacja), T(tab) iN (nowa linia) dodane tylko jako wyróżnienia.
[..._some_action]dodano tylko jako wyjaśnienie.

Wypróbuj podświetloną wersję.

Białe znaki to język oparty na stosie, który ignoruje wszystko oprócz spacji, tabulatorów i nowych wierszy. Oto ten sam program w pseudokodzie:

Push all unicode values of "P: ecapsetihW tuo srorre margorp sihT", minus 111
Start LOOP
  Push 111
  Add the top two stack values together
  Print as character
  Go to the next iteration of the LOOP

Błąd pojawi się, gdy tylko zakończy się drukowanie wszystkich wartości, a stos będzie pusty, gdy będzie próbował wykonać Add ( TSSS), co wymaga dwóch elementów na stosie.

Wygenerowałem stałą za 111pomocą tego programu Java , którego użyłem również w poprzednich wyzwaniach związanych z ASCII, które podjąłem w Whitespace. Ponadto wykorzystałem kilka kopii spacji do zapisania bajtów.

Jedną ważną rzeczą, na którą należy zwrócić uwagę, jest sztuczka, którą umieściłem, aby umieścić program Java w odpowiedzi na białą spację. Zacznę od wyjaśnienia, w jaki sposób liczba jest wypychana w białych znakach:

Sna początku: Enable Stack Manipulation;
S: Naciśnij, co następuje jako Liczba;
Slub T: odpowiednio pozytywny lub negatywny;
Niektóre Si / lub T, po których następuje N: Liczba jako binarna, gdzieT=1 i S=0.

Oto kilka przykładów:

  • Naciśnięcie wartości 1 będzie SSSTN ;
  • Naciśnięcie wartości -1 będzie SSTTN ;
  • Naciśnięcie wartości 111 będzie SSSTTSTTTTN .
  • Pchanie wartość 0 może być SSSSN, SSTSN, SSSN, SSTN, SSSSSSSSSSSSN, itd. (W przypadku korzystania SSSN(lub SSTN), nie trzeba określać część binarny, bo to w sposób dorozumiany 0 po my wyraziła znak).

Wystarczy więc SSSNprzesunąć wartość 0( ow tym przypadku jest to litera). Ale, aby umieścić program Java w tym golfowym programie Whitespace, potrzebowałem dodatkowej przestrzeni, więc pierwsze dwa osą przesuwane SSSN, ale trzeci jest przesuwany SSSSN, więc mamy wystarczająco dużo miejsca na zdanie programu Java.

Kevin Cruijssen
źródło
10

Kod maszynowy CBM BASIC i 6502 (C64), 142 144 bajty

Musiałem dodać 2 bajty po zrealizowaniu błędu składniowego nie było dozwolone ....


Hexdump .prgpliku:

01 08 50 08 00 00 8F 5A 49 52 49 41 A9 17 8D 18 D0 A2 30 BD 30 08 20 D2 FF E8
E0 4B D0 F5 A2 30 BD 05 08 20 D2 FF E8 E0 44 D0 F5 A9 0D 20 D2 FF A2 1A 4C 37
A4 22 36 35 30 32 20 4D 41 43 48 49 4E 45 20 43 4F 44 45 20 3A D0 22 20 20 20
20 20 00 8D 08 01 00 97 35 33 32 37 32 2C 32 33 3A 99 22 D4 48 49 53 20 50 52
4F 47 52 41 4D 20 45 52 52 4F 52 53 20 4F 55 54 20 49 4E 20 C3 C2 CD 2D C2 C1
D3 C9 C3 20 3A D0 22 2C 58 AD 50 00 00 00

Widok CBM BASIC , wymieniony w edytorze C64:

0 remziriastepgosubinput#new0exp0 dim.clrsavekinput#stepnew0exp<white> dim.clrsavedinput#stepstep
 dim.newl7to"6502 machine code :P"
1 poke53272,23:print"This program errors out in CBM-BASIC :P",x/p

original listing

Uwaga : Nie można poprawnie wprowadzić tego programu w edytorze BASIC. Nawet nie próbuj edytować tego programu w edytorze BASIC, spowoduje to awarię. Mimo to jest to uruchamialny program BASIC;)


Widok kodu maszynowego 6502 :

         01 08                          ; load address

.C:0801  50 08       BVC $080B          ; jump to real start of mc

         ; line number (00 00), REM (8F) and "ziria"
.C:0803  00 00 8F 5A 49 52 49 41

.C:080b  A9 17       LDA #$17
.C:080d  8D 18 D0    STA $D018          ; set upper/lower font
.C:0810  A2 30       LDX #$30
.C:0812  BD 30 08    LDA $0830,X
.C:0815  20 D2 FF    JSR $FFD2          ; print "This program errors ..."
.C:0818  E8          INX
.C:0819  E0 4B       CPX #$4B
.C:081b  D0 F5       BNE $0812
.C:081d  A2 30       LDX #$30
.C:081f  BD 05 08    LDA $0805,X
.C:0822  20 D2 FF    JSR $FFD2          ; print "6502 machine code :P"
.C:0825  E8          INX
.C:0826  E0 44       CPX #$44
.C:0828  D0 F5       BNE $081F
.C:082a  A9 0D       LDA #$0D
.C:082c  20 D2 FF    JSR $FFD2          ; print a newline
.C:082f  A2 1A       LDX #$1A           ; error code for "can't continue"
.C:0831  4C 37 A4    JMP $A437          ; jump to error handling routine

.C:0834  22 ; '"'

         ; "6502 machine code :P"
.C:0835  36 35 30 32 20 4D 41 43 48 49 4E 45 20 43 4F 44 45 20 3A D0

         ; '"', some spaces, and next BASIC line
.C:0849  22 20 20 20 20 20 00 8D 08 01 00 97 35 33 32 37 32 2C 32 33 3A 99 22

         ; "This program errors out in CBM-BASIC :P"
.C:0860  D4 48 49 53 20 50 52 4F 47 52 41 4D 20 45 52 52 4F 52 53 20 4F 55 54
.C:0877  20 49 4E 20 C3 C2 CD 2D C2 C1 D3 C9 C3 20 3A D0

.C:0887  22 2C 58 AD 50 00 00 00

Demo online , wpisz,runaby uruchomić jako BASIC,sys 2049aby uruchomić jako kod maszynowy,listaby pokazać, że jest interpretowany jako kod BASIC.

Uruchamianie jako BASIC powoduje division by zero error in 1, uruchamianie jako kod maszynowy acan't continue error

screenshot


Wyjaśnienie:

Pierwsze dwa bajty .prgpliku to adres ładowania w małym endianie, tutaj $0801(dziesiętnie 2049), który jest adresem początkowym programów BASIC na C64. runuruchamia ten program w interpretatorze BASIC, natomiast sys 2049jest poleceniem uruchomienia programu kodu maszynowego pod adresem 2049.

Jak widać, pierwszym wierszem w widoku BASIC jest komentarz ( rem) zawierający „śmieci” i część wymaganego ciągu wyjściowego. To jest program maszynowy i niektóre bajty wypełniające. Widoczne są tam „losowe” komendy BASIC, ponieważ programy CBM-BASIC zawierają komendy „tokenizowane” jako wartości jednobajtowe, a niektóre z tych wartości są takie same jak opcodes użyte w kodzie maszynowym. Kod maszynowy ponownie wykorzystuje ciąg znaków w drugim wierszu kodu do swoich danych wyjściowych.

Pierwsze dwa bajty linii programu podstawowego są wskaźnikiem do następnego wiersza tutaj $0850. Jest to starannie wybrane, ponieważ 50 08jest to również instrukcja rozgałęzienia 6502 przeskakująca o kolejne 8 bajtów, gdy flaga przelewu nie jest ustawiona - służy do przeskakiwania gdzieś w środku tego wiersza „komentarza”, gdy jest wykonywana jako kod maszynowy. Jest 50to używany tutaj kod operacji, więc druga linia musi zaczynać się od, 0850aby sztuczka zadziałała. Dlatego widzisz sekwencję 5 20bajtów (spacji) do wypełnienia. Kod maszynowy aktywnie przeskakuje do procedury obsługi błędów ROM, dając błąd „nie można kontynuować”.

Kod BASIC jest dość prosty; jako drugi argument „drukuj” dwie niezainicjowane zmienne (o wartości 0w CBM BASIC) są podzielone, co powoduje błąd „dzielenie przez zero”.

Felix Palmen
źródło
2
Pan jest prawdziwym programistą. Jak to wymyśliłeś? Programowanie Atari?
Orion
@Orion dzięki :) Zasadniczo zacząłem od drugiego wiersza wpisanego jako zwykły BASIC, usunąłem go z drogi za pomocą wbudowanego w vice (emulator) monitora kodu maszynowego, zmontowałem kod maszynowy bezpośrednio do pamięci RAM i ręcznie naprawiłem wskaźniki linii program podstawowy ...
Felix Palmen
9

> <> i Foo , 42 bajty

#o<"This code errors in "p"Foo"'><>'" :P"/

Wypróbuj w> <>!

Wypróbuj w Foo!

Foo drukuje wszystko ", co jest dobrze udokumentowane, i próbuje podzielić przez zero na końcu. Ignoruje '><>'.

><>wypycha „Foo” na stos, ale natychmiast wyskakuje za pomocą p. Po wydrukowaniu wszystkiego na stosie #o<kończy pracę, gdy stos jest pusty i wyświetla się jedyny znany komunikat o błędzie,something smells fishy...

Jo King
źródło
Przyczyna błędu jest ważna, a nie komunikat o błędzie. Strona esolang na stronie ><>zawiera listę przyczyn błędów, więc uważam, że powinieneś podać jeden z nich, a nie something smells fishy....
Bubbler
2
@Bubbler Błąd jest spowodowany wyskakiwaniem z pustego stosu.
Esolanging Fruit
3
Używanie ppopu Foojest bardzo sprytne!
Esolanging Fruit
6

C i Python, 126 116 bajtów

-10 bajtów dzięki @Bubbler!

#1/*
-print("This program errors out in Python :P")
'''*/
main(c){c=puts("This program errors out in C :P")/0;}//'''

W Pythonie print () jest Brak, więc próba uzyskania jego negatywu nie ma sensu, więc Python zgłasza błąd.

W C printf () zwraca liczbę całkowitą, więc podzielenie jej przez zero daje wyjątek zmiennoprzecinkowy.

Wypróbuj w C!
Wypróbuj w Pythonie!

betseg
źródło
1
Możesz użyć, -print(...)aby podnieść a TypeErrorw Pythonie, a następnie możesz zrobić błąd zmiennoprzecinkowy (dzielenie przez zero) w C. W połączeniu z kilkoma nadmiarowymi znakami nowej linii, tutaj jest 116 bajtów ( Python , C ).
Bubbler
5

Attache + Wolfram Language (Mathematica) , 82 bajty

s:="Attache"
s=" Mathematica "
Throw[Print["This program errors out in",s,":P"]-0]

Wypróbuj Attache online! Wypróbuj Mathematica online!

Zależy to od znaczenia operatora =w dwóch językach. W Attache porównuje się pod kątem równości, ale w Mathematica wykonuje przypisanie zmiennych.:=wykonuje przypisanie zmiennych w obu językach.

Teraz w Attache Printzwraca tablicę wydrukowanych ciągów, a odejmowanie nie jest możliwe w przypadku ciągów i liczb całkowitych (mianowicie 0). Zgłaszany jest zatem błąd typu. W Mathematica Printzwraca Nulli Mathematica dobrze odejmuje 0to. Ale ręcznie wyrzucamy to zero Throw, dając nocatchbłąd.

Conor O'Brien
źródło
Uwaga: nie działa w przypadku bieżących wersji attaché z powodu błędu. Spróbuję to szybko naprawić
Conor O'Brien
5

Python (2) i QB64 , 82 bajty

1#DEFSTR S
s="QB64"
'';s="Python"
print"This program errors out in "+s+" :P"
CLS-1

Aby przetestować wersję Python, możesz wypróbować ją online!Aby przetestować wersję QB64, musisz pobrać QB64.

Co widzi Python

1#DEFSTR S
s="QB64"
'';s="Python"
print"This program errors out in "+s+" :P"
CLS-1

Pierwszy wiersz to tylko gołe wyrażenie 1 (no-op), po którym następuje komentarz.

Druga linia sjest ustawiona na ciąg "QB64", ale trzecia linia natychmiast zmienia ją na"Python" . Czwarty wiersz odpowiednio wypisuje wiadomość.

Piąta linia jest kolejnym gołym wyrażeniem, ale podnosi z NameErrorpowodu niezdefiniowanej nazwyCLS .

Co widzi QB64

1#DEFSTR S
s="QB64"
'';s="Python"
print"This program errors out in "+s+" :P"
CLS-1

Pierwsza linia, ponumerowana 1# , definiuje każdą zmienną, której nazwa zaczyna się od S(bez rozróżniania wielkości liter) jako zmienną łańcuchową. Oznacza to, że nie musimy używać s$, co byłoby błędem składni w Pythonie.

Zestawy drugiej linii s jest ustawiona na ciąg "QB64". 'rozpoczyna komentarz w QB64, więc trzeci wiersz nic nie robi. Czwarty wiersz odpowiednio wypisuje wiadomość.

Piąta linia próbuje CLS(wyczyścić ekran) z argumentem -1. Ale skoro CLStylko przyjmuje argumenty 0, 1czy 2ta produkuje błąd Illegal function call. Błąd tworzy okno dialogowe z pytaniem, czy użytkownik chce kontynuować wykonywanie lub przerwać. Technicznie oznacza to, że błąd nie jest krytyczny (w tym przypadku możesz wybrać „kontynuuj wykonywanie”, a program po prostu kończy się bez dalszych problemów); ale OP wyraźnie zezwolił na języki, które mogą być kontynuowane po błędzie, więc zachowanie QB64 powinno być w porządku.

DLosc
źródło
3

Perl 5 i JavaScript (Node.js) , 96 bajtów

eval("printf=console.log");printf("This program errors out in %s :P",("Perl","JavaScript"));$//0

Wykorzystuje to fakt, że (...)jest to lista w Perlu, printfktóra użyje skrajnego lewego elementu, oraz fakt, że jest to operator przecinka w JavaScript, który zwróci argument skrajnie prawy.

Powoduje błąd dzielenia przez zero w Perlu i błąd ReferenceError, ponieważ $nie jest zdefiniowany w JavaScript.

Wypróbuj Perl online!

Wypróbuj JavaScript online!

Dom Hastings
źródło
3

Oktawa i MATLAB, 67 bajtów

v=ver;disp(['This program errors out in ' v(1).Name ' :P']);v(--pi)

Wypróbuj online!

Uwagi: Kod zakłada, że ​​MATLAB jest zainstalowany bez przyborników (lub że nazwy zainstalowanych przyborników nie zaczynają się od liter od A do M).

Jak to działa:

Kod pobiera dane wersji dla interpretera i przyborników ver. Uruchomione v(1).Namewypakowuje nazwę pierwszego produktu, to zwróci albo OctavealboMATLAB zakładając notę powyżej jest prawdziwe.

Następnie program wyświetli wymagany ciąg, wraz z OctavelubMATLAB w razie potrzeby.

Wreszcie to robimy v(--pi) .

W Octave --jest operatorem dekrementacji. W związku z tym próbuje wstępnie zmniejszyć, co kończy się niepowodzeniem, ponieważ zmienna pinie istnieje ( pijest w rzeczywistości funkcją, a nie zmienną).

This program errors out in Octave :P
error: in x-- or --x, x must be defined first

W MATLAB operator wstępnego zmniejszania nie istnieje. Jako takie zdanie jest interpretowane jako v(-(-pi))równe just v(pi). Jednak pinie jest liczbą całkowitą, więc nie można jej użyć do indeksowania vtablicy, co powoduje błąd.

This program errors out in MATLAB :P
Subscript indices must either be real positive integers or logicals.
Tom Carpenter
źródło
3

C ++ 14 (gcc) / C ++ 17 (gcc) , 107 105 bajtów

#include<cstdio>
int*p,c=*"??/0"/20;int
main(){*p=printf("This program errors out in C++ 1%d :P",4+c)/c;}

Wypróbuj online! (C ++ 14)

Wypróbuj online! (C ++ 17)


Zakłada, że <cstdio>deklaruje printfw globalnej przestrzeni nazw (opróczstd ) i że podstawowy zestaw znaków wykonawczych wykorzystuje wartości ASCII, które są prawdziwe przy użyciu g ++ w systemie Linux.

Podstawowym haczykiem jest to, że C ++ 17 wyeliminował trygrafy z języka.

W C ++ 14 "??/0"zawiera trigraf i jest równoważny "\0". Więc *"??/0"wynosi zero i cjest ustawione na zero. Liczba 4 jest przekazywana jako argument do printf, a następnie podział według cpowoduje niezdefiniowane zachowanie. W Linuksie dzieje się to wcześniej, niż *ppojawia się obraz, a program dostaje SIGFPE.

W C ++ 17 "??/0"oznacza dokładnie 4 ciąg znaków, na jaki wygląda. Podobnie *"??/0"jest '?'lub 63 i cjest ustawiony na 3. Liczba 7 jest przekazywana jako argument do printfi tym razem dzielenie przez cjest poprawne. Ponieważ pjest członkiem przestrzeni nazw, jest inicjalizowany zerem na początku programu i ma wartość wskaźnika zerowego, więc *pzachowanie jest niezdefiniowane. W systemie Linux, ponieważ program próbuje zmodyfikować pamięć pod adresem zero, program otrzymuje SIGSEGV.

aschepler
źródło
mainTyp powrotu można pominąć, więc -3 bajty.
Max Yekhlakov
2

Perl 5 i Perl 6 , 55 bajtów

say('This program errors out in Perl ',5-~-1,' :P').a/0

Wypróbuj Perl 5 online! (Nielegalny podział przez zero)

Wypróbuj Perl 6 online! (Brak takiej metody)

Prefiks ~to rygoryzacja w Perlu 6 i zasadniczo brak operacji w powyższym programie. W Perlu 5 nie jest to bitowe, konwersja -1 na 0.

. to składnia wywołania metody w Perlu 6 i konkatenacja w Perlu 5.

nwellnhof
źródło
2

C (gcc) / Stax , 109 bajtów

AA=~1;
	char* s;main(){*(int*)(printf("%s C :P",s))=0;}char* s=
"This program errors out in";;;/*dp`UGYC\`Q*/

Wypróbuj online! (C (gcc))

Wypróbuj online! (Stax) lub Uruchom i debuguj to! (Stax)

Segfault w C. Niepoprawna operacja w Stax. Uwielbiam, w jaki sposób wszystko, co nie jest komentarzem, jest faktycznie używane w Stax.

do

Tak to postrzega C. Pierwszy wiersz to no-op. Drugi wiersz wypisuje komunikat, printfa następnie segfault z powodu =0.

AA=~1;
	char* s;main(){*(int*)(printf("%s C :P\n",s))=0;}char* s=
"This program errors out in";;;/*dp`UGYC\`Q*/

Stax

Program Stax kończy się, gdy próbuje wyskoczyć lub zerkać z pustego stosu. To sprawia, że ​​jest to trochę trudne i musimy przygotować stos, który nie jest pusty. AA=~1;robi to, pozostając poprawną instrukcją w C.

AA=~1;
AA=       10=10, returns a 1
   ~      Put it on the input stack
    1     Pushes a 1 to main stack (*)
     ;    Peek from the input stack (**)

Naprawdę przydatne jest to ~, że przygotowuje niepusty stos wejściowy, aby ;można go było wykonać bez wychodzenia z programu. Jednak dwa 1symbole na głównym stosie są również używane później.

Drugi wiersz rozpoczyna się tabulatorem i rozpoczyna komentarz linii w Stax.

"...";;;/*dp`UGYC\`Q*/
"..."                     "This program errors out in"
     ;;;                  Peek the stack three times so that we have enough operands for the next two operations
        /                 Divide, this consumes one element of the main stack
         *                Multiply, this consumes another element
          d               Discard the result, now the TOS is the string
           p              Pop and print without newline
            `UGYC\`       Compressed string literal for " Stax :P"
                   Q      Print and keep the string as TOS
                    *     Duplicate string specific times
                          Since the element under the top of stack is `1` that was prepared in (**), this does nothing
                     /    Invalid operation error

Niepoprawna operacja próbuje wykonać /operację na łańcuchu jako TOS (drugi operand), a liczba 1od (*) jako pierwszy operand, co jest nieprawidłowe.

Jeśli dwa operandy zostaną zamienione, będzie to poprawna operacja w Stax.

Weijun Zhou
źródło
2

Galaretka i M , 39 bajtów

İ=`ị“¢³ƥ“Ȥ¹»;“ :P”“¢ḅñ⁵ẹḞŀẊịñṙȧṄɱ»;ȮṠṛƓ

Wypróbuj w galarecie!

Wypróbuj w M!

Oba języki obowiązują odwrotnie, İdla 0których wyniki infdla Jelly i zoodla M. Nie wiem, dlaczego zooreprezentuje nieskończoność w M. Zapytaj Dennisa.

Ważną różnicą jest to, że nieskończoność Jelly jest równa sobie, podczas gdy nieskończoność M nie jest. Zatem =`plon monady „równa się sobie” 1w galaretce i 0M. Stąd:

İ=`ị“¢³ƥ“Ȥ¹»;“ :P”“¢ḅñ⁵ẹḞŀẊịñṙȧṄɱ»;ȮṠṛƓ
İ=`                                      0 in M, 1 in Jelly
    “¢³ƥ“Ȥ¹»                             Pair of compressed strings: [' M',' Jelly']
   ị                                     Index into this list with 0 or 1
            ;“ :P”                       Concatenate with the string ' :P'
                  “¢ḅñ⁵ẹḞŀẊịñṙȧṄɱ»       Compressed string: 'This program errors in'
                                  ;      Prepend this to ' Jelly/M :P'
                                   Ȯ     Print the string and return it
                                    Ṡ    Sign. M errors with a string as input and terminates
                                         Jelly returns a list of Nones
                                     ṛ   Right argument. This prevents the list of Nones from being printed
                                      Ɠ  Read a single line from input. Since input is not allowed, this produces an EOFError

Błąd Jelly to EOFError: EOF when reading a line.

Błąd M. to TypeError: '>' not supported between instances of 'str' and 'int'.

dylnan
źródło
1
Jak zaczynasz to robić w dwóch esolangach?
Magic Octopus Urn
2

Foo / CJam , 51 50 bajtów

"This program errors out in ""Foo"/'C'J'a'm" :P"Li

To kończy się z błędem dzielenia przez zero w Foo i a NumberFormatExceptionw CJam.

Do CJam:

  • Dosłowny ciąg (między cudzysłowami) wypycha się na stos. Elementy ze stosu są automatycznie drukowane bez separatora po zakończeniu programu.
  • /próbuje podzielić ciąg This program errors out in na podciągu Foo. Ponieważ ciąg nie zawiera podłańcucha, daje to tablicę singleton zawierającą oryginalny ciąg, który wyświetla się dokładnie w ten sam sposób.
  • 'xjest literałem znaku dla x, który jest drukowany w taki sam sposób, jak ciąg jednoznakowy. W ten sposób możemy przekazywać dane dla CJam, które są ignorowane przez Foo (nie wymyśliłem, jak zrobić, aby pętla nie była wykonywana w Foo).
  • Lipróbuje rzucić pusty ciąg na liczbę całkowitą, co się nie powiedzie. Wszystko ze stosu jest drukowane.

Do Foo:

  • Drukuje się literał łańcuchowy (między cudzysłowami).
  • / próbuje podzielić bieżącą komórkę przez element najwyższego stosu (co jest niejawne 0 ). Z jakiegoś powodu błędy dzielenia przez 0 nie są śmiertelne w Foo, więc to po prostu drukuje komunikat
    Only Chuck Norris can divide by zero.
    do STDERR i idzie dalej.
  • Nierozpoznane znaki ( 'C'J'a'mi Li) są ignorowane.
Esolanging Fruit
źródło
2
Czy to ostatnie 50 bajtów?
Bubbler
@Bubbler Przepraszam, zapomniałem go edytować.
Esolanging Fruit
7
Myślę, że w interpretatorze Foo jest błąd. Powinno to oczywiście Only Jon Skeet can divide by zero. oznaczać
2

Python i Lua , 111 110 102 98 95 85 bajtów

x="This program errors out in ",#[[
print(x[0]+"Python :P")
a#]]z=#print(x.."Lua :P")

Błędy: Python 3:

Traceback (most recent call last):
  File ".code.tio", line 3, in <module>
    a#]]z=#print(x.."Lua :P")
NameError: name 'a' is not defined

Lua:

lua: .code.tio:3: attempt to get length of a nil value
stack traceback:
    .code.tio:3: in main chunk
    [C]: in ?

Wyraźnie wyraźny.

Nadużywa wielu różnic:

  • <var>=<a>,<b>,... tworzy krotkę w Pythonie, ale w Lua tworzy listę argumentów, z której pobierany jest tylko pierwszy element.
  • #rozpoczyna komentarz w Pythonie, ale jest operatorem długości w Lua. Dodatkowe rekwizyty dla Pythona za umożliwienie krotkom zakończenia przecinkiem.
  • [[...]]to wieloliniowa składnia łańcucha Lui, co oznacza, że ​​nawet nie widzi funkcji drukowania Pythona; jest to konieczne ze względu na użycie Lua ..do łączenia łańcuchów, a nie+ .
  • Błędy w Pythonie po zobaczeniu a, niezdefiniowana zmienna; Lua później z=#print(x.."Lua :P"). Używanie tylko #print(x.."Lua :P")dla Lua nie działa, ponieważ powoduje to błąd jeszcze przed wykonaniem kodu.

Edycje:

  • Nie ma potrzeby używania "".joinw Pythonie, -1 bajt
  • Utwórz xciąg w obu językach i umieść go Pythonw literale ciągu w funkcji drukowania, -8 bajtów
  • Użycie #[[]]jest krótsze niż #""i --[[]]-4 bajty
  • Nie trzeba używać #1jako klucza tabeli, -3 bajtów
  • Jo King to zrobił , -9 bajtów
  • print(x.."Lua :P")Najwyraźniej biorąc pod uwagę wartość zwracaną dzieł; -1 bajt
ivzem
źródło
1
86 bajtów
Jo King
2

Java i C # 242 235

/**\u002f/*/using System;/**/class G{public static void/**\u002fmain/*/Main/**/(String[]a){String s="This program errors out in ";/**\u002fSystem.out.print(s+"Java :P");/*/Console.Write(s+"C# :P")/**/;s=/**\u002f(1/0)+""/*/a[-1]/**/;}}

Nadużywanie różnych procedur zmiany znaczenia między Javą a C # (zmiany Unicode są analizowane przed parsowaniem kodu w Javie, a nie w C #) jako rodzaj preprocesora, co jest zadaniem \u0027 magiczna, reszta to niektóre „komentarze przełączające”

Edycja: 8 golfów poza golfem dzięki wskaźnikowi @KevinCruijssen

Edycja: Naprawiono derp reguły

masterX244
źródło
Możesz zagrać w golfa 6 bajtów, zmieniając oba Stringw var(Java 10 obsługuje to). (Lub 5 przez zmianę String s="...";do String s="...",x;i wyjąć Stringz przodu x=w Javie 9 lub wcześniej).
Kevin Cruijssen
1
ponowne użycie ciągu S działa również w java99 i wcześniejszych wersjach. @KevinCruijssen
masterX244
2

AutoHotKey / C #, 155 133 128 122 bajtów

Podświetlanie składni wyjaśnia to lepiej niż mogłem:

C # RuntimeBinderException: „Nie można wywołać typu nieprzedstawionego”

;dynamic
i="This program errors out in " ;Console.Write(i+"c# :P");i();/*
i:=SubStr(i,2,27)
send %i%AutoHotkey :P
Throw */

Błąd AutoHotkey : Zgłoszono wyjątek.

;dynamic
i="This program errors out in " ;Console.Write(i+"c# :P");i();/*
i:=SubStr(i,2,27)
send %i%AutoHotkey :P
Throw */

Edycje:

  1. usunięto var
  2. -5 bajtów dzięki mleku
nelsontruran
źródło
2
Oto nieco krótsza wyjątek rzucać w C #: i+=i[-1]. System.IndexOutOfRangeException: „Indeks był poza granicami tablicy”.
mleko
2
Nieco jeszcze krótszy do użycia dynamiczamiast vari wyrzucenia Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: „Nie można wywołać typu niebędącego delegatem” za pomocą i().
mleko
2

PHP 7+ / JavaScript, 90 89 bajtów

Używa 2 języków o bardzo podobnej składni, co pozwala na pisanie tego kodu w obu językach.

Separacji językowej dokonuje się przez właściwość nieobecną w JavaScript: PHP uważa [](pusta tablica) za wartość fałszowania, podczas gdy w JavaScript jest prawdziwa (ponieważ jest to obiekt, a obiekty są zawsze prawdziwe, nawet new Boolean(false)).

$X='This program errors out in %s :P';([]?console.log($X,'JavaScript'):printf($X,PHP))();


Wykonanie:

Skupi się na następujący fragment kodu: ([]?console.log($X,'JavaScript'):printf($X,PHP))();.

Przypisanie łańcucha działa tak samo w obu językach.

Ten kod używa „trójskładnikowego operatora” ( JavaScript , PHP ), który działa w większości w ten sam sposób w obu językach.

JavaScript

JavaScript uruchomi console.log($X,'JavaScript')element, który zwraca undefined.

Później, gdy spróbujesz wykonać (...)(), pojawi się Uncaught TypeError: (intermediate value)(intermediate value)(intermediate value) is not a function(w Google Chrome).

PHP

PHP wykona printf($X,PHP)utwór.

W PHP printffunkcja zwraca długość wyniku .

PHP ma ciekawą funkcjonalność: może wykonywać funkcje, których nazwa jest przechowywana w zmiennej (lub, od PHP7, jako wynik wyrażenia), co zapobiega błędowi składni.

PHP następnie spróbuje uruchomić funkcję, której nazwa jest wynikiem wyrażenia []? ... :printf($X,PHP)(czyli liczby 33).
Ale ta interesująca funkcjonalność ma zastrzeżenie: akceptuje tylko ciągi znaków (duh!).

To powoduje Fatal error: Function name must be a string, ponieważ 33jest int.


Dzięki Shieru Asakoto za uratowanie mnie 1 bajt!

Ismael Miguel
źródło
1
[]jest krótszy niż '0'i inaczej oceniany w JS i PHP, więc może -1 bajt tutaj?
Shieru Asakoto,
Mam mnóstwo pytań o tej sprawie, w którym []musi być używane zamiast '0', '\0', '\0'=="0", i że stosowane []przed, jak również. Ale dziękuję za odszukanie tego pytania.
Ismael Miguel,
1

Perl 5 i C, 95 bajtów

//;$_='
main(){puts(puts("This program errors out in C :P"));}//';/T.*n /;print$&,"perl :P";die

//; jest zasadniczo NOP w perlu i jest komentarzem w C.

Tak więc program C działa skutecznie:

main(){puts(puts("This program errors out in C :P"));}

Który wypisuje wymagany ciąg, a następnie próbuje uruchomić puts(32). Jest to technicznie niezdefiniowane zachowanie w C, ale powoduje błąd segmentacji w TIO i każdym systemie, do którego mam dostęp.

Program perl traktuje cały program C jako ciąg znaków, używa wyrażenia regularnego /T.*n /do dopasowania, This program errors out ina następnie drukuje to i perl :P. diepowoduje awarię programu z błędem Died at script_name line 2.

Jeśli nie podoba ci się to jako błąd, 1/0ma tę samą długość i ulega awarii z Illegal division by zerobłędem. po prostu lubiędie więcej;)

Wypróbuj online! (DO)

Wypróbuj online! (Perl)

Chris
źródło
1

VBScript, JScript, 72 bajty

x="VB"
'';x='J'
WScript.echo("This program errors out in "+x+"Script")
y

VBScript wydrukuje „Błąd środowiska wykonawczego Microsoft VBScript: Niezgodność typu:„ y ””
JScript wydrukuje „Błąd środowiska wykonawczego Microsoft JScript:„ y ”jest niezdefiniowany”

Peter Ferrie
źródło
1

JavaScript i Python 3, 105 91 bajtów

Błędy według NameError: name 'console' is not definedw Pythonie 3

a="This program errors out in %s :P"
1//2;print(a%"Python 3")
console.log(a,"JavaScript")()

Wypróbuj online!

... i przez TypeError: console.log(...) is not a functionw JavaScript.

a="This program errors out in %s :P"
1//2;print(a%"Python 3")
console.log(a,"JavaScript")()

Wypróbuj online!

Shieru Asakoto
źródło
1

Java (JDK) / JavaScript (Node.js), 154 bajtów

class P{P(){var s="This program errors out in ";try{System.out.printf("%sJava :P",s);}finally{if(1!='1'){var a=0/0;}throw new Error(s+"JavaScript :P");}}}

Wypróbuj online! (Jawa)

Wypróbuj online! (JavaScript)

Dane wyjściowe w Javie:

This program errors out in Java :P
Exception in thread "main" java.lang.ArithmeticException: / by zero
    at P.(Main.java:1)

Dane wyjściowe w JavaScript (do stderr):

Error: This program errors out in JavaScript :P
    at P (/home/runner/.code.tio:1:185)

Wykorzystuje to słabe pisanie w JavaScript ( 1=='1') w celu wykrycia języka, te same słowa kluczowe w Javie i JavaScript ( var, class) oraz podobne konstruktory błędów ( new Error()) w celu utworzenia poliglota.

Logern
źródło
1

PowerShell v6 i PowerShell v2, 73 bajty

"This errors out in PowerShell v$($PSVersionTable.PSVersion) :P"
1-shl1/0

Wypróbuj online!

Spowoduje to wygenerowanie błędu analizy na v2, ponieważ -shlzostał wprowadzony w v3. v3 + będzie wtedy w stanie poprawnie przesunąć wartość przed próbą podzielenia jej przez 0, dogodnie zgłaszając błąd dzielenia przez zero. Obie wersje mają tablicę skrótów $ PSVersionTable, która zawiera PSVersionpole

Veskah
źródło
0

C (gcc) w systemie Linux / C (gcc) w systemie Mac (160)

#include <sys/utsname.h>
main(){struct utsname n;float g;uname(&n);printf("This program errors out in C(gcc) on %s :P\n",n.sysname);g=1/(int)gamma(1);abort();}

Nie przetestowano na komputerze Mac; w zasadzie John Cook zwrócił uwagę (na swoim blogu ), że POSIX nie definiuje gamma; Linux używa logu funkcji gamma (log (gamma (1)) zwróci 0, co spowoduje wyjątek zmiennoprzecinkowy); OSX używa „prawdziwej” funkcji gamma (która jest oficjalnie nazywana tgamma według POSIX); zwraca 1, który następnie wyświetli instrukcję przerwania; Próbowałem zmusić go do wygenerowania innego błędu zmiennoprzecinkowego (np. Sqrt (-1), ale zapominam, jak sprawić, aby błąd ten był wyświetlany w przeciwieństwie do po prostu zwracania zera)

Foon
źródło
0

Perl, Bash (78 bajtów)

printf "This program errors out in ";eval 'echo Bash :P'||print"Perl :P
";
a()

Dane wyjściowe w Perlu:

This program errors out in Perl :P
Undefined subroutine &main::a called at /tmp/perlbash line 3.

Dane wyjściowe w Bash:

This program errors out in Bash :P
/tmp/perlbash: line 4: syntax error: unexpected end of file

(Zauważ, że Bash rzeczywiście wyświetla line 4błąd, pomimo faktu, że linia 3 nie kończy się na linii ...)

Daniel Schepler
źródło
0

C (gcc) i Haskell , 135 bajtów

char/*x=0-- */*
s="This program errors out in ";
int main(){--s;*s=printf("%sC :P",s+1);}//-}=0;main=mapM print[s++"Haskell :P",tail""]

Wypróbuj online (С)! Wypróbuj online (Haskell)!

Wynik uzyskuje się przez przeplatanie komentarzy, przy czym wersja C jest zasadniczo taka:

char * s = "This program errors out in ";
int main ()
{
   --s;
   *s = printf ("%sC :P", s + 1);
}

(Niepowodzenie osiąga się przez napisanie przed początkiem łańcucha).

Z drugiej strony wersja Haskell ogranicza się do:

char /* x = 0 -- a useless operator (/*) taking two arguments
s = "This program errors out in ";
int main () = 0 -- a useless function int taking two arguments
main = mapM print [s ++ "Haskell :P", tail ""]

(Niepowodzenie osiąga się przez wzięcie ogona z pustej listy)

Max Yekhlakov
źródło