Les polyglottes sont des programmes valables simultanément dans plusieurs langages de programmation. La plupart de ces polyglottes sont écrites de telle manière que certaines constructions d'un langage sont interprétées comme des commentaires d'un autre langage (par exemple #define
en C étant interprété comme un commentaire dans plusieurs langages de script).
Je suis curieux de voir s'il est possible de faire un polyglotte non trivial qui ne contient aucun commentaire, mais qui change également immédiatement lorsque vous supprimez tout caractère non blanc, je vous mets donc au défi de proposer un tel programme.
Les règles concrètes sont les suivantes:
- (Production). Votre programme doit produire une sortie sur la console sous chacune de vos langues. Autrement dit, votre programme n'est pas autorisé à quitter simplement sans imprimer quoi que ce soit.
- (Variance). Pour détendre la définition polyglotte standard, la sortie du programme peut varier selon les langues.
- (Les erreurs). Votre programme ne doit produire aucune erreur (au sens large) sous aucune de vos langues. Pour la plupart des langues, cela est défini comme renvoyant un code de sortie non nul du compilateur et / ou de l'interpréteur.
- (Restriction). La suppression de tout caractère non blanc de votre code devrait amener votre programme à modifier son comportement sous chacune de vos langues. Le programme peut "changer" en devenant invalide pour cette langue ou en modifiant la sortie produite.
- Il s'agit d'un défi de code . Winner est le programme valable dans la plupart des langages de programmation. Les égalités seront rompues en faveur d'une durée de programme plus courte.
La règle de restriction ne s'applique pas à la suppression de plusieurs caractères. Autrement dit, c'est bien si la suppression simultanée de plusieurs caractères n'entraîne aucun changement pour l'une de vos langues.
Notez que la règle de restriction implique que vous ne pouvez pas utiliser l'espace blanc comme l'une de vos langues, car la suppression de tout caractère non espace blanc ne changera pas le comportement du programme espace blanc.
Voici un exemple simple d'un programme qui remplit toutes les restrictions ci-dessus, pour les langages Python 2 et Python 3:
print("Hello World!")
Si vous supprimez un caractère print
, les deux langues lanceront un NameError
; la suppression de tout crochet ou guillemet générera un SyntaxError
, et la suppression de tout caractère de chaîne modifiera la sortie dans les deux langues. (Notez que print("hello", "world")
c'est un programme plus subtil, mais toujours valide selon les règles ci-dessus).
Cet exemple est un peu boiteux car Python 2 et Python 3 sont très similaires, donc je n'accepterai aucune autre solution qui n'utilise que des versions différentes du même langage (en particulier Python 2 et Python 3).
print("Hello World!")
est également un code Ruby valideRéponses:
Bash + GolfScript + CJam
Production
Frapper:
GolfScript:
CJam:
Il y a un
\x7f
en fin de sortie de CJam.la source
Bash + Befunge
imprime «bonjour» en befunge.
la source
bc, GolfScript, Homespring, hein, Octave, Scilab (0 octets)
Garanti pour se conformer à la règle 4. Pas un gagnant, mais ferait bien au bris d'égalité.
Production
avant JC
GolfScript
Homespring
hein
Octave
Scilab
la source
What?\n?
d'ailleurs.make: *** No targets. Stop.
GolfScript + PHP + CJam + Mathematica + bc + Pyth + /// + TI-Basic + R + Octave + Matlab + Scilab + Topline numérique +? Fueue + hein?
Dans Golscript, PHP, CJam, Mathematica, bc, Pyth, /// et TI-Basic, il affiche
10
.En R, il sort
[1] 10
En octave, il sort
ans = 10
Dans Matlab et Scilab, il sort
ans = 10
.Dans Numeric Topline, il sort
0
.Si je comprends bien Fueue, il génère une nouvelle ligne, puis agit comme un programme cat.
En hein?, Il sort
la source
72
en10
, il devrait s'imprimer0
en Numérique Topline .C ++ et Javascript
L'idée est:
C ++: http://codepad.org/SK2wbIDL
Javascript: il suffit de copier le code sur la console du navigateur
Et un ensemble de correctifs pour le satisfaire
Du côté Javascript:
Changer
int
,main
ouputs
plantera avec la lecture de la variable non déclarée. Maisbool
etHi from C++!
peut être en toute sécurité des changements. Corrigeons-le:Si les chaînes sont égales, il vérifie l'existence de
bool
, sinon il se bloque avec non déclarénope
.Maintenant, il y a 2 points-virgules de fin qui peuvent être supprimés. Le premier est fixe - supprimez simplement la nouvelle ligne avant
int
:Le second est avant
}
, j'ai donc besoin d'une restriction, valide dans les deux langages et ne nécessitant pas de point-virgule à la fin en C ++ ou forçant un point-virgule en js. Bien:Il est impossible d'omettre le point-virgule en js selon les
while
besoins du corps.Donc le programme en ce moment est:
Du côté C ++:
Il y a 2 problèmes:
eval
peut avoir n'importe quel nom et tout le code js peut être changé.Je vais essayer de les réparer dans quelques jours.
la source
CJam + Golfscript
D'accord, c'est un peu ennuyeux, mais c'est un début.
Imprime "0" dans les deux langues. La suppression des
1
provoque une erreur, supprimant les,
impressions "1" à la place.La même chose peut être faite avec
1)
ou1(
. Il existe de nombreuses alternatives.(Oui, je sais que ce n'est pas du golf de code)
la source
C et C ++
C et C ++ sont des langages différents qui sont presque compatibles les uns avec les autres - contrairement à ce que vous pourriez entendre C ++ n'est pas un surensemble de C. Regardez http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B pour quelques différences . L'exemple ci-dessus n'est pas idiomatique en C ++ mais il fonctionne et produit la même sortie en C et C ++.
la source
0
pour C.0
peut être supprimé.gcc -ansi
sur x86 (ou de nombreuses autres architectures: ce qui se passe, c'est que la valeur de retour deputs
finit par être dans le registre où le runtime lit la valeur pour revenir de lamain
fonction).JavaScipt, Lua, R et Python 3 - 24 octets
Peut fonctionner sur d'autres langues, je testerai cette dernière.
JavaScript a été testé sur la console de Firefox et les autres langues ici , ici et ici
la source
Perl + Ruby + Python
Je pense qu'en PHP, cela aurait besoin d'un point-virgule si vous utilisez
-R
.la source
Bash + sh + zsh + ksh, 4 octets:
Vraiment simple et satisfait toutes les règles:
la source
Bash + sh + zsh + ksh + Windows Batch, 4 octets:
Vraiment simple et satisfait toutes les règles:
Génère une nouvelle ligne qui ne varie pas dans chacune des langues (mais Windows Batch, qui génère
ECHO is on
, dans la langue que vous utilisez), ne génère pas d'erreur, sauf lorsqu'une lettre est supprimée ou modifiée.la source