Polyglotte restreinte


20

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 #defineen 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:

  1. (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.
  2. (Variance). Pour détendre la définition polyglotte standard, la sortie du programme peut varier selon les langues.
  3. (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.
  4. (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.
  5. 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).


@ IngoBürk: La règle vous empêche d'écrire un polyglotte fonctionnel qui implique des espaces blancs , à moins que votre autre langue soit également uniquement des espaces blancs.
nneonneo

1
FWIW votre exemple, print("Hello World!")est également un code Ruby valide
Cristian Lupascu

C'est un peu ennuyeux que les réponses simples (comme la mienne) à un [polyglotte] aient tendance à avoir autant de langues.
Justin

5
Pour éviter les innombrables variantes de langues ou les langues avec une syntaxe similaire, il serait plus intéressant d'exiger que deux langues ne comptent comme différentes que si le programme produit une sortie différente.
Gilles 'SO- arrête d'être méchant'

Réponses:


13

Bash + GolfScript + CJam

"echo" []
{ cat<&3;} \
3<""<("echo" 'p'~)

Production

Frapper:

[]
p~

GolfScript:

"echo"
echo{ cat<&3;}0

CJam:

echo{ cat<&3;}-1echop

Il y a un \x7fen fin de sortie de CJam.


... attendez, comment ça marche dans les trois langues, sans être redondant?
nneonneo

@nneonneo Il imprime simplement tout le code inutilisé dans d'autres langues.
jimmy23013

8

Bash + Befunge

"echo" $,$,"ol":,,,@

imprime «bonjour» en befunge.


1
Je peux attester que chaque personnage (sauf l'espace) fait quelque chose dans Befunge. Mais je ne peux pas le faire pour le Bash. C'est impressionnant.
Justin

7

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

Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.

GolfScript


Homespring

In Homespring, the null program is not a quine.

hein

?

Octave

GNU Octave, version 3.6.4
Copyright (C) 2013 John W. Eaton and others.
This is free software; see the source code for copying conditions.
There is ABSOLUTELY NO WARRANTY; not even for MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  For details, type `warranty'.

Octave was configured for "x86_64-redhat-linux-gnu".

Additional information about Octave is available at http://www.octave.org.

Please contribute if you find this software useful.
For more information, visit http://www.octave.org/get-involved.html

Read http://www.octave.org/bugs.html to learn how to submit bug reports.

For information about changes from previous versions, type `news'.

Scilab

Startup execution:
  loading initial environment

-->

2
Je sais qu'il y a un esolang qui empêche spécifiquement les quines de longueur 0 en faisant ce genre de chose (oh attendez, c'est Homespring ). Je crois hein? sort quelque chose.
Justin

Merci! Malheureusement, je ne peux pas convaincre hein? pour fonctionner sur Linux ...
Dennis

1
Tout ce dont j'avais besoin était un paquet supplémentaire pour mono. Votre programme s'imprime What?\n?d'ailleurs.
Dennis

1
make: *** No targets. Stop.
Fonctionne

1
@ user23013: D'accord. Dans ce cas, ce n'est pas une entrée valide, car le code de sortie de make est 2.
Dennis

6

GolfScript + PHP + CJam + Mathematica + bc + Pyth + /// + TI-Basic + R + Octave + Matlab + Scilab + Topline numérique +? Fueue + hein?

10

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

What?
?

1
Fonctionne également dans CJam
août

5
Je ne pense pas que les interprètes interactifs devraient compter.
nneonneo

2
Cela fonctionne bien dans beaucoup de langues, mais ne fournit pas de sortie dans autant de langues ...
Justin

1
Ceci est également valable en HTML , bc , Matlab et Scilab . Si vous changez 72en 10, il devrait s'imprimer 0en Numérique Topline .
Dennis

Le HTML n'est pas un langage de programmation selon la méta discussion car il n'a aucun moyen de simple arithmétique ou de boucles.
Ingo Bürk

3

Il semble que cette réponse ne soit pas entièrement correcte.
Je l'ai réparé en partie, et je vais améliorer l'autre partie en quelques jours.

C ++ et Javascript

L'idée est:

void eval(bool="main=function(){alert('Hi from Javascript!')};puts=function(){};int=0");
int
main()
{
puts("Hi from C++!");
}

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

(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.

Du côté Javascript:

Changer int, mainou putsplantera avec la lecture de la variable non déclarée. Mais boolet Hi from C++!peut être en toute sécurité des changements. Corrigeons-le:

puts=function(){}
puts=function(s){s=='Hi from C++!'?bool:nope}

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:

void eval(bool="main=function(){alert('Hi from Javascript!')};puts=function(){};int=0");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:

while(0);

Il est impossible d'omettre le point-virgule en js selon les whilebesoins du corps.

Donc le programme en ce moment est:

void eval(bool="main=function(){alert('Hi from Javascript!')};puts=function(s){s=='Hi from C++!'?bool:nope};int=0");int
main()
{
puts("Hi from C++!");while(0);
}

Du côté C ++:

Il y a 2 problèmes: evalpeut avoir n'importe quel nom et tout le code js peut être changé.

Je vais essayer de les réparer dans quelques jours.


2

CJam + Golfscript

D'accord, c'est un peu ennuyeux, mais c'est un début.

1,

Imprime "0" dans les deux langues. La suppression des 1provoque une erreur, supprimant les ,impressions "1" à la place.

La même chose peut être faite avec 1)ou 1(. Il existe de nombreuses alternatives.

(Oui, je sais que ce n'est pas du golf de code)


2

C et C ++

#include <stdio.h>
int main() { puts("Hello!"); return 0; }

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 ++.


Vous pouvez retirer le 0pour C.
Dennis


@Gilles: Si la fonction principale exécute un retour qui ne spécifie aucune valeur, le statut de terminaison renvoyé à l'environnement hôte n'est pas défini. ( Le C89 Draft - 2.1.2.2 Environnement hébergé ) Cela ne rend pas le programme invalide ni ne modifie sa sortie, donc pour les besoins de cette question, le 0peut être supprimé.
Dennis

@Dennis Je pense qu'un code de sortie non spécifié compte comme rendant le programme invalide selon les règles de cette question. Si ce n'est pas le cas, créez une implémentation C89 où ce programme retourne un code de sortie différent de zéro, comme gcc -ansisur x86 (ou de nombreuses autres architectures: ce qui se passe, c'est que la valeur de retour de putsfinit par être dans le registre où le runtime lit la valeur pour revenir de la mainfonction).
Gilles 'SO- arrête d'être méchant'

@ Gilles: Mon interprétation de la règle 3 est que le compilateur doit retourner 0, pas le programme.
Dennis

2

JavaScipt, Lua, R et Python 3 - 24 octets

Peut fonctionner sur d'autres langues, je testerai cette dernière.

alert=print;alert(1)

JavaScript a été testé sur la console de Firefox et les autres langues ici , ici et ici


1

Perl + Ruby + Python

Je pense qu'en PHP, cela aurait besoin d'un point-virgule si vous utilisez -R.

print "Hello World!"

Cela fonctionne également en Python.
Août

1
Fonctionne également avec Lua.
Trebuchette

1

Bash + sh + zsh + ksh, 4 octets:

echo

Vraiment simple et satisfait toutes les règles:

  1. Produit une nouvelle ligne dans chacune des langues.
  2. Sortie actuellement ne pas varier en aucune façon entre les langues.
  3. Ne produit aucune erreur dans aucune des langues ...
  4. ... sauf lorsque l'un des caractères est supprimé / modifié.

0

Bash + sh + zsh + ksh + Windows Batch, 4 octets:

echo

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.


1
Votre réponse semble être presque identique à celle-ci: codegolf.stackexchange.com/a/100654/65326
Uriel
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.