Inspiré par je ne suis pas la langue que vous recherchez!
Défi
Choisissez deux langages de programmation différents et écrivez un programme qui imprime la ligne suivante sur stdout (ou équivalent):
This program errors out in <the current language> :P
puis génère un type d'erreur différent dans chacune des deux langues.
Règles
Certaines règles sont tirées du défi d'origine.
- Dans la sortie, les noms de langue doivent suivre exactement:
- Le nom répertorié sur TIO , excluant éventuellement le numéro de version et / ou le nom de l'implémentation (par exemple, si vous utilisez
JavaScript (Node.js)
comme l'une de vos langues, vous pouvez utiliserJavaScript
pour votre nom de langue, mais pasJS
ouJavascript
.) - Le nom complet sur le site officiel (ou repo GitHub) si la langue de votre choix n'est pas disponible sur TIO.
- Le nom répertorié sur TIO , excluant éventuellement le numéro de version et / ou le nom de l'implémentation (par exemple, si vous utilisez
- Aucun des deux programmes ne doit accepter aucune entrée de l'utilisateur.
- Vous pouvez utiliser des commentaires dans l'une ou l'autre langue.
- Deux versions différentes de la même langue comptent comme langues différentes.
- Si cela est fait, le programme doit afficher le numéro de version principale, et s'il s'exécute sur deux versions mineures différentes, doit également signaler la version mineure.
- Vous ne devez pas utiliser de fonctions de version prédéfinies (cela inclut les variables qui ont déjà été évaluées au moment de l'exécution).
- Deux drapeaux de ligne de commande différents dans le même langage comptent également comme des langages différents selon ce méta-consensus , tant que les drapeaux n'incluent pas de fragments de code (comme
-Dblahblah...
en C).- Si cela est fait, le programme devrait également afficher le drapeau utilisé.
- Deux erreurs sont considérées comme différentes à moins que les deux erreurs ne soient générées par la même sémantique (comme «division par zéro», «défaut de segmentation» ou «index hors plage»).
- Si le runtime d'une langue ne se termine pas après une erreur, mais signale l'erreur d'une manière ou d'une autre à l'utilisateur, c'est une erreur valide.
- Si une langue ne discrimine pas les messages d'erreur mais possède une liste connue des raisons qui provoquent l'erreur, vous devez spécifier la raison, pas le message d'erreur.
Un exemple est><>
, qui n'a qu'un seul message d'erreursomething smells fishy...
, mais la page wiki d'esolangs a une liste de raisons d'erreur.
- L'erreur de syntaxe n'est pas autorisée sauf si elle est générée par appel
eval()
ou similaire. - Lancer quelque chose manuellement (via
throw
(JS),raise
(Python),die
(Perl) ou similaire) est autorisé, mais tous sont considérés comme un seul type d'erreur. - L'erreur par commande invalide en 2D ou golflangs est également autorisée (et traitée comme une sorte d'erreur).
Exemples
Python et Ruby
- Python:
This program errors out in Python :P
à stdout, puis identifiant non défini - Ruby:
This program errors out in Ruby :P
stdout, puis index hors limites
C89 et C99
- C89:
This program errors out in C 89 :P
à stdout, puis division par zéro - C99:
This program errors out in C 99 :P
à stdout, puis défaut de segmentation
Notez que le numéro de version doit toujours être séparé du nom de la langue par un espace.
Python 2.7.9 et Python 2.7.10
- Python 2.7.9:
This program errors out in Python 2.7.9 :P
vers stdout, puis erreur de syntaxe sur eval - Python 2.7.10:
This program errors out in Python 2.7.10 :P
à stdout, puis erreur de clé sur dict
Perl et Perl -n
- Perl:
This program errors out in Perl :P
vers stdout, puis format d'heure invalide - Perl
-n
:This program errors out in Perl -n :P
pour stdout, puis essayez d'ouvrir un fichier qui n'existe pas
Condition gagnante
Il s'agit de code-golf , donc le code le plus court en octets l'emporte. Mais vous êtes toujours encouragé à poster une réponse amusante ou intéressante même si elle n'est pas très courte.
This program errors out in ...
contenir des tabulations / espaces mixtes au lieu de seulement des espaces?Réponses:
Python 2 / Python 3 , 60 octets
NameError: name 'a' is not defined
unsupported operand type(s) for *: 'NoneType' and 'int'
Python 2:
/
est une division entière, 3/2 a 1; int (3/2 * 2) vaut 2.print((...)*1)
,*1
signifie ici répéter la chaîne une fois.Python 3:
(print(...))*1
.print
retourne la fonctionNone
; La multiplication ne fonctionne pasNone x int
, elle signale donc "l'opérande non pris en charge".la source
C et C ++,
114101 octets-13 octets grâce à l4m2 !
Erreur de segmentation en C ++, exception virgule flottante en C.
auto
est par défautint
en C(int).5
devient donc0
, donc essayer de diviser par elle est essentiellement une division par zéro.En C ++
1/d
est 2, l'ajouter à l'adresse ded
et essayer de changer la valeur de cette adresse renvoie une erreur de segmentation.Essayez-le en C ++!
Essayez-le en C!
la source
"++"+n
, oùn
est0
pour C ++ et2
pour Cd?"++":""
9 caractères,"++"+4*d
8 caractères. Mais obtient C / C ++ en arrière. Soupir.int main(){auto d=.5;printf("This program errors out in C%s :P",d?"++":"");2[&d]+=1/d;}
(105) mais je ne sais pas pourquoiint
Peut également être omisL"⬫"+!d
place ded?"++":""
JavaScript + HTML / HTML + JavaScript, 160 octets
Je ne sais pas si cela compte deux langues, mais c'est drôle.
la source
<!-- ... -->
marqueurs de commentaire sur une seule ligne (je sais que c'est dans la spécification pour des raisons de compatibilité descendante)Java 8 et C99, 172 octets
Basé sur ma réponse pour le défi «abc» et «cba» .
Essayez-le en Java 8 - résultant en ArrayIndexOutOfBoundsException: 1 .
Essayez-le en C - entraînant une exception en virgule flottante: la division par zéro n'est pas définie .
Explication:
Comme vous pouvez le voir dans le code surligné Java ci-dessus, la première ligne est un commentaire dû à
//
, et le code C est un commentaire dû à/* ... */
, résultant en:Il imprime donc sur STDOUT, puis essaie d'accéder au deuxième argument de programme (quand aucun n'est fourni), il produit donc l' exception ArrayIndexOutOfBoundsException .
Je ne sais pas comment activer correctement la surbrillance C, car cela
lang-c
entraîne la même surbrillance que Java .. Mais//\
commentera la ligne suivante, qui est le code Java, résultant en:Il imprime donc STDOUT, puis donne une division par zéro erreur.
la source
//
été ajouté à C avec C99.C99
.a[1]
au lieu dea[0]
?1
depuis le début. On aurait pu avoir0
,9
etc. ainsi. Si j'ai quelque chose à modifier à propos de ce message, je le changerai0
également en même temps.Java 8 et espace blanc ,
439431428408 octetsEssayez-le en Java 8 - résultant en ArrayIndexOutOfBoundsException: 0 .
Essayez-le dans l'espace blanc - entraînant une erreur utilisateur (impossible de faire Infix Plus) .
Explication:
Java 8:
Il imprime donc sur STDOUT, puis essaie d'accéder au premier argument de programme (quand aucun n'est fourni), il produit donc l' exception ArrayIndexOutOfBoundsException .
Espace:
Lettres
S
(espace),T
(tabulation) etN
(nouvelle ligne) ajoutées uniquement en surbrillance.[..._some_action]
ajouté à titre d'explication uniquement.Essayez cette version surlignée.
Les espaces blancs sont un langage basé sur la pile qui ignore tout sauf les espaces, les tabulations et les nouvelles lignes. Voici le même programme en pseudo-code:
Il générera une erreur dès qu'il aura fini d'imprimer toutes les valeurs et que la pile sera vide lorsqu'il essaiera d' ajouter Add (
TSSS
), ce qui nécessite deux éléments sur la pile.J'ai généré la constante
111
avec ce programme Java , que j'ai également utilisé pour les précédents défis liés à l'ASCII que j'ai faits dans Whitespace. De plus, j'ai utilisé quelques copies pour les espaces pour économiser des octets.Une chose importante à noter est l'astuce que j'ai utilisée pour placer le programme Java dans la réponse Whitespace. Permettez-moi de commencer par expliquer comment un nombre est poussé dans l'espace blanc:
S
au début: activer la manipulation de la pile;S
: Appuyez sur ce qui suit comme nombre;S
ouT
: positif ou négatif respectivement;Certains
S
et / ouT
, suivis d'unN
: Numéro binaire, oùT=1
etS=0
.Voici quelques exemples:
SSSTN
;SSTTN
;SSSTTSTTTTN
.SSSSN
,SSTSN
,SSSN
,SSTN
,SSSSSSSSSSSSN
, etc. (Lorsque vous utilisezSSSN
(ouSSTN
), nous ne devons pas spécifier la partie binaire, car il est implicitement 0 après que nous avons fait part de son signe.)Il
SSSN
suffit donc de pousser la valeur0
(utilisée pour la lettreo
dans ce cas). Mais, pour placer le programme Java dans ce programme Whitespace golfé, j'avais besoin d'un espace supplémentaire, donc les deux premierso
s sont poussés avecSSSN
, mais le troisième est poussé avecSSSSN
, nous avons donc suffisamment d'espace pour la phrase du programme Java.la source
CBM BASIC et code machine 6502 (C64),
142144octetsJ'ai dû ajouter 2 octets après avoir réalisé qu'une erreur de syntaxe n'était pas autorisée ....
Hexdump du
.prg
fichier:La vue CBM BASIC , telle que répertoriée dans l'éditeur du C64:
Attention : Il est impossible de saisir correctement ce programme dans l'éditeur BASIC. N'essayez même pas de modifier ce programme dans l'éditeur BASIC, il plantera. C'est quand même un programme BASIC exécutable;)
Vue du code machine 6502 :
Démo en ligne , tapez
run
pour exécuter en BASIC,sys 2049
pour exécuter en tant que code machine,list
pour l'afficher interprété comme code BASIC.L'exécution en tant que BASIC produit un
division by zero error in 1
, l'exécution en tant que code machine acan't continue error
Explication:
Les deux premiers octets d'un
.prg
fichier sont l'adresse de chargement en petit endian, c'est$0801
(décimal2049
) ici, qui est l'adresse de début des programmes BASIC sur le C64.run
démarre ce programme dans l'interpréteur BASIC, tandis quesys 2049
est la commande pour exécuter un programme de code machine à l'adresse2049
.Comme vous pouvez le voir, la première ligne de la vue BASIC est un commentaire (
rem
) contenant "garbage" et une partie de la chaîne de sortie requise. Il s'agit du programme de code machine et de certains octets de remplissage. Vous y voyez des commandes BASIC "aléatoires" car les programmes CBM-BASIC contiennent les commandes "tokenisées" en tant que valeurs à un octet, et certaines de ces valeurs sont les mêmes que les opcodes utilisés dans le code machine. Le code machine réutilise la chaîne présente dans la deuxième ligne de code pour sa sortie.Les deux premiers octets d'une ligne d'un programme de base sont un pointeur vers la ligne suivante, ici
$0850
. Ceci est soigneusement choisi car50 08
une instruction de branche 6502 saute également sur les 8 octets suivants lorsque l'indicateur de débordement n'est pas défini - elle est utilisée pour sauter quelque part au milieu de cette ligne de "commentaire" lorsqu'elle est exécutée en tant que code machine. C'est50
l'opcode utilisé ici, donc la deuxième ligne doit commencer0850
pour que l'astuce fonctionne. C'est pourquoi vous voyez une séquence de 520
octets (caractères d'espace) à remplir. Le code machine passe activement à la routine de gestion des erreurs ROM pour donner une erreur "ne peut pas continuer".Le code BASIC est assez simple; comme deuxième argument pour "imprimer", deux variables non initialisées (ayant une valeur de
0
dans CBM BASIC) sont divisées, déclenchant l'erreur "division par zéro".la source
> <> et Foo , 42 octets
Essayez-le dans> <>!
Essayez-le dans Foo!
Foo imprime tout
"
, comme cela est bien documenté, et essaie de diviser par zéro à la fin. Il ignore le'><>'
.><>
pousse le "Foo" dans la pile, mais le fait immédiatement apparaître en utilisantp
. Une fois qu'il a tout imprimé dans la pile,#o<
il se ferme lorsque la pile est vide avec le seul message d'erreur qu'il connaît,something smells fishy...
la source
><>
contient une liste de raisons d'erreur, donc je pense que vous devriez en spécifier une, nonsomething smells fishy...
.p
pour popFoo
est très intelligent!C et Python,
126116 octets-10 octets grâce à @Bubbler!
En Python, print () est un None, donc essayer d'obtenir son négatif n'a pas de sens, donc Python lance une erreur.
En C, printf () renvoie un entier, donc le diviser par zéro donne une exception à virgule flottante.
Essayez-le en C!
Essayez-le en Python!
la source
-print(...)
pour élever unTypeError
en Python, puis vous êtes libre de faire une erreur de virgule flottante (division par zéro) en C. Combiné avec des sauts de ligne redondants, voici 116 octets ( Python , C ).Attache + Wolfram Language (Mathematica) , 82 octets
Essayez Attache en ligne! Essayez Mathematica en ligne!
Cela dépend de la signification de l'opérateur
=
dans les deux langues. Dans Attache, il compare pour l'égalité, mais dans Mathematica, il effectue l'affectation des variables.:=
fait l'affectation des variables dans les deux langues.Maintenant, dans Attache,
Print
retourne un tableau de chaînes imprimées, et la soustraction n'est pas possible avec des chaînes et des entiers (à savoir,0
). Ainsi, une erreur de type est levée. Dans Mathematica,Print
renvoieNull
, et Mathematica soustrait très bien0
de cela. Mais, nous lançons manuellement ce null avecThrow
, donnant unenocatch
erreur.la source
Python (2) et QB64 , 82 octets
Pour tester la version Python, vous pouvez L' essayer en ligne! Pour tester la version QB64, vous devrez télécharger QB64.
Ce que Python voit
La première ligne est juste l'expression nue
1
(un no-op) suivie d'un commentaire.La deuxième ligne définit
s
la chaîne"QB64"
, mais la troisième ligne la remplace immédiatement par"Python"
. La quatrième ligne imprime le message en conséquence.La cinquième ligne est une autre expression nue, mais elle soulève un en
NameError
raison du nom non définiCLS
.Ce que voit le QB64
La première ligne, numérotée
1#
, définit chaque variable dont le nom commence parS
(insensible à la casse) en tant que variable chaîne. Cela signifie que nous n'avons pas à utilisers$
, ce qui serait une erreur de syntaxe en Python.La deuxième ligne définit
s
la chaîne"QB64"
.'
démarre un commentaire dans QB64, donc la troisième ligne ne fait rien. La quatrième ligne imprime le message en conséquence.La cinquième ligne essaie de
CLS
(effacer l'écran) avec un argument de-1
. Mais depuisCLS
accepte que les arguments de0
,1
ou2
, ce produit l'erreurIllegal function call
. L'erreur crée une boîte de dialogue demandant à l'utilisateur s'il souhaite continuer l'exécution ou abandonner. Techniquement, cela signifie que l'erreur n'est pas fatale (dans ce cas, vous pouvez choisir "continuer l'exécution" et le programme se termine simplement sans autres problèmes); mais l'OP a explicitement autorisé les langues qui peuvent continuer après une erreur, donc le comportement de QB64 devrait être correct.la source
Perl 5 et JavaScript (Node.js) , 96 octets
Cela utilise le fait que
(...)
c'est une liste en Perl quiprintf
utilisera l'élément le plus à gauche de et le fait que c'est l'opérateur virgule en JavaScript, qui renverra l'argument le plus à droite.Provoque une division par zéro d'erreur en Perl et une ReferenceError car
$
n'est pas définie en JavaScript.Essayez le Perl en ligne!
Essayez le JavaScript en ligne!
la source
Octave et MATLAB, 67 octets
Essayez-le en ligne!
Remarques: Le code suppose que MATLAB est installé sans boîte à outils (ou que les noms des boîtes à outils installées ne commencent pas par les lettres A à M).
Comment ça marche:
Le code obtient les données de version pour l'interpréteur et les boîtes à outils à l'aide
ver
. L'exécutionv(1).Name
extrait le nom du premier produit, cela renverra soitOctave
ouMATLAB
supposant que la note ci-dessus est vraie.Le programme affichera alors la chaîne requise, complétée par
Octave
ouMATLAB
selon les besoins.Enfin nous faisons
v(--pi)
.Dans Octave,
--
est l'opérateur de pré-décrémentation. En tant que tel, il tente de pré-décrémenter ce qui échoue car la variablepi
n'existe pas (pi
est en fait une fonction, pas une variable).Dans MATLAB, l'opérateur de pré-décrémentation n'existe pas. En tant que telle, la déclaration est interprétée comme
v(-(-pi))
étant égale à justev(pi)
. Cependant,pi
n'est pas un entier, il ne peut donc pas être utilisé pour indexer dans lev
tableau, ce qui donne une erreur.la source
C ++ 14 (gcc) / C ++ 17 (gcc) ,
107105octetsEssayez-le en ligne! (C ++ 14)
Essayez-le en ligne! (C ++ 17)
Suppose que
<cstdio>
déclareprintf
dans l'espace de noms global (en plus destd
) et que le jeu de caractères d'exécution de base utilise des valeurs ASCII, qui sont toutes les deux vraies en utilisant g ++ sur Linux.Le piège de base ici est que C ++ 17 a éliminé les trigraphes du langage.
En C ++ 14,
"??/0"
contient un trigraphe et est équivalent à"\0"
. Il en*"??/0"
va de même pour zéro etc
est réglé sur zéro. Le nombre 4 est passé en argument àprintf
, puis la division parc
provoque un comportement indéfini. Sous Linux, cela se produit avant d'*p
entrer dans l'image, et le programme obtient unSIGFPE
.En C ++ 17,
"??/0"
correspond exactement à la chaîne de longueur 4 qu'il semble être. Il en*"??/0"
est de même pour'?'
63 etc
est défini sur 3. Le nombre 7 est passé en argument àprintf
, et cette fois la division parc
est valide. Étant donné qu'ilp
est membre d'un espace de noms, il est initialisé à zéro au début du programme et possède une valeur de pointeur nulle, tout*p
comme le comportement non défini. Sous Linux, parce que le programme tente de modifier la mémoire à l'adresse zéro, le programme obtient unSIGSEGV
.la source
main
Le type de retour de peut être omis, donc -3 octets.Perl 5 et Perl 6 , 55 octets
Essayez Perl 5 en ligne! (Division illégale par zéro)
Essayez Perl 6 en ligne! (Pas une telle méthode)
Le préfixe
~
est la stringification en Perl 6 et essentiellement un no-op dans le programme ci-dessus. En Perl 5, il n'est pas au niveau du bit, convertissant -1 en 0..
est la syntaxe d'appel de méthode en Perl 6 et la concaténation en Perl 5.la source
C (gcc) / Stax , 109 octets
Essayez-le en ligne! (C (gcc))
Essayez-le en ligne! (Stax) ou Exécuter et déboguer! (Stax)
Segfault dans C. Opération non valide dans Stax. J'adore la façon dont tout ce qui n'est pas un commentaire est réellement utilisé dans Stax.
C
C'est ainsi que C le voit. La première ligne est sans opération. La deuxième ligne imprime le message avec
printf
puis segfaults en raison de la=0
.Stax
Le programme Stax se termine chaque fois qu'il essaie de sauter ou de jeter un œil à partir d'une pile vide. Cela rend les choses un peu délicates et nous devons préparer une pile qui n'est pas vide.
AA=~1;
fait cela tout en restant une déclaration valide en C.Ce qui est vraiment utile est le
~
, il prépare une pile d'entrée non vide afin que le;
puisse être exécuté sans quitter le programme. Cependant, les deux1
s de la pile principale sont également utilisés ultérieurement.La deuxième ligne commence par un onglet et commence un commentaire de ligne dans Stax.
L'opération non valide tente d'effectuer l'
/
opération pour une chaîne comme TOS (2e opérande) et le nombre1
de (*) en tant que 1er opérande, ce qui n'est pas valide.Si les deux opérandes sont échangés, ce serait une opération valide dans Stax.
la source
Gelée et M , 39 octets
Essayez-le dans Jelly!
Essayez-le en M!
Les deux langues s'appliquent à l'inverse
İ
de0
ce qui donneinf
Jelly etzoo
M. Je ne sais pas pourquoizoo
représente l'infini chez M. Ask Dennis.La différence importante est que l'infini de Jelly est égal à lui-même tandis que l'infini de M ne l'est pas. Ainsi la monade "est égale à elle-même"
=`
donne1
en gelée et0
en M. D'ici:L'erreur de Jelly est
EOFError: EOF when reading a line
.L'erreur de M est
TypeError: '>' not supported between instances of 'str' and 'int'
.la source
Foo / CJam ,
5150 octetsCela se termine avec une erreur de division par zéro dans Foo et une
NumberFormatException
dans CJam.À CJam:
/
essaie de diviser la chaîneThis program errors out in
sur la sous-chaîneFoo
. Étant donné que la chaîne ne contient pas la sous-chaîne, cela donne un tableau singleton contenant la chaîne d'origine, qui s'affiche exactement de la même manière.'x
est un littéral de caractère pourx
, qui est imprimé de la même manière qu'une chaîne à un caractère. De cette façon, nous pouvons pousser des données pour CJam qui sont ignorées par Foo (je n'ai pas compris comment faire pour qu'une boucle ne s'exécute pas dans Foo).Li
tente de transtyper la chaîne vide en un entier, ce qui échoue. Tout de la pile est imprimé.À Foo:
/
essaie de diviser la cellule actuelle par l'élément de pile supérieur (qui est implicite0
). Pour une raison quelconque, les erreurs de division par 0 ne sont pas fatales dans Foo, donc cela imprime simplement le message à STDERR et continue.'C'J'a'm
etLi
) sont ignorés.la source
Only Jon Skeet can divide by zero.
meta.stackexchange.com/a/9138Python et Lua ,
111110102989585 octetsErreurs: Python 3:
Lua:
Clairement distinct.
Abuse de multiples différences:
<var>=<a>,<b>,...
crée un tuple en Python, mais dans Lua, il crée une liste d'arguments, à partir de laquelle seul le premier membre est pris.#
démarre un commentaire en Python, mais est l'opérateur de longueur en Lua. Accessoires supplémentaires pour Python pour permettre aux tuples de se terminer par une virgule.[[...]]
est la syntaxe de chaîne multiligne de Lua, ce qui signifie qu'elle ne voit même pas la fonction d'impression de Python; cela est nécessaire car Lua utilise..
la concaténation de chaînes et non+
.a
, une variable indéfinie; Lua aprèsz=#print(x.."Lua :P")
. Utiliser juste#print(x.."Lua :P")
pour Lua ne fonctionne pas, car cela soulève une erreur avant même que le code ne soit exécuté.Modifications:
"".join
en Python, -1 octetx
une chaîne dans les deux langues et placezPython
dans un littéral de chaîne dans la fonction d'impression, -8 octets#[[]]
est plus courte que#""
et--[[]]
, -4 octets#1
comme clé de table, -3 octetsprint(x.."Lua :P")
œuvres, apparemment; -1 octetla source
Java et C #
242235Abuser de la gestion des différents échappements entre java et C # (les échappements unicode sont analysés avant l'analyse du code en java et non en c #) comme une sorte de préprocesseur, c'est le travail du
\u0027
magie, le reste sont des "commentaires à bascule"Edit: Golfé de 8 octets grâce à un pointeur de @KevinCruijssen
Edit: règle derp fixe
la source
String
envar
(Java 10 le supporte). (Ou 5 en changeantString s="...";
pourString s="...",x;
et supprimerString
en face dex=
Java 9 ou avant).AutoHotKey / C #,
155133128122 octetsLa mise en évidence de la syntaxe l'explique mieux que moi:
C # RuntimeBinderException: 'Impossible d'appeler un type non délégué'
Erreur AutoHotkey : une exception a été levée.
Modifications:
la source
i+=i[-1]
. System.IndexOutOfRangeException: 'L'index était en dehors des limites du tableau.'dynamic
place devar
et à lever Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'Cannot invoke a non-delegate type' withi()
.PHP 7+ / JavaScript,
9089 octetsCelui-ci utilise 2 langues avec une syntaxe très similaire, permettant d'écrire ce code sur les deux langues.
La séparation du langage se fait par une propriété non présente en JavaScript: PHP considère
[]
(tableau vide) comme une valeur fausse alors qu'il est véridique en JavaScript (car c'est un objet et les objets sont toujours véridiques, mêmenew Boolean(false)
).Exécution:
Se concentrera sur le morceau de code suivant:
([]?console.log($X,'JavaScript'):printf($X,PHP))();
.L'attribution de chaîne fonctionne de la même manière dans les deux langues.
Ce code utilise "l'opérateur ternaire" ( Javascript , PHP ), qui fonctionne principalement de la même manière dans les deux langues.
Javascript
Javascript exécutera la
console.log($X,'JavaScript')
pièce, qui revientundefined
.Plus tard, lorsque vous essayez d'exécuter
(...)()
, vous obtenez unUncaught TypeError: (intermediate value)(intermediate value)(intermediate value) is not a function
(dans Google Chrome).PHP
PHP exécutera le
printf($X,PHP)
pièce.En PHP, la
printf
fonction renvoie la longueur de la sortie .PHP a une fonctionnalité intéressante: il peut exécuter des fonctions dont le nom est stocké dans une variable (ou, depuis PHP7, comme résultat d'une expression), ce qui évite une erreur de syntaxe.
PHP tentera alors d'exécuter la fonction dont le nom est le résultat de l'expression
[]? ... :printf($X,PHP)
(qui est le nombre33
).Mais cette fonctionnalité intéressante a une mise en garde: accepte uniquement les chaînes (duh!).
Cela provoque un
Fatal error: Function name must be a string
, car33
est unint
.Merci à Shieru Asakoto de m'avoir sauvé 1 octet!
la source
[]
est plus court que'0'
et également évalué différemment en JS et PHP, alors peut-être un -1 octet ici?[]
doit être utilisé au lieu de'0'
,'\0'
,'\0'=="0"
et utilisé que[]
aussi bien avant. Mais merci d'avoir repéré cette question.Perl 5 et C, 95 octets
//;
est fondamentalement un NOP en perl, et est un commentaire en C.Le programme C est donc effectivement:
Qui imprime la chaîne requise, puis essaie de s'exécuter
puts(32)
. Il s'agit d'un comportement techniquement indéfini en C, mais il provoque une erreur de segmentation sur TIO et tous les systèmes auxquels j'ai accès.Le programme perl traite l'ensemble du programme C comme une chaîne, utilise l'expression régulière
/T.*n /
pour correspondreThis program errors out in
, puis imprime cela etperl :P
.die
provoque le programme à planter avec l'erreurDied at script_name line 2
.Si vous n'aimez pas cela comme une erreur,
1/0
c'est la même longueur et plante avec uneIllegal division by zero
erreur. J'aime justedie
plus;)Essayez-le en ligne! (C)
Essayez-le en ligne! (Perl)
la source
VBScript, JScript, 72 octets
VBScript affichera "Erreur d'exécution Microsoft VBScript: incompatibilité de type: 'y'"
JScript affichera "Erreur d'exécution Microsoft JScript: 'y' n'est pas défini"
la source
JavaScript et Python 3,
10591 octetsErreurs par
NameError: name 'console' is not defined
en Python 3Essayez-le en ligne!
... et par
TypeError: console.log(...) is not a function
en JavaScript.Essayez-le en ligne!
la source
Java (JDK) / JavaScript (Node.js), 154 octets
Essayez-le en ligne! (Java)
Essayez-le en ligne! (JavaScript)
Sortie en Java:
Sortie en JavaScript (vers stderr):
Cela profite du faible typage de JavaScript (
1=='1'
) pour détecter le langage, et des mêmes mots clés en Java et JavaScript (var
,class
), et des constructeurs d'erreur similaires (new Error()
) pour rendre le polyglotte.la source
PowerShell v6 et PowerShell v2, 73 octets
Essayez-le en ligne!
Cela générera une erreur d'analyse sur la v2 car elle a
-shl
été introduite dans la v3. v3 + pourra alors décaler correctement la valeur avant d'essayer de la diviser par 0, générant ainsi une erreur de division par zéro. Les deux versions ont la table de hachage $ PSVersionTable qui contient lePSVersion
champla source
C (gcc) sur Linux / C (gcc) sur Mac (160)
Non testé sur Mac; en gros, John Cook a souligné (dans son blog ) que POSIX ne définit pas le gamma; Linux utilise le journal de la fonction gamma (log (gamma (1)) renverra 0, ce qui déclenchera une exception à virgule flottante); OSX utilise la "vraie" fonction gamma (qui est officiellement appelée tgamma par POSIX); cela renvoie 1 qui frappera alors l'instruction d'abandon; J'ai essayé de lui faire lancer une erreur en virgule flottante différente (par exemple sqrt (-1) mais j'oublie comment faire ce lancer une erreur vs simplement retourner zéro)
la source
Perl, Bash (78 octets)
Sortie en Perl:
Sortie en Bash:
(Notez que Bash affiche en effet l'
line 4
erreur, malgré le fait que la ligne 3 ne se termine pas par un saut de ligne ...)la source
C et ECPP, 112 octets
Hangup
.Illegal instruction
.la source
C (gcc) et Haskell , 135 octets
Essayez-le en ligne (С)! Essayez-le en ligne (Haskell)!
Le résultat est obtenu en imbriquant les commentaires, la version C étant essentiellement la suivante:
(L'échec est obtenu en écrivant avant le début de la chaîne).
La version Haskell, en revanche, se réduit à ce qui suit:
(L'échec est obtenu en prenant la queue d'une liste vide)
la source