N'est-ce pas gênant de trouver un morceau de code sans savoir dans quelle langue il a été écrit? Ce défi tente de résoudre un peu ce problème.
Défi
Vous devrez écrire un programme qui, lorsqu'il sera exécuté dans deux langues différentes, générera la chaîne:
This program wasn't written in <language program compiled/interpreted in>, it was built for <other language the program can be run in>!
Dans la sortie, les noms de langue doivent avoir une capitalisation officielle. par exemple: CJam, C ++
Aucun programme ne doit prendre aucune entrée de l'utilisateur.
Lorsqu'il est exécuté dans les deux langues, le résultat doit être stdout ou équivalent.
Il ne devrait y avoir aucune sortie à stderr dans les deux programmes.
Vous pouvez utiliser des commentaires dans les deux langues.
Deux versions différentes d'une même langue sont considérées comme des langues différentes.
Si cela est fait, le programme doit indiquer le numéro de version majeure et, s'il est exécuté sur deux versions mineures différentes, doit également indiquer la version mineure.
Vous ne devez pas utiliser de fonctions de version prédéfinies (cela inclut les variables déjà évaluées au moment de l'exécution).
Exemple de sortie:
Perl et Ruby:
Perl:
This program wasn't written in Perl, it was built for Ruby!
Rubis:
This program wasn't written in Ruby, it was built for Perl!
Python et C:
Python:
This program wasn't written in Python, it was built for C!
C:
This program wasn't written in C, it was built for Python!
Python 2 et Python 3:
Python 2:
This program wasn't written in Python 2, it was built for Python 3!
Python 3:
This program wasn't written in Python 3, it was built for Python 2!
Python 2.4 et Python 2.7:
Python 2.4:
This program wasn't written in Python 2.4, it was built for Python 2.7!
Python 2.7:
This program wasn't written in Python 2.7, it was built for Python 2.4!
C'est le code golf, donc le code le plus court en octets l'emporte.
argv[0]
?Réponses:
Foo / CJam, 70 octets
Comme beaucoup l'ont découvert, dans Foo, il affiche simplement tout ce qui est entre guillemets et ignore la plupart des autres caractères ou fait quelque chose qui n'affecte pas le rendu dans la plupart des cas. En bref,
\@
ne fait rien et les chaînes sont toutes imprimées telles quelles.Dans CJam, échangez
\
les deux éléments supérieurs et@
déplace le troisième élément vers le haut, ce qui permet de disposer les chaînes dans le bon ordre. Et à la fin du programme, tout ce qui reste dans la pile est automatiquement imprimé.la source
R"This program wasn't written in ""Fission"", it was built for ""CJam"\@'!O
"This program wasn't written in Clip, it was built for CJam!"3{4-_36+e\}/
pour Clip / CJam.C89 / C99,
171152136114111107105 octetsMerci à @Hurkyls, @Qwertiys, @ jimmy23013 et @MD XF pour vos conseils.
version golfée:
version non golfée:
Petite description:
Les versions précédentes de C99 avaient juste le commentaire multiligne comme ceci:
avec C99, le commentaire sur une seule ligne a été introduit. comme ça:
donc si vous compilez une ligne comme ceci:
le code relatif à la compilation du compilateur c99 serait:
alors que le code pertinent pour un compilateur c89 serait:
(car le premier
/
ne fait pas partie d'un commentaire et doit donc être traité comme un opérateur)la source
//**/
. En C89, c'est l'opérateur de division suivi d'un commentaire vide. En C99,//
commence un commentaire sur une seule ligne, le reste de la ligne est donc vide. Donc, en C89, il devient(90-(-4.5/-4.5))
89, alors qu'en C99 il devient(90-(-4.5-4.5))
99.188-c
place dec==99?89:99
.JavaScript / Ruby, 170 octets
Peut-être que 2.0, ne semble pas fonctionner dans au moins 2.1.5 ... Edit: Mises à jour selon les conseils de @Jordan espérons que cela fonctionne dans un peu plus de versions maintenant!
Abuse de l’
~
opérateur dans lequel Ruby traitera=~
comme une correspondance regex renvoyant la position de la première correspondance dans la chaîne (0
), mais JavaScript la traitera telle=
~/1/
quelle-1
(depuis/1/
est convertieNaN
pour les opérations numériques, qui a une0
valeur).la source
NoMethodError: undefined method `log' for :log:Symbol
eval
est donc renvoyé:log
. Je pense que vous pourriez résoudre ce problème en mettant;c
aprèsend
. Le=~
/= ~
astuce est grande, bien!$><<s
remplaçantputs s
et en utilisant des guillemets afin que vous puissiez supprimer la barre oblique inverséewasn\'t
.\'
guillemets doubles, et cela$><<
signifie que je peux appliquer le correctif que vous avez mentionné et conserver le même nombre d'octets!Python 2 / Python 3, 92
Utilise la vérification de version "standard" de Python (division entier vs division flottante).
la source
Pêche / > <>
233217 octetsLa pêche est une langue basée sur un pêcheur se promener attraper du poisson. Pour faire un programme dans cette langue, il faut d’abord définir un quai sur lequel il se promène. Le quai fournit uniquement un flux de contrôle à un programme. Le quai dans ce programme est:
Chaque fois que la
C
commande est trouvée, le pêcheur jette sa ligne pour attraper une instruction. Les instructions+
et-
diminuent et augmentent la longueur de sa ligne respectivement.v
change sa direction de projection vers le bas. Les poissons qu'il attrape dans ce programme sont:> <> est une langue basée sur un poisson se déplaçant dans l'eau. La
v
commande commence le poisson en descendant, où il est ensuite reflété à droite avec la\
commande. Tout ce qui est entre guillemets est placé dans la pile. Une fois que la ficelle est poussée sur la pile, le poisson se retourne de l’autre côté où il est réfléchi vers le bas\
. Il imprime ensuite le contenu de la pile avec:la source
23 / Malbolge, 5688 octets
Notez que le programme nécessite un saut de ligne de fin. Aucune ligne ne contient des espaces de fin, donc copier / coller devrait fonctionner correctement.
Vérification
Pour tester le code Malbolge dans cet interpréteur en ligne , collez-le dans la zone du code Malbolge et cliquez sur Load/Reset, puis sur Execute.
Pour tester le code 23 dans cet interpréteur en ligne , collez-le dans la zone Source , appuyez sur Enterpour insérer le saut de ligne final, tapez
23
dans la zone Console (pour passer de la notation 23.dezsy par défaut à la détection automatique), puis cliquez sur Run Interpreter!.la source
Lua / C -
182164 octetsTirant profit de la fonctionnalité dans laquelle Lua traite un point d’empreinte sur la première ligne comme un commentaire autorisant les shebangs Unix. Sinon, les commentaires de l'autre langue sont enveloppés dans ses propres commentaires.
Pour réduire les octets, je me base sur un comportement implicite qui émet uniquement des avertissements dans GCC et Clang: déclaration implicite d’int pour la définition principale et implicite de printf.
la source
//
commentaire dans la partie C? Enregistre 2 octets.JavaScript / Haskell,
158 octets147 octetsIdée générale: insérez la syntaxe des commentaires de l'un dans l'autre.
En une ligne:
Qu'est-ce que cela ressemble à Haskell:
Qu'est-ce que cela ressemble à JavaScript:
la source
alert
est golfier.Brainfuck / Foo, 769 octets
Une réponse extrêmement complexe et complexe ... ou pas.
la source
,
dans le texte à la fin. Je crois que cela va à l’encontre des règles d’affectation.,
met la cellule à 0, pour EOFC / Python, 238 caractères
Cela n'imprime pas à 100% exactement ce qui est demandé, mais assez proche.
Un redémarrage de ma carte de Saint Valentin .
la source
def
et:
aprèsdef main()
, et vous n'ouvrez pas réellement un corps de fonction pour main. As-tu réellement essayé de compiler ta réponse en C?#define def main(){0?
est manquante#define return
me fait pleurer un peu ...C / C ++, 136
Nouvelles lignes ajoutées pour le formatage. Essayez-le en C ou C ++ .
la source
struct{}s;z=2*sizeof s
Befunge / > <> ,
141138134133130 octets3 octets enregistrés grâce à @Cole .
Pour être exact, j'utilise Befunge-98.
En utilisant les faits qui:
\
est un miroir dans> <> et échange dans Befunge'string'
est une chaîne dans> <> et'c
est un caractère dans Befungela source
?!;>ol
PHP / MySQL, 147 octets
la source
SELECT"This program wasn't written in MySQL, it was built for PHP!";
Python 3 / > <> ,
177173172167 octetsMerci à @mathmandan pour avoir rasé 5 octets!
C'était une expérience et une expérience aussi. Toutes les suggestions de golf sont les bienvenues, car c'est assez long. J'ai fait de mon mieux pour réutiliser du texte, mais c'était assez difficile.
Techniquement, ce programme devrait sortir avec Python 3 (et je pourrais changer cela si je ne répondais pas aux spécifications - mais dans l'exemple, la sortie Python / C
Python
était listée).Essayez-le sur un interprète en ligne> <> et un Python 3 (l' interpréteur > <> nécessite que vous saisissiez le code manuellement).
Résultats
dans> <> et
en Python.
Explication (Python)
Pour le côté Python, c'est assez simple. Voici le code qui nous tient à coeur (essentiellement le code sans commentaires, qui sont désignés par un code
#
Python). Notez qu'en Python,\
un caractère d'échappement est utilisé lorsqu'il est utilisé dans des chaînes. Il est donc\"
évalué"
dans la chaîne.Ce qui nous importe le plus ici, ce sont les opérations effectuées sur la variable
aa
:La déclaration d'impression est donc évaluée à
Explication (> <>)
Nous arrivons maintenant à la partie la plus difficile. Encore une fois, voici le code avec les bits inutiles supprimés.
Ligne 1:
La pile en ce moment (si imprimée):
\This program wasn't written in
Ligne 2:
Notez que la ligne 2 commence par le en
/
raison de la position du pointeur de la ligne 1 et se déplace de droite à gauche.La pile en ce moment:
><> ni nettirw t'nsaw margorp sihT
Ligne 3:
Comme la ligne précédente, celle-ci commence à la
\
, qui est l'endroit où la ligne 2 envoie le pointeur. Notez que parce que le pointeur entoure la ligne quand il atteint la première,a
je vais écrire mon explication dans l’ordre dans lequel le pointeur va (et donc ce qui est exécuté)La pile en ce moment (
x
est le caractère formé par l'ajout de "r" et d'un espace. - ce n'est pas le caractère réel, juste un espace réservé de moi):xof tliub saw ti ,><> ni nettirw t'nsaw margorp sihT
Ligne 4:
Le pointeur continue simplement vers le bas et cette ligne ne mérite aucune explication supplémentaire.
Ligne 5:
À partir
/
et à gauche.La pile en ce moment (la sortie inversée):
!nohtyP rof tliub saw ti ,><> ni nettirw t'nsaw margorp sihT
Et ça devrait être ça pour l'explication. Faites-moi savoir s'il y a une incohérence entre l'explication / le code ou si j'ai fait quelque chose de mal. J'ai encore joué au code alors que j'étais en train d'écrire l'explication afin de pouvoir mélanger des morceaux d'ancien et de nouveau code.
la source
aa[:-2][::-1]
paraa[-3::-1]
. Dans ce cas, bien sûr, cela peut interférer avec la mise en forme> <>, mais peut-être que vous devriez en tenir compte si vous ne l'avez pas déjà fait. En particulier, je suis presque sûr que vous avez besoin d'un espace en-dessousv
de la ligne précédente, mais il semblerait que celaprint(aa[-3::-1]+"Pytho"
conviendrait aux 24 caractères cia=", it was built for "+
- dessous . Vous pouvez ensuite insérer un espace suivi de+"n"+a)
. Je ne sais pas si cela casserait quelque chose d'autre, mais si cela fonctionne, cela économisera quelques octets.print aa[-3::-1]+"Pytho" +"n"+a
. Une autre question cependant: dans la version> <>, qu’arrive-t-il de celui1
qui a été initialement placé sur la pile?Fichier .BAT par lots / Fichier .CMD par lots,
194185 octetsEdit: Sauvegardé 9 octets, et corrigé un manquant
!
grâce à DLoscOui, il y a des différences entre les fichiers BAT et CMD. Référence. Essentiellement, CMD définit le
ERRORLEVEL
sur uneSET
commande, contrairement à BAT, ce qui signifie que leERRORLEVEL
jeu défini par lamd
commande malformée est effacé par laSET v=1
version dans une version mais pas par l'autre. Ce script est basé sur l'exemple fourni par "Ritchie" dans ce fil de discussion.Notez que le script raccourci ci-dessus suppose
ENABLEEXTENSIONS
être définiON
(il est par défaut sur chaque plate-forme). Le script développé ci-dessous le définit explicitement pour garantir un fonctionnement correct. Sans cela, laSET
commande pour CMD n’autorise pas toutes les extensions et (sur certains systèmes, peut-être) peut ne pas définir laERRORLEVEL
correctement.Élargi et remarqué
la source
Javascript / C,
148146143 caractèresC:
http://codepad.org/u8UimGLchttp://codepad.org/Y80M5jpchttp://codepad.org/m4DB2NddJavascript: copiez simplement le code dans la console du navigateur
la source
CJam / GolfScript,
8178 octetsVersion originale de 81 octets:
la source
PHP / Perl,
9896 octetsJe ne sais pas si c'est de la triche ou pas, car autant que je sache, le seul moyen de faire fonctionner PHP sans
<?
balise d' ouverture est quelque chose du genrephp -r $(cat codefile.php)
. Mais en supposant que ce soit légal ...//
est un commentaire PHP, mais en Perl c'est un regex (qui, dans une déclaration en soi, ne fait rien). Le reste devrait être assez explicite.Edit: Maintenant, utilisez un mot simple dans la partie Perl uniquement. Je voulais utiliser ceux-ci en premier lieu pour les deux langues, mais PHP affiche un avertissement lorsque vous le faites, contrairement à "Il ne devrait y avoir aucune sortie vers stderr".
la source
<?'>#';
est une syntaxe valide dans les deux langues.Ruby / Python, 105 caractères
la source
JavaScript 1.8 / JavaScript 1.7, 89 octets
Comme Array.prototype.reduce est nouveau dans la version 1.8
EDIT: Golfé 7 octets en initialisant directement
a
au lieu d’utiliserreverse()
EDIT:
JavaScript
peut être écrit en tant queJS
, en sauvant 8 octetsEDIT: Merci Hedi pour avoir signalé que je peux économiser 3 octets de plus si je n'utilise pas la variable
b
plusEDIT: Golfé sur 6 octets en calculant
7+a
et8-a
, oùa=1
réduire est défini (JS 1.8) eta=0
non défini (JS 1.7)EDIT: Hedi a joué 6 octets supplémentaires suggérant l’utilisation de la chaîne de template
EDIT: ETHproductions a golfé 2 octets suggérant
a=!![].reduce;
au lieu dea=[].reduce?1:0;
EDIT: no1xsyzy a lancé un octet supplémentaire suggérant d’inverser la vérification booléenne
la source
a=[].reduce?1:0;
àa=!![].reduce;
.a
de garder la valeur1
ou0
, pastrue
oufalse
SWI-Prolog 6 / SWI-Prolog 7, 156 octets
Utilise le fait que les guillemets doubles
""
sont des codes de chaîne (c'est-à-dire une liste de codes de caractères) dans les versions de SWI-Prolog antérieures à 7 et constituent un type de chaîne approprié dans la version 7.is_list("")
seront donc faux dans la version 7 et vrais dans les versions antérieures.la source
BF / SPL, 5342 octets
Je suis sûr que c'est le premier langage polyglotte de Shakespeare Programming Language sur ce site.
Ne va probablement pas gagner de prix. Fonctionne en insérant du code BF dans les titres d'acte, de scène ou de programme. Le code SPL utilise des points d'exclamation au lieu de points, sauf dans quelques cas. Les programmes ne sont pas censés prendre en entrée, aussi les virgules dans les déclarations de caractères sont "commentées" en mettant à zéro les cellules et en mettant des crochets autour des virgules. La même procédure s’applique lorsque vous masquez les crochets autour des instructions d’entrée / sortie.
Testez BF à l' adresse https://repl.it/E8Hh/23 .
Le code SPL a été testé sur le compilateur trouvé ici: https://github.com/drsam94/Spl/ .
la source
Ruby 1.8 / Ruby 1.9, 87
En Ruby 1.8,
?9
la valeur ASCII de "9" correspond à 8 modulo 49. En Ruby 1.9, il s’agit de la chaîne "9". Il%49
s’agit d’une opération de mise en forme qui ne fait rien car "9" n’a pas de chaîne de format dans il.la source
Python 2.7.9 / Python 2.7.10, 127 octets
Quelques articles ont utilisé des versions mineures, mais aucun n'a atteint un niveau inférieur ...
Essayez-le sur Ideone (Python 2.7.10) et repl.it (techniquement, Python 2.7.2, mais devrait donner le même résultat que 2.7.9).
Python 2.7.10, selon le changelog :
Ceci poussé
len(dir(types))
de 42 à 43, donnant une différence numérique que nous pouvons exploiter pour générer la sortie désirée.la source
Python / QBasic,
160142 octetsTesté avec Python 3 et QBasic 1.1 . Ne fonctionnera pas dans Python 2 sans ajouter
from __future__ import print_function
à la ligne 4.1#
est l'expression1
(no-op) suivie d'un commentaire. En QBasic, il s’agit d’un numéro de ligne (avec le suffixe de type le marquant comme unDOUBLE
). L'DEFSTR
instruction indique à QBasic que toutes les variables dont le nom commence parA
ouB
(insensible à la casse) sont des variables de chaîne. De cette façon, nous pouvons appeler nos variablesa
etb
au lieu dea$
etb$
(ce qui ne fonctionnerait pas en Python).'
commence un commentaire. En Python,''
est la chaîne vide (no-op). Ensuite, nous échangeons les noms de langue et définissons un alias pour leprint
fonction (car les mots-clés QBasic sont automatiquement mis en forme en majuscules).Si je suis autorisé à désactiver l'autoformatter (qui est une option dans QB64 , mais pas dans le QBasic d'origine), je peux le réduire à 114 octets à l' aide de Python 2 :
la source
Perl / Ruby, 129 octets
Pas d’abus d’expression régulière dans celui-ci, tirant simplement parti du fait que 0 est la vérité en Ruby pour
eval
une définition desort
(qui en faitreverse
s) etprintf
ing. Ruby n'aimait pas utiliser la liste pour les arguments, alors je devais les faire individuellement.la source
a
-il être une variable d'instance, par opposition à une variable locale?@
sur une variable en Perl indique que c'est une liste, le stockage en Perl, par exemple$a
, ne produit aucune sortie./// et Retina , 95 + 3 = 98 octets
+3 octets pour le
-s
drapeau dans la rétine.Explication pour ///
La première instruction est
supprime toutes les nouvelles lignes du reste du code, ce qui entraîne
Tout ce qui se passe
!
n'est qu'un littéral et est imprimé pour STDOUT. L'instruction suivante estMais la chaîne de recherche
?.
étant introuvable, rien ne se passe. Ensuite, le code restant est//!
est une instruction incomplète afin que le programme se termine, après avoir imprimé la chaîne correcte.Explication pour la rétine
Cela dit à Retina de remplacer
/
par//
. Mais l'entrée est vide, donc cela ne correspond à rien.Ceci remplace l'entrée par la chaîne dans la deuxième ligne.
Cela correspond à la chaîne
\/\/\/, it was built for Retina!
et la remplace parRetina, it was built for ///!
pour donner le résultat correct.la source
-s
, bien que dire ce que j'ai fait gâcherait le plaisir! : Dsed / Hexagony 251 octets
sed: Essayez-le en ligne!
Hexagony: essayez-le en ligne!
Dans sed, la chaîne correcte est imprimée si elle correspond à la chaîne vide à la fin (toujours). La deuxième ligne est un commentaire. Cela nécessite une chaîne sur STDIN, mais il peut être vide ( autorisé en fonction de ce consensus ).
Exemple:
En Hexagonie, le premier
/
redirige vers le bas à gauche, elle suit le côté gauche jusqu'au début de la partie sed, puis se termine de gauche à droite, d'une ligne, de droite à gauche, d'une ligne, etc. L'hexagone élargi ressemble à ceci:la source
;
le mod 256 actuel de la cellule prend pour déterminer une valeur d’octet (par exemple, vous pouvez imprimer un espaceP0;
quelle que soit la valeur de la cellule actuelle). Ce script CJam génère toutes les paires: cjam.tryitonline.net/…Python / Retina,
133120119117115 octetsMaintenant que j'en sais plus sur Retina et les regex, j'en ai fait un peu plus. Cela fonctionne aussi réellement maintenant.
Python imprime simplement la déclaration. Retina remplace n’importe quoi par l’instruction d’impression Python, puis supprime les
print
guillemets et autres. Ensuite, j'échangePython
etRetina
et retirez le#
.Essayez en Python | Essayez dans la rétine
la source
JavaScript / CoffeeScript,
125124 octetsDans CoffeeScript,
a==b
est compilé jusqu'àa===b
, ce qui rend la condition intermédiaire fausse. J'ai utilisé un peu de magie pour convertir la valeur booléenne en entier.Enregistré 1 octet grâce à @DomHastings!
Version 125 octets:
la source
+(b=0=='0')
au lieu de+0
!b^1
, je pense que vous pouvez utiliser~b
undefinedScript
.~1 == -2
. Mais(b=0=='0')+0
peut être écrit comme+(b=0=='0')
. Oub=+(0=='0')
. Cela devrait couper 1 octet.