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ćJavaScript
nazwy swojego języka, ale nieJS
lubJavascript
.) - Pełna nazwa na oficjalnej stronie internetowej (lub repozytorium GitHub), jeśli Twój wybrany język nie jest dostępny w TIO.
- Nazwa wymieniona w TIO , opcjonalnie z wyłączeniem numeru wersji i / lub nazwy implementacji (np. Jeśli używasz
- Ż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łędziesomething 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 :P
na standardowe wyjście, a następnie indeksuj poza granicami
C89 i C99
- C89:
This program errors out in C 89 :P
na standardowe wyjście, a następnie dzielenie przez zero - C99:
This program errors out in C 99 :P
do 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 :P
na 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 :P
na standardowe wyjście, a następnie błąd klucza podczas dyktafonu
Perl i Perl -n
- Perl:
This program errors out in Perl :P
do standardowego, a następnie nieprawidłowego formatu czasu - Perl
-n
:This program errors out in Perl -n :P
na standardowe wyjście, a następnie spróbuj otworzyć plik, który nie istnieje
Warunki wygranej
To jest golf golfowy , 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.
This program errors out in ...
zawierać mieszane tabulatory / spacje zamiast spacji?Odpowiedzi:
Python 2 / Python 3 , 60 bajtów
NameError: name 'a' is not defined
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((...)*1)
, tutaj*1
oznacza to powtórzenie łańcucha raz.Python 3:
(print(...))*1
.print
zwracaNone
; Mnożenie nie działaNone x int
, więc zgłasza „nieobsługiwany operand”.źródło
C i C ++,
114101 bajtów-13 bajtów dzięki l4m2 !
Błąd segmentacji w C ++, wyjątek zmiennoprzecinkowy w C.
auto
jest domyślnie ustawiony naint
C, więc(int).5
staje się0
, więc próba podzielenia przez to jest w zasadzie dzielenie przez zero.W C ++
1/d
jest 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!
źródło
"++"+n
, gdzien
jest0
C ++ i2
Cd?"++":""
9 znaków,"++"+4*d
8 znaków Ale pobiera C / C ++ do tyłu. Westchnienie.int main(){auto d=.5;printf("This program errors out in C%s :P",d?"++":"");2[&d]+=1/d;}
(105) choć nie wiem dlaczegoint
można pominąćL"⬫"+!d
zamiastd?"++":""
JavaScript + HTML / HTML + JavaScript, 160 bajtów
Nie jestem pewien, czy liczą się dwa języki, ale jest to zabawne.
źródło
<!-- ... -->
jako jednowierszowych znaczników komentarzy (wiem, że jest to w specyfikacji ze względu na kompatybilność wsteczną)Java 8 i C99, 172 bajty
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:
Jak widać w powyższym kodzie wyróżnionym w Javie, pierwszy wiersz jest komentarzem
//
, a kod C jest komentarzem/* ... */
, w wyniku czego: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 .
Nie jestem pewien, jak poprawnie włączyć podświetlanie C, ponieważ
lang-c
powoduje to takie samo podświetlanie jak Java. Ale//\
skomentuje następny wiersz, którym jest kod Java, w wyniku czego:Więc łączy się z STDOUT, a następnie podaje błąd przez zero.
źródło
//
Dodano C C99.C99
.a[1]
zamiasta[0]
?1
od samego początku. Mogła wykorzystać0
,9
itp, jak również. Jeśli mam coś do edycji na temat tego wpisu, zmienię go0
również na ten sam czas.Java 8 i białe znaki ,
439431428408 bajtówWypró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:
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ń:
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:
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
111
pomocą 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:
S
na początku: Enable Stack Manipulation;S
: Naciśnij, co następuje jako Liczba;S
lubT
: odpowiednio pozytywny lub negatywny;Niektóre
S
i / lubT
, po których następujeN
: Liczba jako binarna, gdzieT=1
iS=0
.Oto kilka przykładów:
SSSTN
;SSTTN
;SSSTTSTTTTN
.SSSSN
,SSTSN
,SSSN
,SSTN
,SSSSSSSSSSSSN
, itd. (W przypadku korzystaniaSSSN
(lubSSTN
), nie trzeba określać część binarny, bo to w sposób dorozumiany 0 po my wyraziła znak).Wystarczy więc
SSSN
przesunąć wartość0
(o
w tym przypadku jest to litera). Ale, aby umieścić program Java w tym golfowym programie Whitespace, potrzebowałem dodatkowej przestrzeni, więc pierwsze dwao
są przesuwaneSSSN
, ale trzeci jest przesuwanySSSSN
, więc mamy wystarczająco dużo miejsca na zdanie programu Java.źródło
Kod maszynowy CBM BASIC i 6502 (C64),
142144 bajtyMusiałem dodać 2 bajty po zrealizowaniu błędu składniowego nie było dozwolone ....
Hexdump
.prg
pliku:Widok CBM BASIC , wymieniony w edytorze C64:
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 :
Demo online , wpisz,
run
aby uruchomić jako BASIC,sys 2049
aby uruchomić jako kod maszynowy,list
aby 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
Wyjaśnienie:
Pierwsze dwa bajty
.prg
pliku to adres ładowania w małym endianie, tutaj$0801
(dziesiętnie2049
), który jest adresem początkowym programów BASIC na C64.run
uruchamia ten program w interpretatorze BASIC, natomiastsys 2049
jest poleceniem uruchomienia programu kodu maszynowego pod adresem2049
.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 08
jest 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. Jest50
to używany tutaj kod operacji, więc druga linia musi zaczynać się od,0850
aby sztuczka zadziałała. Dlatego widzisz sekwencję 520
bajtó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
0
w CBM BASIC) są podzielone, co powoduje błąd „dzielenie przez zero”.źródło
> <> i Foo , 42 bajty
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...
źródło
><>
zawiera listę przyczyn błędów, więc uważam, że powinieneś podać jeden z nich, a niesomething smells fishy...
.p
popuFoo
jest bardzo sprytne!C i Python,
126116 bajtów-10 bajtów dzięki @Bubbler!
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!
źródło
-print(...)
aby podnieść aTypeError
w 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 ).Attache + Wolfram Language (Mathematica) , 82 bajty
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
Print
zwraca tablicę wydrukowanych ciągów, a odejmowanie nie jest możliwe w przypadku ciągów i liczb całkowitych (mianowicie0
). Zgłaszany jest zatem błąd typu. W MathematicaPrint
zwracaNull
i Mathematica dobrze odejmuje0
to. Ale ręcznie wyrzucamy to zeroThrow
, dającnocatch
błąd.źródło
Python (2) i QB64 , 82 bajty
Aby przetestować wersję Python, możesz wypróbować ją online!Aby przetestować wersję QB64, musisz pobrać QB64.
Co widzi Python
Pierwszy wiersz to tylko gołe wyrażenie
1
(no-op), po którym następuje komentarz.Druga linia
s
jest 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
NameError
powodu niezdefiniowanej nazwyCLS
.Co widzi QB64
Pierwsza linia, ponumerowana
1#
, definiuje każdą zmienną, której nazwa zaczyna się odS
(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 skoroCLS
tylko przyjmuje argumenty0
,1
czy2
ta produkuje błądIllegal 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.źródło
Perl 5 i JavaScript (Node.js) , 96 bajtów
Wykorzystuje to fakt, że
(...)
jest to lista w Perlu,printf
któ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!
źródło
Oktawa i MATLAB, 67 bajtów
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
. Uruchomionev(1).Name
wypakowuje nazwę pierwszego produktu, to zwróci alboOctave
alboMATLAB
zakładając notę powyżej jest prawdziwe.Następnie program wyświetli wymagany ciąg, wraz z
Octave
lubMATLAB
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ż zmiennapi
nie istnieje (pi
jest w rzeczywistości funkcją, a nie zmienną).W MATLAB operator wstępnego zmniejszania nie istnieje. Jako takie zdanie jest interpretowane jako
v(-(-pi))
równe justv(pi)
. Jednakpi
nie jest liczbą całkowitą, więc nie można jej użyć do indeksowaniav
tablicy, co powoduje błąd.źródło
C ++ 14 (gcc) / C ++ 17 (gcc) ,
107105 bajtówWypróbuj online! (C ++ 14)
Wypróbuj online! (C ++ 17)
Zakłada, że
<cstdio>
deklarujeprintf
w 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 ic
jest ustawione na zero. Liczba 4 jest przekazywana jako argument doprintf
, a następnie podział wedługc
powoduje niezdefiniowane zachowanie. W Linuksie dzieje się to wcześniej, niż*p
pojawia się obraz, a program dostajeSIGFPE
.W C ++ 17
"??/0"
oznacza dokładnie 4 ciąg znaków, na jaki wygląda. Podobnie*"??/0"
jest'?'
lub 63 ic
jest ustawiony na 3. Liczba 7 jest przekazywana jako argument doprintf
i tym razem dzielenie przezc
jest poprawne. Ponieważp
jest członkiem przestrzeni nazw, jest inicjalizowany zerem na początku programu i ma wartość wskaźnika zerowego, więc*p
zachowanie jest niezdefiniowane. W systemie Linux, ponieważ program próbuje zmodyfikować pamięć pod adresem zero, program otrzymujeSIGSEGV
.źródło
main
Typ powrotu można pominąć, więc -3 bajty.Perl 5 i Perl 6 , 55 bajtów
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.źródło
C (gcc) / Stax , 109 bajtów
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,
printf
a następnie segfault z powodu=0
.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.Naprawdę przydatne jest to
~
, że przygotowuje niepusty stos wejściowy, aby;
można go było wykonać bez wychodzenia z programu. Jednak dwa1
symbole na głównym stosie są również używane później.Drugi wiersz rozpoczyna się tabulatorem i rozpoczyna komentarz linii w Stax.
Niepoprawna operacja próbuje wykonać
/
operację na łańcuchu jako TOS (drugi operand), a liczba1
od (*) jako pierwszy operand, co jest nieprawidłowe.Jeśli dwa operandy zostaną zamienione, będzie to poprawna operacja w Stax.
źródło
Galaretka i M , 39 bajtów
Wypróbuj w galarecie!
Wypróbuj w M!
Oba języki obowiązują odwrotnie,
İ
dla0
których wynikiinf
dla Jelly izoo
dla M. Nie wiem, dlaczegozoo
reprezentuje 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”1
w galaretce i0
M. Stąd:Błąd Jelly to
EOFError: EOF when reading a line
.Błąd M. to
TypeError: '>' not supported between instances of 'str' and 'int'
.źródło
Foo / CJam ,
5150 bajtówTo kończy się z błędem dzielenia przez zero w Foo i a
NumberFormatException
w CJam.Do CJam:
/
próbuje podzielić ciągThis program errors out in
na podciąguFoo
. 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.'x
jest literałem znaku dlax
, 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).Li
próbuje rzucić pusty ciąg na liczbę całkowitą, co się nie powiedzie. Wszystko ze stosu jest drukowane.Do Foo:
/
próbuje podzielić bieżącą komórkę przez element najwyższego stosu (co jest niejawne0
). Z jakiegoś powodu błędy dzielenia przez 0 nie są śmiertelne w Foo, więc to po prostu drukuje komunikat do STDERR i idzie dalej.'C'J'a'm
iLi
) są ignorowane.źródło
Only Jon Skeet can divide by zero.
oznaczaćPython i Lua ,
111110102989585 bajtówBłędy: Python 3:
Lua:
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+
.a
, niezdefiniowana zmienna; Lua późniejz=#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:
"".join
w Pythonie, -1 bajtx
ciąg w obu językach i umieść goPython
w literale ciągu w funkcji drukowania, -8 bajtów#[[]]
jest krótsze niż#""
i--[[]]
-4 bajty#1
jako klucza tabeli, -3 bajtówprint(x.."Lua :P")
Najwyraźniej biorąc pod uwagę wartość zwracaną dzieł; -1 bajtźródło
Java i C #
242235Naduż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
źródło
String
wvar
(Java 10 obsługuje to). (Lub 5 przez zmianęString s="...";
doString s="...",x;
i wyjąćString
z przodux=
w Javie 9 lub wcześniej).AutoHotKey / C #,
155133128122 bajtówPodświetlanie składni wyjaśnia to lepiej niż mogłem:
C # RuntimeBinderException: „Nie można wywołać typu nieprzedstawionego”
Błąd AutoHotkey : Zgłoszono wyjątek.
Edycje:
źródło
i+=i[-1]
. System.IndexOutOfRangeException: „Indeks był poza granicami tablicy”.dynamic
zamiastvar
i wyrzucenia Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: „Nie można wywołać typu niebędącego delegatem” za pomocąi()
.PHP 7+ / JavaScript,
9089 bajtówUż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, nawetnew Boolean(false)
).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 zwracaundefined
.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
printf
funkcja 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 liczby33
).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ż33
jestint
.Dzięki Shieru Asakoto za uratowanie mnie 1 bajt!
źródło
[]
jest krótszy niż'0'
i inaczej oceniany w JS i PHP, więc może -1 bajt tutaj?[]
musi być używane zamiast'0'
,'\0'
,'\0'=="0"
, i że stosowane[]
przed, jak również. Ale dziękuję za odszukanie tego pytania.Perl 5 i C, 95 bajtów
//;
jest zasadniczo NOP w perlu i jest komentarzem w C.Tak więc program C działa skutecznie:
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 in
a następnie drukuje to iperl :P
.die
powoduje awarię programu z błędemDied at script_name line 2
.Jeśli nie podoba ci się to jako błąd,
1/0
ma tę samą długość i ulega awarii zIllegal division by zero
błędem. po prostu lubiędie
więcej;)Wypróbuj online! (DO)
Wypróbuj online! (Perl)
źródło
VBScript, JScript, 72 bajty
VBScript wydrukuje „Błąd środowiska wykonawczego Microsoft VBScript: Niezgodność typu:„ y ””
JScript wydrukuje „Błąd środowiska wykonawczego Microsoft JScript:„ y ”jest niezdefiniowany”
źródło
JavaScript i Python 3,
10591 bajtówBłędy według
NameError: name 'console' is not defined
w Pythonie 3Wypróbuj online!
... i przez
TypeError: console.log(...) is not a function
w JavaScript.Wypróbuj online!
źródło
Java (JDK) / JavaScript (Node.js), 154 bajtów
Wypróbuj online! (Jawa)
Wypróbuj online! (JavaScript)
Dane wyjściowe w Javie:
Dane wyjściowe w JavaScript (do stderr):
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.źródło
PowerShell v6 i PowerShell v2, 73 bajty
Wypróbuj online!
Spowoduje to wygenerowanie błędu analizy na v2, ponieważ
-shl
został 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 zawieraPSVersion
poleźródło
C (gcc) w systemie Linux / C (gcc) w systemie Mac (160)
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)
źródło
Perl, Bash (78 bajtów)
Dane wyjściowe w Perlu:
Dane wyjściowe w Bash:
(Zauważ, że Bash rzeczywiście wyświetla
line 4
błąd, pomimo faktu, że linia 3 nie kończy się na linii ...)źródło
C i ECPP, 112 bajtów
Hangup
.Illegal instruction
.źródło
C (gcc) i Haskell , 135 bajtów
Wypróbuj online (С)! Wypróbuj online (Haskell)!
Wynik uzyskuje się przez przeplatanie komentarzy, przy czym wersja C jest zasadniczo taka:
(Niepowodzenie osiąga się przez napisanie przed początkiem łańcucha).
Z drugiej strony wersja Haskell ogranicza się do:
(Niepowodzenie osiąga się przez wzięcie ogona z pustej listy)
źródło