Inspiriert von Ich bin nicht die Sprache, die Sie suchen!
Herausforderung
Wählen Sie zwei verschiedene Programmiersprachen und schreiben Sie ein Programm, das die folgende Zeile in stdout (oder ein gleichwertiges Programm) ausgibt:
This program errors out in <the current language> :P
und erzeugt dann unterschiedliche Arten von Fehlern in jeder der beiden Sprachen.
Regeln
Einige Regeln sind der ursprünglichen Herausforderung entnommen.
- In der Ausgabe sollten die Namen der Sprachen genau wie folgt lauten:
- Der in TIO aufgeführte Name , optional mit Ausnahme der Versionsnummer und / oder des Implementierungsnamens (z. B. wenn Sie
JavaScript (Node.js)
eine Ihrer Sprachen verwenden, könnenJavaScript
Sie den Namen für Ihre Sprache verwenden, aber nichtJS
oderJavascript
.) - Den vollständigen Namen finden Sie auf der offiziellen Website (oder auf GitHub Repo), wenn Ihre Sprache bei TIO nicht verfügbar ist.
- Der in TIO aufgeführte Name , optional mit Ausnahme der Versionsnummer und / oder des Implementierungsnamens (z. B. wenn Sie
- Keines der Programme sollte Eingaben vom Benutzer entgegennehmen.
- Sie können Kommentare in beiden Sprachen verwenden.
- Zwei verschiedene Versionen derselben Sprache zählen als verschiedene Sprachen.
- In diesem Fall sollte das Programm die Hauptversionsnummer ausgeben und bei Ausführung auf zwei verschiedenen Nebenversionen auch die Nebenversion melden.
- Sie sollten keine vorgefertigten Versionsfunktionen verwenden (dies schließt Variablen ein, die bereits zur Laufzeit ausgewertet wurden).
- Zwei verschiedene Befehlszeilen-Flags in derselben Sprache zählen ebenfalls als verschiedene Sprachen gemäß diesem Metakonsens , sofern die Flags keine Codefragmente enthalten (wie
-Dblahblah...
in C).- In diesem Fall sollte das Programm auch das verwendete Flag ausgeben.
- Zwei Fehler werden als unterschiedlich betrachtet, es sei denn, beide Fehler werden durch dieselbe Semantik generiert (z. B. "Division durch Null", "Segmentierungsfehler" oder "Index außerhalb des Bereichs").
- Wenn die Laufzeit einer Sprache nach einem Fehler nicht beendet wird, der Fehler jedoch auf irgendeine Weise an den Benutzer gemeldet wird, handelt es sich um einen gültigen Fehler.
- Wenn eine Sprache die Fehlermeldungen nicht unterscheidet, aber eine bekannte Liste der Fehlerursachen hat, müssen Sie den Grund und nicht die Fehlermeldung angeben.
Ein Beispiel ist><>
, das nur eine Fehlermeldung enthältsomething smells fishy...
, aber die Wiki-Seite von esolangs enthält eine Liste der Fehlerursachen.
- Syntaxfehler sind nur zulässig, wenn sie durch Aufrufen
eval()
oder ähnliches generiert werden . - Manuelles Werfen (über
throw
(JS),raise
(Python),die
(Perl) oder ähnliches) ist erlaubt, aber alle werden als eine Art von Fehler angesehen. - Fehler durch ungültigen Befehl in 2D oder Golflang sind ebenfalls zulässig (und werden als eine Art von Fehler behandelt).
Beispiele
Python und Ruby
- Python:
This program errors out in Python :P
zu stdout, dann undefinierter Bezeichner - Ruby:
This program errors out in Ruby :P
Zu stdout, dann außerhalb der Grenzen indexieren
C89 und C99
- C89:
This program errors out in C 89 :P
auf Standard , dann Division durch Null - C99:
This program errors out in C 99 :P
Zu Standard, dann Segmentierungsfehler
Beachten Sie, dass die Versionsnummer immer durch ein Leerzeichen vom Namen der Sprache getrennt sein muss.
Python 2.7.9 und Python 2.7.10
- Python 2.7.9:
This program errors out in Python 2.7.9 :P
Zu stdout, dann Syntaxfehler bei eval - Python 2.7.10:
This program errors out in Python 2.7.10 :P
nach stdout, dann key error on dict
Perl und Perl -n
- Perl:
This program errors out in Perl :P
zu stdout, dann ungültiges Zeitformat - Perl
-n
:This program errors out in Perl -n :P
zu stdout, dann versuchen Sie, eine Datei zu öffnen, die nicht existiert
Gewinnbedingung
Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes. Aber Sie werden immer aufgefordert, eine Antwort zu schreiben, die Spaß macht oder interessant ist, auch wenn sie nicht sehr kurz ist.
This program errors out in ...
gemischte Tabulatoren / Leerzeichen anstelle von Leerzeichen enthalten?Antworten:
Python 2 / Python 3 , 60 Bytes
NameError: name 'a' is not defined
unsupported operand type(s) for *: 'NoneType' and 'int'
Python 2:
/
ist eine Ganzzahldivision, 3/2 hat 1; int (3/2 * 2) ist 2.print((...)*1)
,*1
dass die Zeichenfolge einmal wiederholt wird.Python 3:
(print(...))*1
.print
kehrt zurückNone
; Die Multiplikation funktioniert nichtNone x int
, daher wird "nicht unterstützter Operand" gemeldet.quelle
C und C ++
114101 Bytes-13 bytes dank l4m2 !
Segmentierungsfehler in C ++, Gleitkomma-Ausnahme in C.
auto
wird standardmäßigint
in C so(int).5
wird0
, so dass der Versuch, durch es zu teilen, im Grunde durch Null dividiert wird.In C ++
1/d
ist es 2, wenn Sie es zur Adresse von hinzufügend
und versuchen, den Wert dieser Adresse zu ändern, wird ein Segfault ausgelöst.Probieren Sie es in C ++!
Probieren Sie es in C!
quelle
"++"+n
, won
ist0
für C ++ und2
für Cd?"++":""
9 char,"++"+4*d
8 char. Bekommt aber C / C ++ rückwärts. Seufzer.int main(){auto d=.5;printf("This program errors out in C%s :P",d?"++":"");2[&d]+=1/d;}
(105) obwohl ich nicht weiß warumint
kann entfallenL"⬫"+!d
stattdessen vord?"++":""
JavaScript + HTML / HTML + JavaScript, 160 Byte
Ich bin nicht sicher, ob dies zwei Sprachen sind, aber es ist lustig.
quelle
<!-- ... -->
als einzeilige Kommentar-Marker (ich weiß, dass dies aus Gründen der Abwärtskompatibilität in der Spezifikation ist)Java 8 & C99, 172 Bytes
Basierend auf meine Antwort auf die ‚abc‘ und ‚cba‘ Herausforderung .
Versuchen Sie es in Java 8 - was zu einer ArrayIndexOutOfBoundsException führt: 1 .
Versuchen Sie es in C - dies führt zu einer Gleitkomma-Ausnahme: Division durch Null ist undefiniert .
Erläuterung:
Wie Sie im obigen Java-hervorgehobenen Code sehen können, ist die erste Zeile ein Kommentar aufgrund
//
und der C-Code ist ein Kommentar aufgrund/* ... */
, was zu Folgendem führt:Also druckt es auf STDOUT und versucht dann, auf das zweite Programmargument zuzugreifen (wenn keines angegeben ist), so dass es die ArrayIndexOutOfBoundsException erzeugt .
Ich bin mir nicht sicher, wie ich C-Hervorhebung richtig aktivieren soll, da dies
lang-c
zu derselben Hervorhebung wie bei Java führt. Aber//\
ich werde die nächste Zeile, den Java-Code, auskommentieren, was zur Folge hat:Daher wird auf STDOUT zurückgegriffen und anschließend ein Fehler durch Null dividiert.
quelle
//
wurde mit C99 zu C hinzugefügt.C99
.a[1]
statta[0]
?1
von Anfang an eine eingegeben. Kann verwendet haben0
,9
etc. auch. Wenn ich etwas über diesen Beitrag zu bearbeiten habe, werde ich es gleichzeitig ändern0
.Java 8 & Whitespace ,
439431428408 BytesVersuchen Sie es in Java 8, was zu einer ArrayIndexOutOfBoundsException von 0 führt .
Versuchen Sie es in Whitespace - was zu einem Benutzerfehler führt (Infix Plus nicht möglich) .
Erläuterung:
Java 8:
Also druckt es nach STDOUT und versucht dann, auf das erste Programmargument zuzugreifen (wenn keines angegeben ist), so dass es die ArrayIndexOutOfBoundsException erzeugt .
Leerzeichen:
Buchstaben
S
(Leerzeichen),T
(Tabulator) und (Zeilenvorschub) werdenN
nur als Hervorhebungen hinzugefügt.[..._some_action]
nur als Erklärung hinzugefügt.Probieren Sie diese hervorgehobene Version aus.
Whitespace ist eine stapelbasierte Sprache, die alles außer Leerzeichen, Tabulatoren und Zeilenumbrüchen ignoriert. Hier ist das gleiche Programm in Pseudocode:
Sobald alle Werte gedruckt wurden und der Stack leer ist, tritt ein Fehler auf, wenn das Hinzufügen versucht wird (
TSSS
) ausgeführt wird, wofür zwei Elemente auf dem Stapel erforderlich sind.Ich habe die Konstante
111
mit diesem Java-Programm generiert , das ich auch für frühere ASCII-bezogene Herausforderungen in Whitespace verwendet habe. Außerdem habe ich einige Kopien für die Leerzeichen verwendet, um Bytes zu sparen.Ein wichtiger Punkt ist der Trick, mit dem ich das Java-Programm in die Whitespace-Antwort eingefügt habe. Lassen Sie mich zunächst erklären, wie eine Zahl in Whitespace verschoben wird:
S
zu Beginn: Stack-Manipulation aktivieren;S
: Drücke was folgt als Nummer;S
oderT
: positiv oder negativ;Einige
S
und / oderT
, gefolgt von einerN
: Zahl als Binärzahl, wobeiT=1
undS=0
.Hier einige Beispiele:
SSSTN
;SSTTN
;SSSTTSTTTTN
.SSSSN
,SSTSN
,SSSN
,SSTN
,SSSSSSSSSSSSN
usw. (Wenn SieSSSN
(oderSSTN
), wissen wir nicht den binären Teil angeben müssen, weil sie implizit zum 0 , nachdem wir ihr Vorzeichen angegeben haben.)Es
SSSN
reicht also aus, um den Wert zu erhöhen0
(o
in diesem Fall für den Buchstaben verwendet ). Aber um das Java-Programm in dieses Golf-Whitespace-Programm einzufügen, brauchte ich ein zusätzliches Leerzeichen, damit die ersten beideno
mitSSSN
, aber das dritte mit gedrückt werdenSSSSN
, damit wir genug Platz für den Satz des Java-Programms haben.quelle
CBM BASIC und 6502 Maschinencode (C64),
142144 BytesMusste 2 Bytes nach dem Erkennen eines Syntaxfehlers hinzufügen war nicht erlaubt ....
Hexdump der
.prg
Datei:Die CBM-BASIC-Ansicht , wie im C64-Editor aufgeführt:
Achtung : Es ist nicht möglich, dieses Programm im BASIC-Editor korrekt einzugeben. Versuchen Sie nicht einmal , dieses Programm im BASIC-Editor zu bearbeiten , da es sonst abstürzt. Trotzdem ist es ein lauffähiges BASIC-Programm;)
Die Maschinencodeansicht 6502 :
Online-Demo , geben Sie ein
run
, um als BASICsys 2049
auszuführen, um als Maschinencode auszuführen,list
um anzuzeigen, dass er als BASIC-Code interpretiert wird.Als BASIC
division by zero error in 1
ausführen erzeugt a , als Maschinencode ausführen acan't continue error
Erläuterung:
Die ersten zwei Bytes einer
.prg
Datei sind die Ladeadresse in Little Endian, dies ist hier$0801
(dezimal2049
) die Startadresse für BASIC-Programme auf dem C64.run
Startet dieses Programm im BASIC-Interpreter. Dabeisys 2049
handelt es sich um den Befehl zum Ausführen eines Maschinencode-Programms unter der Adresse2049
.Wie Sie sehen, ist die erste Zeile in der BASIC-Ansicht ein Kommentar (
rem
), der "Garbage" und einen Teil der erforderlichen Ausgabezeichenfolge enthält. Dies ist das Maschinencodeprogramm und einige Füllbytes. Sie sehen dort einige "zufällige" BASIC-Befehle, da CBM-BASIC-Programme die Befehle als Einzelbyte-Werte "tokenisiert" enthalten und einige dieser Werte mit den im Maschinencode verwendeten Opcodes identisch sind. Der Maschinencode verwendet die in der zweiten Codezeile vorhandene Zeichenfolge für die Ausgabe.Die ersten zwei Bytes einer Zeile eines Basisprogramms sind hier ein Zeiger auf die nächste Zeile
$0850
. Dies wird mit Bedacht gewählt, da50 08
es sich auch um einen 6502-Verzweigungsbefehl handelt, der über die nächsten 8 Bytes springt, wenn das Überlaufflag nicht gesetzt ist. Dies wird verwendet, um bei Ausführung als Maschinencode irgendwo in die Mitte dieser "Kommentar" -Zeile zu springen. Das50
ist der Opcode hier verwendet wird , so dass die zweite Leitung an beginnen muss0850
für den Trick an der Arbeit. Aus diesem Grund sehen Sie eine Folge von 520
Bytes (Leerzeichen) zum Auffüllen. Der Maschinencode springt aktiv zur ROM-Fehlerbehandlungsroutine, um den Fehler "Kann nicht fortgesetzt werden" zu erhalten.Der BASIC-Code ist ziemlich einfach; Als zweites Argument für "print" werden zwei nicht initialisierte Variablen (mit einem Wert
0
in CBM BASIC) geteilt, wodurch der Fehler "Division durch Null" ausgelöst wird.quelle
> <> und Foo , 42 Bytes
Probieren Sie es in> <>!
Probieren Sie es in Foo!
Foo druckt
"
, wie gut dokumentiert, alles ein und versucht am Ende, durch Null zu dividieren. Es ignoriert die'><>'
.><>
schiebt das "Foo" auf den Stapel, knallt es aber sofort mitp
. Nachdem es alles auf den Stapel gedruckt hat, wird#o<
es beendet, wenn der Stapel mit der einzigen ihm bekannten Fehlermeldung leer ist.something smells fishy...
quelle
><>
hat eine Liste von Fehlerursachen, daher sollten Sie meines Erachtens eine davon angeben, nichtsomething smells fishy...
.p
PopFoo
ist sehr klug!C und Python
126116 Bytes-10 Bytes dank @Bubbler!
In Python ist print () ein None, daher macht es keinen Sinn, sein Negativ zu erhalten, und Python gibt einen Fehler aus.
In C gibt printf () ein int zurück, sodass eine Gleitkomma-Ausnahme entsteht, wenn man es durch Null teilt.
Probieren Sie es in C!
Probieren Sie es in Python!
quelle
-print(...)
aTypeError
in Python erhöhen , und dann können Sie Floating Point Error (Division durch Null) in C erstellen. In Kombination mit einigen redundanten Zeilenumbrüchen sind dies 116 Bytes ( Python , C ).Attache + Wolfram Language (Mathematica) , 82 Byte
Versuchen Sie Attache online! Probieren Sie Mathematica online aus!
Dies hängt von der Bedeutung des Operators
=
in den beiden Sprachen ab. In Attache wird die Gleichheit verglichen, in Mathematica wird jedoch eine Variablenzuweisung durchgeführt.:=
Führt eine variable Zuweisung in beiden Sprachen durch.In Attache wird nun
Print
ein Array mit gedruckten Zeichenfolgen zurückgegeben, und bei Zeichenfolgen und ganzen Zahlen (dh0
) ist keine Subtraktion möglich . Es wird also ein Tippfehler ausgelöst. In MathematicaPrint
kehrt zurückNull
, und Mathematica ist gut darin, davon abzuziehen0
. Aber wir werfen diese Null manuell mitThrow
und geben einennocatch
Fehler aus.quelle
Python (2) und QB64 , 82 Bytes
Um die Python-Version zu testen, können Sie sie online testen ! Um die QB64-Version zu testen, müssen Sie QB64 herunterladen.
Was Python sieht
Die erste Zeile ist nur der bloße Ausdruck
1
(No-Op), gefolgt von einem Kommentar.In der zweiten Zeile wird
s
die Zeichenfolge festgelegt"QB64"
, in der dritten Zeile wird sie jedoch sofort in geändert"Python"
. Die vierte Zeile gibt die Nachricht entsprechend aus.Die fünfte Zeile ist ein weiterer bloßer Ausdruck, der jedoch
NameError
aufgrund des undefinierten Namens ein auslöstCLS
.Was QB64 sieht
Die nummerierte erste Zeile
1#
definiert jede Variable, deren Name mitS
(ohne Berücksichtigung der Groß- / Kleinschreibung) beginnt, als Zeichenfolgenvariable. Das heißt, wir müssen nicht verwendens$
, was in Python ein Syntaxfehler wäre.Die zweite Zeile enthält
s
die Zeichenfolge"QB64"
.'
Beginnt ein Kommentar in QB64, so dass die dritte Zeile nichts tut. Die vierte Zeile gibt die Nachricht entsprechend aus.Die fünfte Zeile versucht
CLS
mit einem Argument von (clear screen)-1
. Da aberCLS
nur akzeptiert Argumente0
,1
oder2
, dies erzeugt den FehlerIllegal function call
. Der Fehler erstellt ein Dialogfeld, in dem der Benutzer gefragt wird, ob er die Ausführung fortsetzen oder den Vorgang abbrechen möchte. Technisch bedeutet dies, dass der Fehler nicht schwerwiegend ist (in diesem Fall können Sie "Ausführung fortsetzen" auswählen und das Programm wird einfach ohne weitere Probleme beendet). Das OP hat jedoch explizit Sprachen zugelassen, die nach einem Fehler fortgesetzt werden können. Daher sollte das Verhalten von QB64 in Ordnung sein.quelle
Perl 5 und JavaScript (Node.js) , 96 Byte
Hierbei wird die Tatsache ausgenutzt , dass
(...)
es sich um eine Liste in Perl handelt,printf
die das linke Element von verwendet, und die Tatsache, dass es der Kommaoperator in JavaScript ist, der das rechte Argument zurückgibt.Verursacht einen Fehler bei der Division durch Null in Perl und einen ReferenceError, da dieser
$
nicht in JavaScript definiert ist.Probieren Sie das Perl online!
Probieren Sie das JavaScript online!
quelle
Oktave und MATLAB, 67 Bytes
Probieren Sie es online!
Hinweise: Der Code geht davon aus, dass MATLAB ohne Toolbox installiert ist (oder dass die Namen aller installierten Toolboxen nicht mit den Buchstaben A bis M beginnen).
Wie es funktioniert:
Der Code erhält die Versionsdaten für den Interpreter und die verwendeten Toolboxen
ver
. Beim Ausführen wirdv(1).Name
der Name des ersten Produkts extrahiert. Dies wird entweder zurückgegebenOctave
oderMATLAB
vorausgesetzt, dass der obige Hinweis zutrifft.Das Programm zeigt dann die erforderliche Zeichenfolge mit
Octave
oderMATLAB
nach Bedarf an.Endlich machen wir es
v(--pi)
.In Octave
--
ist dies der Operator vor der Dekrementierung. Als solches versucht es vorzudekrementieren, was fehlschlägt, da die Variablepi
nicht existiert (pi
ist tatsächlich eine Funktion, keine Variable).In MATLAB ist der Operator vor der Dekrementierung nicht vorhanden. Als solche wird die Aussage so interpretiert,
v(-(-pi))
dass sie gleich gerecht istv(pi)
. Istpi
jedoch keine Ganzzahl und kann daher nicht zum Indizieren desv
Arrays verwendet werden, was zu einem Fehler führt.quelle
C ++ 14 (gcc) / C ++ 17 (gcc) ,
107105BytesProbieren Sie es online! (C ++ 14)
Probieren Sie es online! (C ++ 17)
Es wird davon ausgegangen, dass (zusätzlich zu ) im globalen Namespace
<cstdio>
deklariert wird und dass der grundlegende Ausführungszeichensatz ASCII-Werte verwendet, die beide mit g ++ unter Linux wahr sind.printf
std
Der grundlegende Haken dabei ist, dass C ++ 17 Trigraphen aus der Sprache entfernt hat.
"??/0"
Enthält in C ++ 14 ein Trigraph und ist äquivalent zu"\0"
. Ist*"??/0"
also Null undc
wird auf Null gesetzt. Die Zahl 4 wird als Argument an übergebenprintf
, dann verursacht die Division durchc
undefiniertes Verhalten. Unter Linux passiert dies, bevor*p
das Bild angezeigt wird und das Programm eineSIGFPE
.In C ++ 17
"??/0"
ist es genau die Zeichenfolge mit der Länge 4, die es zu sein scheint. So*"??/0"
ist'?'
oder 63 undc
wird auf 3 gesetzt. Die Zahl 7 wird als Argument an übergebenprintf
, und dieses Mal ist die Division durchc
gültig. Dap
es sich um ein Namespace-Mitglied handelt, wird es beim Start des Programms mit Null initialisiert und hat einen Nullzeigerwert. Dies*p
ist ein undefiniertes Verhalten. Unter Linux erhält das Programm ein, da das Programm versucht, den Speicher an der Adresse Null zu ändernSIGSEGV
.quelle
main
's Rückgabetyp kann weggelassen werden, also -3 Bytes.Perl 5 und Perl 6 , 55 Bytes
Probieren Sie Perl 5 online aus! (Illegale Division durch Null)
Probieren Sie Perl 6 online aus! (Keine solche Methode)
Präfix
~
ist die Stringifizierung in Perl 6 und im obigen Programm im Wesentlichen ein No-Op. In Perl 5 ist es nicht bitweise und konvertiert -1 in 0..
ist Methodenaufrufsyntax in Perl 6 und Verkettung in Perl 5.quelle
C (gcc) / Stax , 109 Bytes
Probieren Sie es online! (C (gcc))
Probieren Sie es online! (Stax) oder Run und debuggen Sie es! (Stax)
Segfault in C. Ungültige Operation in Stax. Ich liebe es, wie alles, was kein Kommentar ist, in Stax verwendet wird.
C
So sieht es C. Die erste Zeile ist no-op. In der zweiten Zeile wird die Nachricht mit
printf
und dann aufgrund von mit ausgegeben=0
.Stax
Das Stax-Programm wird immer dann beendet, wenn versucht wird, einen Blick auf einen leeren Stapel zu werfen. Das macht es ein bisschen schwierig und wir müssen einen Stapel vorbereiten, der nicht leer ist.
AA=~1;
tut dies, während es eine gültige Aussage in C bleibt.Was wirklich nützlich ist
~
, ist das , es bereitet einen nicht leeren Eingabestapel vor, so dass das;
ausgeführt werden kann, ohne das Programm zu verlassen. Die beiden1
s auf dem Hauptstapel werden jedoch auch später verwendet.Die zweite Zeile beginnt mit einem Tabulator und einem Zeilenkommentar in Stax.
Die ungültige Operation versucht, eine
/
Operation für eine Zeichenfolge als TOS (2. Operand) und die Zahl1
von (*) als 1. Operand auszuführen, was ungültig ist.Wenn die beiden Operanden vertauscht werden, ist dies eine gültige Operation in Stax.
quelle
Jelly und M , 39 Bytes
Probieren Sie es in Jelly!
Probieren Sie es in M!
Beide Sprachen gelten umgekehrt
İ
,0
wasinf
für Jelly undzoo
für M ergibt . Ich weiß nicht, warumzoo
Unendlichkeit in M bedeutet. Frag Dennis.Der wichtige Unterschied ist, dass Jellys Unendlichkeit sich selbst gleicht, während Ms Unendlichkeit es nicht ist. So
=`
ergibt die "ist gleich sich selbst" Monade1
in Jelly und0
in M. Von hier:Jellys Fehler ist
EOFError: EOF when reading a line
.M's Fehler ist
TypeError: '>' not supported between instances of 'str' and 'int'
.quelle
Foo / CJam ,
5150 BytesDies wird mit einem Fehler beim Teilen durch Null in Foo und einem Fehler
NumberFormatException
in CJam beendet.An CJam:
/
versucht die Zeichenkette zu teilenThis program errors out in
in der TeilzeichenfolgeFoo
. Da die Zeichenfolge keine Teilzeichenfolge enthält, wird ein Singleton-Array mit der ursprünglichen Zeichenfolge erstellt, die auf genau die gleiche Weise angezeigt wird.'x
ist ein Zeichenwörtlich fürx
, das wie eine Zeichenfolge mit gedruckt wird. Auf diese Weise können wir Daten für CJam übertragen, die von Foo ignoriert werden (ich habe nicht herausgefunden, wie man eine Schleife erstellt, die in Foo nicht ausgeführt wird).Li
versucht, die leere Zeichenfolge in eine Ganzzahl umzuwandeln, was fehlschlägt. Alles vom Stapel wird gedruckt.Zu Foo:
/
versucht, die aktuelle Zelle durch das oberste Stapelelement zu teilen (was implizit ist)0
). Aus irgendeinem Grund sind Divide-by-0-Fehler in Foo nicht schwerwiegend, daher wird die Nachricht nur gedruckt zu STDERR und macht weiter.'C'J'a'm
undLi
) werden ignoriert.quelle
Only Jon Skeet can divide by zero.
meta.stackexchange.com/a/9138Python und Lua ,
111110102989585 BytesFehler: Python 3:
Lua:
Deutlich zu unterscheiden.
Missbräuche mehrere Unterschiede:
<var>=<a>,<b>,...
Erstellt ein Tupel in Python, aber in Lua erstellt es eine Argumentliste, aus der nur das erste Mitglied entnommen wird.#
Startet einen Kommentar in Python, ist aber der Längenoperator in Lua. Zusätzliche Requisiten für Python, damit Tupel mit einem Komma enden können.[[...]]
ist die mehrzeilige Zeichenfolgensyntax von Lua, was bedeutet, dass sie nicht einmal die Druckfunktion von Python sieht. Dies ist notwendig, weil Lua die..
Zeichenfolge verkettet und nicht+
.a
einer undefinierten Variablen; Lua danachz=#print(x.."Lua :P")
. Nur#print(x.."Lua :P")
für Lua zu verwenden, funktioniert nicht, da dies einen Fehler auslöst, bevor der Code überhaupt ausgeführt wird.Bearbeitungen:
"".join
in Python, -1 Byte zu verwendenx
eine Zeichenfolge in beiden Sprachen und platzieren SiePython
in der Druckfunktion -8 Byte in einem Zeichenfolgenliteral#[[]]
ist kürzer als#""
und--[[]]
, -4 Bytes#1
als Tabellenschlüssel erforderlich , -3 Byteprint(x.."Lua :P")
Anscheinend die Länge des Rückgabewerts von Werken nehmen; -1 Bytequelle
Java und C #
242235Missbrauch der unterschiedlichen Escape-Behandlung zwischen Java und C # (Unicode-Escape-Zeichen werden vor dem Parsen von Code in Java und nicht in C # analysiert) als eine Art Präprozessor, das ist die Aufgabe der
\u0027
Magie.Edit: Ab 8 Bytes dank eines Zeigers von @KevinCruijssen
Edit: Regel derp behoben
quelle
String
in ändernvar
(Java 10 unterstützt dies). (Oder 5 durch ÄndernString s="...";
vonString s="...",x;
und EntfernenString
vorx=
Java 9 oder früher).AutoHotKey / C #,
155133128122 BytesSyntaxhervorhebung erklärt es besser als ich könnte:
C # RuntimeBinderException: "Nicht delegierter Typ kann nicht aufgerufen werden"
AutoHotkey- Fehler: Eine Ausnahme wurde ausgelöst.
Bearbeitungen:
quelle
i+=i[-1]
. System.IndexOutOfRangeException: 'Index lag außerhalb der Arraygrenzen.'dynamic
anstattvar
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException auszulösen: 'Kann keinen nicht delegierten Typ aufrufen' miti()
.PHP 7+ / JavaScript,
9089 BytesDies verwendet zwei Sprachen mit sehr ähnlicher Syntax, sodass dieser Code in beiden Sprachen geschrieben werden kann.
Die Sprachentrennung erfolgt durch eine Eigenschaft, die in JavaScript nicht vorhanden ist: PHP betrachtet
[]
(leeres Array) als einen falschen Wert, während es in JavaScript wahr ist (weil es ein Objekt ist und Objekte immer wahr sind, auchnew Boolean(false)
).Ausführung:
Konzentriert sich auf die folgenden Code:
([]?console.log($X,'JavaScript'):printf($X,PHP))();
.Die String-Zuweisung funktioniert in beiden Sprachen gleich.
Dieser Code verwendet den "ternären Operator" ( Javascript , PHP ), der in beiden Sprachen zumeist gleich funktioniert.
Javascript
Javascript wird das ausführen
console.log($X,'JavaScript')
Stück , das zurückkehrtundefined
.Später, wenn Sie versuchen, auszuführen
(...)()
, erhalten Sie eineUncaught TypeError: (intermediate value)(intermediate value)(intermediate value) is not a function
(in Google Chrome).PHP
PHP wird das ausführen
printf($X,PHP)
Stück .In PHP gibt die
printf
Funktion die Länge der Ausgabe zurück .PHP hat eine interessante Funktionalität: Es kann Funktionen ausführen, deren Name in einer Variablen gespeichert ist (oder seit PHP7 als Ergebnis eines Ausdrucks), wodurch ein Syntaxfehler verhindert wird.
PHP wird dann versuchen, die Funktion auszuführen, deren Name das Ergebnis des Ausdrucks ist
[]? ... :printf($X,PHP)
(welcher die Zahl ist33
).Diese interessante Funktion hat jedoch eine Einschränkung: Sie akzeptiert nur Zeichenfolgen (duh!).
Dies führt zu einem
Fatal error: Function name must be a string
, weil33
einint
.Vielen Dank an Shieru Asakoto , der mir 1 Byte gespart hat!
quelle
[]
ist kürzer als'0'
und wird auch in JS und PHP unterschiedlich ausgewertet, also vielleicht ein -1 Byte hier?[]
Bedürfnisse statt verwendet werden'0'
,'\0'
,'\0'=="0"
und verwendet , dass[]
sowohl vor als auch. Aber danke, dass Sie diese Frage entdeckt haben.Perl 5 und C, 95 Bytes
//;
ist im Grunde ein NOP in Perl und ein Kommentar in C.Das C-Programm ist also effektiv:
Welches druckt die erforderliche Zeichenfolge, dann versucht es auszuführen
puts(32)
. Dies ist ein technisch undefiniertes Verhalten in C, aber es verursacht einen Segmentierungsfehler in TIO und jedem System, auf das ich Zugriff habe.Das Perl-Programm behandelt das gesamte C-Programm als Zeichenfolge, verwendet den regulären Ausdruck,
/T.*n /
um eine Übereinstimmung zu erzielen ,This program errors out in
und druckt dann dieses undperl :P
.die
führt dazu, dass das Programm mit dem Fehler abstürztDied at script_name line 2
.Wenn dir das nicht als Fehler gefällt,
1/0
ist die Länge gleich und stürzt mit einemIllegal division by zero
Fehler ab. Ich mag einfachdie
mehr;)Probieren Sie es online! (C)
Probieren Sie es online! (Perl)
quelle
VBScript, JScript, 72 Bytes
VBScript gibt "Microsoft VBScript-Laufzeitfehler: Typenkonflikt: 'y'" aus.
JScript gibt "Microsoft JScript-Laufzeitfehler: 'y' ist undefiniert" aus.
quelle
JavaScript & Python 3,
10591 BytesFehler von
NameError: name 'console' is not defined
in Python 3Probieren Sie es online!
... und von
TypeError: console.log(...) is not a function
in JavaScript.Probieren Sie es online!
quelle
Java (JDK) / JavaScript (Node.js), 154 Byte
Probieren Sie es online! (Java)
Probieren Sie es online! (JavaScript)
Ausgabe in Java:
Ausgabe in JavaScript (nach stderr):
Dies nutzt die schwache Typisierung (
1=='1'
) von JavaScript , um die Sprache zu erkennen, und dieselben Schlüsselwörter in Java und JavaScript (var
,class
) sowie ähnliche Fehlerkonstruktoren (new Error()
), um den Polyglott zu erstellen.quelle
PowerShell v6 und PowerShell v2, 73 Byte
Probieren Sie es online!
Dadurch wird ein Parsing-Fehler in Version 2 ausgelöst, da
-shl
dieser in Version 3 eingeführt wurde. v3 + ist dann in der Lage, den Wert korrekt zu verschieben, bevor versucht wird, ihn durch 0 zu teilen, und löst dabei bequemerweise einen Division-durch-Null-Fehler aus. Beide Versionen haben die Hashmap $ PSVersionTable, die dasPSVersion
Feld enthältquelle
C (gcc) unter Linux / C (gcc) unter Mac (160)
Ungetestet für Mac; Im Grunde hat John Cook (in seinem Blog ) darauf hingewiesen, dass POSIX kein Gamma definiert. Linux verwendet das Protokoll der Gamma-Funktion (log (gamma (1)) gibt 0 zurück, was eine Gleitkomma-Ausnahme auslöst); OSX verwendet die "echte" Gammafunktion (offiziell als "tgamma per POSIX" bezeichnet). dies gibt 1 zurück, was dann die Abbruchanweisung trifft; Ich habe versucht, einen anderen Gleitkomma-Fehler auszulösen (z. B. sqrt (-1)), aber ich habe vergessen, wie man einen Fehler auslöst, anstatt einfach Null zurückzugeben.
quelle
Perl, Bash (78 Bytes)
Ausgabe in Perl:
Ausgabe in Bash:
(Beachten Sie, dass Bash den
line 4
Fehler tatsächlich anzeigt , obwohl Zeile 3 nicht mit einem Zeilenvorschub endet ...)quelle
C und ECPP 112 Bytes
Hangup
.Illegal instruction
.quelle
C (gcc) und Haskell , 135 Bytes
Probieren Sie es online (С)! Versuchen Sie es online (Haskell)!
Das Ergebnis wird durch Verweben der Kommentare erzielt, wobei die C-Version im Wesentlichen wie folgt lautet:
(Fehler wird durch Schreiben vor dem Beginn der Zeichenfolge erreicht).
Die Haskell-Version reduziert sich dagegen auf Folgendes:
(Das Scheitern wird dadurch erreicht, dass eine leere Liste ausgefüllt wird.)
quelle