Votre défi consiste à écrire un polyglotte qui fonctionne dans différentes versions de votre langue. Lorsqu'il est exécuté, il affichera toujours la version linguistique.
Règles
- Votre programme doit fonctionner dans au moins deux versions de votre langue.
- La sortie de votre programme ne doit contenir que le numéro de version. Pas de données superflues.
- Votre programme peut utiliser la méthode de votre choix pour déterminer le numéro de version. Cependant, la sortie doit suivre la règle 2; quelle que soit la manière dont vous déterminez le numéro de version, la sortie ne doit être que le numéro.
- Votre programme n'a besoin que de sortir la version majeure de la langue. Par exemple, dans FooBar 12.3.456789-beta, votre programme n’aurait besoin que de produire 12.
- Si votre langue place des mots ou des symboles avant ou après le numéro de version, vous n'avez pas besoin de les indiquer, mais uniquement le nombre. Par exemple, en C89, votre programme n'a besoin que d'imprimer
89
et en C ++ 0x, il ne nécessite que d'imprimer0
. - Si vous choisissez d'imprimer le nom complet ou les numéros de version mineurs, par exemple C89 par opposition à C99, il ne doit qu'imprimer le nom.
C89 build 32
est valide, alors queerror in C89 build 32: foo bar
non. - Votre programme peut ne pas utiliser les indicateurs de compilateur intégré, de macro ou personnalisé pour déterminer la version du langage.
Notation
Votre score correspondra à la longueur du code divisé par le nombre de versions dans lesquelles il fonctionne. Le score le plus bas gagne, bonne chance!
(number of languages)^3 / (byte count)
.Réponses:
Sérieusement et en fait , 3 octets, score de 1,5
Essayez-le en ligne: en fait , sérieusement
Explication:
u
etD
avoir des fonctionnalités sur les chaînes n'a été ajouté qu'à Actually (qui est Seriously v2).la source
v1
branche. Avant d'être sérieusement déconseillé, il résidait réellement dans lav2
succursale. De plus, Sérieusement a utilisé les1.x
numéros de version dans les versions , alors qu'Actuellement utilise2.x
(à la fois sur ce site et sur PyPI ).Python 3.0 et Python 2, score 6
(12 octets, 2 versions)
Essayez-le en ligne:
Python 2
Python 3
S'appuie sur le fait que Python 3+ utilise la division float par défaut, contrairement à Python 2, qui utilise la division de plancher.
la source
Your program should work in at least two versions of your language.
Cela fonctionne dans au moins deux versions 2.7 et 3.0. J'ai choisito print the full name or minor version numbers
.from __future__ import division
, problème résolu :)Java, 189 octets, 10 versions, score = 18.9
Versions prises en charge:
1.0
,1.1
,1.2
,1.3
,1.4
,1.5
,1.6
,1.7
,1.8
et9
(Pour les partitions précédentes, consultez l'historique !)
Exécuter sur Java 8
Exécuter sur Java 9 ou version ultérieure
Ungolfed
Veuillez noter que la partie de code
return v<9?"1."+v:v;
(précédemmentreturn(v<9?"1.":"")+v;
) doit être vérifiée par rapport à toute version comprise entre Java 1.0 et Java 1.3 incluse. Je ne dispose d'aucune installation Java 1.3 ou antérieure pour tester cette syntaxe.introduction
Le versioning Java a un historique particulier. Toutes les versions ont été historiquement
1.x
inclus1.0
. Mais ... à partir de Java 9 partir et le JEP223 , la version intrigante a changé d'utiliser1.x
pourx
. C'est la version connue en interne. Nous avons donc le tableau suivant (mis en place avec le Javadoc et Wikipedia ):Cette entrée de défi correspond à la colonne de version du tableau ci-dessus, qui est contenue dans la propriété système
"java.version"
.Explication
L'objectif est de vérifier à partir de quelle version une classe commence à exister, car Java déprécie le code mais ne le supprime jamais. Le code a été spécifiquement écrit en Java 1.0 pour être compatible avec toutes les versions, encore une fois, car le JDK est (principalement) compatible source à terme .
L'implémentation essaie de trouver les noms de classe les plus courts introduits par chaque version. Cependant, pour gagner des octets, il faut essayer de choisir un sous-paquet commun. Jusqu'ici, j'ai trouvé le paquet le plus efficace
java.util
parce qu'il contient plusieurs classes très courtes portant des noms très courts, réparties dans toutes les versions de Java.Maintenant, pour trouver le numéro de version actuel, les noms de classe sont triés par introduction. Ensuite, j'essaie d'instancier séquentiellement chaque classe et d'incrémenter l'index de tableau. Si la classe existe, on saute à la suivante, sinon on laissera l'exception être interceptée par le
try
bloc. Une fois cette opération effectuée, une autre exception est générée car il n’ya plus de classes dont nous devons vérifier l’existence.Dans tous les cas, le fil laissera le
try
-block avec une exception. Cette exception n'est pas interceptée, mais simplement mise en attente grâce aufinally
-block, qui annule à son tour l'exception en attente en renvoyant une valeur qui est"1."+v
oùv
est l'index utilisé auparavant. Il arrive également que cet index corresponde au numéro de version mineur de Java.Une partie importante du golf consistait à trouver le nouveau nom de classe le plus court dans le package
java.util
(ou dans un package pour enfants) pour chaque version. Voici le tableau que j'ai utilisé pour calculer ce coût.Crédits
-boxpensée -Essayer-catch!finally
truc portable .return(i<9?"1.":"")+i;
parreturn i<9?"1."+i:i;
(ceci doit être validé contre 1.0 ou au maximum 1.3 car aucune modification de la syntaxe n’est intervenue avant la version 1.4)Avec construit
Si les constructions étaient autorisées:
54 octets pour 13 versions (de 1.0 à 12), le score serait donc de 4.1538.
la source
return"...
sans espace est possible dans toutes les versions tbh.)String v(){return "1."+(e("time.Year")+e("nio.file.Path")+e("io.Console")+e("util.UUID")+e("text.Bidi")+e("util.Timer")+e("sql.Ref")+e("lang.Void"));}int e(String c){try{Class.forName("java."+c);return 1;}catch(Exception e){return 0;}}
String v(){int i=0;try{for(String[]s={"lang.Void","sql.Ref","util.Timer","net.URI","util.UUID","net.IDN","nio.file.Path","time.Year","lang.Module"};;i++)Class.forName("java."+s[i]);}catch(Exception e){}return"1."+i;}
finally{return"1."+i;}
.Python , 606 octets / 15 versions = score 40,4
-67 octets (lol) grâce à NoOneIsHere.
Les versions sont les suivantes: 0.9.1, 2 (.0), 2.2, 2.2.2, 2.5.0, 2,5.1, 3 (.0), 3.1, 3.1.3, 3.2.1, 3.3, 3.4, 3.5 aa et 3.6. .
Tout le mérite de la réponse étonnante de Sp3000 . Le retour à la ligne est nécessaire.
Whee, c'était amusant de jouer au golf. Cela devrait fonctionner (oui, j'ai installé chacune de ces versions), mais j'ai peut-être accidentellement oublié quelque chose. Si quelqu'un trouve un bug, s'il vous plaît faites le moi savoir.
la source
print'0.9.1'
sa syntaxe n'est pas valide.print
appel ... Merci de me l'avoir fait savoir!except
s parexcept:
).x=<string inside eval>
faisiez au lieu d'évaluer simplement le code manuellement?1/0
, mais ensuite j'ai réalisé. Merci!C ++ 11/14/17, score = 147/3 = 49
Pour faire la distinction entre C ++ 11 et C ++ 14/17, il utilise la modification de la valeur par défaut
const
desconstexpr
fonctions membres en C ++ 14 (en citant l'exemple de https://stackoverflow.com/questions/23980929/ que-changes-introduit-en-c14-peut-potentiellement-casser-un-programme-écrit-en-c1 ). Pour distinguer C ++ 14 de C ++ 17, il utilise le fait que C ++ 17 a désactivé les trigraphes.Ungolfed:
(Testé avec Debian gcc 7.1.0 avec
-std=c++{11,14,17}
.)la source
include
et<
dans les déclarations comprennent, par exemple#include<iostream>
.__cplusplus
macro) - puis pour distinguer le C ++ 17 du C ++ 14, je préférerais utiliser le changement de plage pour la sémantique. Peut-être créez-vous des classes minimales d'itérateurs / sentinelles de manière àboost::integer_iterator
ce que la conversion de sentinelle en itérateur ait un comportement "surprenant".return 0;
est implicite pourmain
que vous puissiez économiser 9 octets ici. Toujours selonwc -c
votre solution, utilisez 251 octets et non 252 (votre éditeur peut avoir inséré une nouvelle ligne à la fin).return *
=>return*
EcmaScript 3/5/2015/2016/2017 dans le navigateur, 59 octets / 5 versions = 11,8 points
Économisez 1 octet grâce à GOTO 0
la source
-!
plutôt que+!!
là où cela a du sens (et modifier les constantes numériques en conséquence).JavaScript (ES5 et ES6), 14 octets / 2 versions = 7
0o
les constantes octales de style sont nouvelles dans ES6; ES5 lance la chaîneNaN
sans affecter le résultat du bit XOR.la source
JavaScript (ES 2, 3 & 5 -
89),59/6 = 9,83375/7 = 10,714Vous pouvez également soumettre la solution avec plusieurs versions, même si votre version est légèrement supérieure à celle de la solution à 2 versions.
Essayez-le en ligne
Vérifie la présence de diverses méthodes dans les prototypes Array, RegExp & String, les nie en donnant un booléen et soustrait ce booléen d'une valeur initiale de 9. La multiplication des
![].map
comptes pour le fait que ES4 a été abandonné.dotAll
propriété (et l's
indicateur associé ) des expressions régulières a été introduite dans ES2018 (v9).padEnd
méthode String a été introduite dans ES2017 (v8).includes
méthode Array a été introduite dans ES2016 (v7).keys
méthode Array a été introduite dans ES2015 (v6).map
méthode Array a été introduite dans ES5.1 (v5).pop
méthode Array a été introduite dans ES3 (v3).la source
PHP 5/7, score 5.5
3V4L c'est en ligne!
PHP 5.3.9 / 5.3.11, score 10
3V4L c'est en ligne!
La version en ligne est plus longue car les anciennes versions de PHP sur le bac à sable ne disposent pas de balises courtes activées.
la source
Befunge:
1511 octets / 2 versions = 5.54 octets supprimés par @ Pietu1998
Essayez-le en ligne:
Befunge 93
Befunge 98
Utilise l’opérateur de point-virgule exclusif à Befunge 98 («passer au point-virgule suivant») pour différencier les versions. Les deux vont imprimer "9". Befunge 93 ignorera les points-virgules, soustrayera 5 de "8" (valeur laissée en haut de la pile), imprimera le "3" résultant et se terminera. Befunge 98, d’autre part, sautera, imprimera "8" et se terminera.
la source
"89",;5-;,@
pour 11 octets;
pièce.Pyth 4/5 - 6 octets / 2 versions = 3
En Pyth 5, un nombre égal d’espaces au début de la ligne n’est pas utilisé pour l’indentation, alors qu’en Pyth 4, il agit simplement comme un seul espace et empêche l’impression
5
. En Pyth 4, les points-virgules viennent juste de terminer les instructions, ce qui permet de les4
imprimer, alors qu'en Pyth 5, un espace et un point-virgule font du reste de la ligne un commentaire.la source
Python 3 et Python 2.0, 18 octets, score 18/2 = 9
Arrondi de banquier en Python 3, arrondi standard en Python 2.
Essayez-le en ligne - Python 3!
Essayez-le en ligne - Python 2!
la source
Cubiquement, 4 octets, score 4 /
Fonctionne dans toutes les versions de votre système dispose de suffisamment de mémoire pour fonctionner. Non compétitif parce que c'est nul. Valable par cette meta post .
Fondamentalement, B3 fait pivoter une rangée de la face gauche vers la face supérieure. F3 fonctionnerait aussi bien que F3 ou B₁3. Dans Cubically 3x3x3, une rangée est composée de trois cubelets par un, ce qui en fait trois
1
dans la face supérieure, ce qui lui donne une somme de%0
faces de 3 .Dans Cubically 4x4x4, les lignes sont 4x1 cubies. Met 4 1 dans la face supérieure, ce qui donne une somme de 4.
la source
Code machine x86 16/32/64 bits: 11 octets, score = 3,66
Cette fonction renvoie le mode actuel (taille d'opérande par défaut) sous forme d'entier dans AL. Appelez-le de C avec signature
uint8_t modedetect(void);
Liste code source + code machine NASM (montrant comment cela fonctionne en mode 16 bits, puisqu’il
BITS 16
demande à NASM d’assembler la mnémonique source pour le mode 16 bits.)Justification :
Le code machine x86 n'a pas officiellement de numéro de version, mais je pense que cela répond à l'intention de la question en obligeant à produire des nombres spécifiques, plutôt que de choisir ce qui est le plus pratique (cela ne prend que 7 octets, voir ci-dessous).
Le processeur x86 d'origine, Intel 8086, ne supportait que le code machine 16 bits. 80386 a introduit le code machine 32 bits (utilisable en mode protégé 32 bits, et plus tard en mode compat sous un système d'exploitation 64 bits). AMD a introduit le code machine 64 bits, utilisable en mode long. Ce sont des versions du langage machine x86 au sens où Python2 et Python3 sont des versions de langage différentes. Ils sont pour la plupart compatibles, mais avec des changements intentionnels. Vous pouvez exécuter des exécutables 32 ou 64 bits directement sous un noyau de système d'exploitation 64 bits de la même manière que vous pouvez exécuter des programmes Python2 et Python3.
Comment ça fonctionne:
Commence avec
al=64
. Déplacez-le vers la droite de 1 (mode 32 bits) ou de 2 (mode 16 bits).16/32 vs 64 bits: Les codages sur 1 octet
inc
/dec
sont des préfixes REX en 64 bits ( http://wiki.osdev.org/X86-64_Instruction_Encoding#REX_prefix ). REX.W n’affecte pas du tout certaines instructions (par exemple unjmp
oujcc
), mais dans ce cas, obtenir 16/32/64, je voulais augmenter ou diminuerecx
plutôt queeax
. Cela définit égalementREX.B
, ce qui change le registre de destination. Mais heureusement, nous pouvons y arriver, mais il n’est pas nécessaire de changer de format 64 bitsal
.Les instructions qui ne fonctionnent qu'en mode 16 bits pourraient inclure un
ret
, mais je n'ai pas trouvé cela nécessaire ou utile. (Et rendrait impossible l'intégration en tant que fragment de code, au cas où vous voudriez le faire). Cela pourrait aussi être unjmp
élément de la fonction.16 bits contre 32/64: les versions immédiates sont 16 bits au lieu de 32 bits. Le changement de mode peut changer la longueur d'une instruction. Par conséquent, les modes 32/64 bits décodent les deux octets suivants dans le cadre de l'instruction immédiate plutôt que séparément. J'ai simplifié les choses en utilisant ici une instruction de 2 octets, au lieu d'obtenir un décodage désynchronisé afin que le mode 16 bits décode à partir de limites d'instruction autres que 32/64.
Connexes: le préfixe d'opérande-taille modifie la longueur de l'immédiat (sauf s'il s'agit d'un émetteur 8 bits immédiat), comme la différence entre les modes 16 bits et 32/64 bits. Cela rend difficile le décodage de longueur d’instruction en parallèle; Les processeurs Intel ont des déconnexions LCP .
La plupart des conventions d'appel (y compris les psABI System V de x86-32 et de x86-64) autorisent des valeurs de retour étroites à laisser des ordures dans les bits élevés du registre. Ils permettent également de graver CX / ECX / RCX (et R8 pour 64 bits). IDK si cela était courant dans les conventions d’appel 16 bits, mais c’est du code golf, donc je peux toujours dire que c’est de toute façon une convention d’appel personnalisée.
Démontage 32 bits :
Démontage 64 bits ( essayez-le en ligne! ):
Connexe: mon Q & A code machine polyglotte x86-32 / x86-64 sur SO.
Une autre différence entre 16 bits et 32/64 est que les modes d'adressage sont codés différemment. Par exemple
lea eax, [rax+2]
(8D 40 02
) décode commelea ax, [bx+si+0x2]
en mode 16 bits. Ceci est évidemment difficile à utiliser pour le golf de code, en particulier depuise/rbx
ete/rsi
est préservée dans les conventions d'appel.J'ai également envisagé d'utiliser le 10 octets
mov r64, imm64
, qui est REX +mov r32,imm32
. Mais comme j'avais déjà une solution de 11 octets, ce serait au mieux égal (10 octets + 1 pourret
).Code de test pour les modes 32 et 64 bits. (Je ne l'ai pas réellement exécuté en mode 16 bits, mais le désassemblage vous indique comment il va décoder. Je n'ai pas configuré d'émulateur 16 bits.)
Ce programme Linux se termine avec exit-status =
modedetect()
, exécutez-le ainsi./a.out; echo $?
. Assemblez-le et associez-le à un binaire statique, par exemple7 octets (score = 2,33) si je peux numéroter les versions 1, 2, 3
Il n'y a pas de numéro de version officiel pour différents modes x86. J'aime juste écrire asm réponses. Je pense que cela violerait l'intention de la question si je venais d'appeler les modes 1, 2, 3, ou 1, 2, parce que le but est de vous obliger à générer un nombre incommode. Mais si cela était permis:
Qui décode en mode 32 bits en tant que
et 64 bits comme
la source
python2
et despython3
interpréteurs du même programme Python. Les nouveaux processeurs x86 incluent toujours un mode compatible avec les processeurs plus anciens (ceci est leur seule excuse pour utiliser un format de code machine aussi complexe et difficile à décoder!), Mais le mode protégé 326 de 386 et le mode long de x86-64 sont vraiment nouvelles versions du code machine x86. Le mode long a même supprimé certains opcodes, les rendant invalides.Brachylog / Brachylog v1 , 5/2 = 2,5
Essayez-le en ligne! (Brachylog)
Essayez-le en ligne! (Brachylog v1)
Explication pour Brachylog:
Explication pour Brachylog v1:
la source
2,1
dans Brachylog v2 ne construit pas la liste[2,1]
(2;1
serait), mais plutôt le nombre21
(ce qui ne change pas la façon dont vous vouliez que votre réponse fonctionne).2;1
n'aurait pas fonctionné dans Brachylog v1 comme;
moyen OU logique.C89 / C99, 25 octets, 2 versions, score = 12,5
//
Les commentaires de style ne sont pas reconnus dans C89.Version golfée:
Essayez-le en ligne: C89 , C99
la source
int v()
parmain()
, il est plus court et compilera comme un programme complet!Perl 5 et Perl 6,
23 octets19 octets, score de 9,5Perl 5
grep
first op est toujours traité comme une regex, ce qui n’est pas le cas dans Perl 6.la source
Bash, toutes les 4 versions,
727132 octets ⇒ score = 8Ce morceau de code utilise différentes interprétations des
$'...'
chaînes dans chaque version de Bash.Affiche le numéro de version majeur - et c'est tout.
Doc trouvé ici .
Ungolfed:
Cette réponse est à moitié une conjecture; Je ne l'ai testé que dans les versions 4 et 3, mais cela devrait également fonctionner sur d'autres versions.
Faites-moi savoir si cela ne fonctionne pas, j'essaierai avec d'autres versions dès que je les aurai disponibles.
-1 car grâce à Jens.
-29 octets grâce à Digital Trauma (toute l'
expr
idée)!la source
;;
dans la dernière alternative. Utilisez;
pour supprimer un octet.$'\xN
fonctionnalité d' interprétation semble avoir été ajoutée à la version 2.01.1 ... Je vais devoir mettre à jour ma réponse. Travailler dessuss="$'\ua\xa\n'";case ${#s} in 3)echo 4;;5)echo 3;;7)echo 2;;9)echo 1;esac
s=$'\ua\xa\n';expr 5 - ${#s} / 2
. Cela fonctionne sur v3 et v4. Je n'ai pas d'anciennes versions fonctionnelles à essayer pour le moment.R, versions 2 et 3, score: 10,5 points
Cette commande renvoie
2
pour R 2.xx et3
pour R 3.xx. La fonction acite
été ajoutée dans la version R 3.0.0. Par conséquent, la commandeexists("cite")
retourneFALSE
pour R 2.xx etTRUE
pour R 3.xxR, toutes les versions (1, 2 et 3), score: 12⅓ points
La fonction a
eapply
été introduite dans R 2.0.0.la source
R.version$major
. 15 caractères. Je pas depuis quand il existe.Python , 196 octets / 16 versions = note 12,25
Les versions sont 1.5, 1.6, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 3.0, 3.1, 3.2, 3.3, 3.4, 3.5 et 3.6
Malheureusement, j'ai dû laisser de côté 2.7 car il n'y a pas de modules dans pour autant que je sache, elles ne sont pas dans la version 2.6 mais dans la version 3.0.
Nous parcourons un tas de modules introduits dans différentes versions de python et, à la première erreur, nous quittons et renvoyons la version. Les écarts entre les versions principales sont comblés par une importation répétée
os
. Le test pour python 1.5 repose sur le fait destring.split
ne pas être présent avant le 1.6.Merci à Olivier Grégoire pour son idée de tester en boucle de nouvelles classes / modules.
J'ai enfin enfin testé sur toutes les versions pertinentes de python ... ce qui nécessitait l'édition du code source 1.5 pour le compiler ...
la source
Fichier de commandes Windows , 35 octets / 2 versions = score 17.5
Imprime
DOS
sur MS-DOS (duh) etNT
sur Windows NT. (duh)Maintenant, pour quelques explications.
Windows a eu des scripts de commandes par lots depuis les temps MS-DOS et il n'a pas beaucoup changé depuis. Toutefois, lorsque Windows NT est venu, Microsoft a changé l'interpréteur par défaut pour les scripts de traitement par lots, à partir
COMMAND.COM
decmd.exe
(maintenant en permettant l'extension.cmd
comme une alternative à l'original.bat
).Avec cela, ils ont également implémenté quelques modifications , telles que l'
/i
indicateur permettant d'ignorer la casse de chaîne sur les conditions. C’est-à-dire qu’ilZ==z
est faux, qu’il/i Z==z
est vrai.Nous exploitons le fait que DOS n’a pas insensible à la casse et comparons les majuscules
Z
aux minusculesz
. En utilisant le/i
drapeau, on se retrouve avec uneZ==z
(fausse) condition sous DOS etz==z
(vrai) sous NT.Maintenant, je me rends compte que le challenge spécifie qu'un numéro de version doit être imprimé. Mais, autant que je sache, il n’existe pas de «numéro de version» pour le traitement par lots, c’est donc le plus proche que je puisse obtenir.
Testé sur Windows 10, DOSBox et vDos:
Windows 10:
(courir avec
cmd /k
pour fermer la fenêtreexit
)DOSBox:
vDos:
la source
7
est plus court que WindowsNT
.7
n'est pas vraiment une version linguistique, c'est la même chose sous Windows 'depuis 3.1. Donc, je ne pensais pas qu'il serait très juste d'appeler ça7
quand ça devrait peut-être même être3.1
Wolfram Language / Mathematica 10/11, 37 octets / 2 versions = 18,5
Considérez
(Length@DateRange[{1},{1}][[1]]+27)/3
, à 37 octets et travaillant avec 2 versions, me donne une note de 18,5.et
Je suis sûr qu'il existe un moyen plus efficace, mais la divergence entre la sortie DateRange m'a mordu à la fesses récemment, donc j'étais prêt à l'utiliser.
En guise de suivi, quelqu'un pourrait probablement tirer parti de l'
Length@DateRange[{1}, {1}][[1]]
évaluation1
dans les versions 1 à 8 de Mathematica, mais je n'ai pas eu le temps de l'intégrer.la source
$Version
:Your program may not use a builtin, macro, or custom compiler flags to determine the language version.
$Version
pour démontrer que le résultat correct$Version
est$VersionNumber
, mais vous l'appelez plutôt$Version
. À mon sens, même si laLength@DateRange
substance de votre programme est essentielle, cela ne fonctionnerait pas$Version
uniquement en fournissant les informations de version complètes que vous traitez ensuite, ce qui enfreint donc les règles.{1} Tr[1^#&@@%~DateRange~%]/3+9
(31 octets), ou même7+Length@Now
(12 octets)Ruby 1.x et 2.x, 20 octets, score de 10
Basé sur la
to_h
méthode qui a été introduite sur laArray
classe dans Ruby 2.la source
p [].to_h&&2rescue 1
est un peu plus court.Erlang, 180 octets, 11 versions, score 16.36
Avec indentation et sauts de ligne:
Testé sur une version mineure de chaque version majeure depuis 10:
L'idée est que chaque version majeure a ajouté au moins un nouvel argument autorisé pour la fonction
erlang:system_info
. Essayons donc ceux de la liste, comptons le nombre de ceux qui échouent et soustrayons le nombre d'échecs de 20, qui est la version actuelle.la source
Julia 0.4, 0.5, 46 octets, score 22
Julia a modifié le nom de type des types de chaîne concrets et abstraits dans de nombreuses versions.
Ce code profite notamment de:
Julia 0.4 :
ASCIIString
,AbstractString
,String
.Julia 0.5 :
String
,ASCIIString
,AbstractString
(bien que cela ne soit pas important ici)Voir aussi ma nouvelle solution plus efficace basée sur différents principes
la source
Japt (1 & 2),
86/2 =43Test v1 | Test v2
Explication
Avant la v2, Japt utilisait une syntaxe RegEx personnalisée. Nous pouvons donc en tirer parti.
Le nombre 1 sous forme de chaîne.
Remplacez (
r
) le ci-dessous par un2
.Japt 2 voit cela comme le RegEx
/\S/g
, qui correspond à la1
. Japt 1 ignore le\
caractère d'échappement et voit juste laS
qui est la constante de Japt pour un caractère d'espace et, évidemment, ne correspond pas à la1
.la source
Befunge, score = 3.5
7 octets, 2 versions
Essayez-le en ligne dans Befunge-93
Essayez-le en ligne dans Befunge-98
"]"
est un littéral de chaîne dans les deux versions, poussant 93 (la valeur ASCII de[
) sur la pile.'b
est un caractère littéral dans Befunge-98, poussant 98 (la valeur ASCII deb
), mais il s’agit d’instructions non valides dans Befunge-93, elles sont donc simplement ignorées. On termine donc avec 93 au sommet de la pile dans Befunge-93 et 98 dans Befunge-98..@
écrit la valeur en haut de la pile puis quitte.la source
]"[email protected]'
ou][email protected]'
aussi travaillerRuby 1.x (<1.9) et 2.x,
108 octets, score = 4Essayez le:
Cela fonctionne en exploitant les différents comportements de
?x
Ruby 1.x et 2.x. En Ruby 1.x,?A
(par exemple) renvoie65
(la valeur ASCII du caractèreA
), mais en Ruby 2.0, il renvoie la chaîne d'un caractère"A"
.Le code ci-dessus est équivalent à ceci:
En Ruby 1.x (<1.9), la valeur de
val
is50
(la valeur ASCII du caractère2
), un Fixnum.Fixnum#%
est l'opérateur modulo, donc50 % 7
renvoie1
.En Ruby 2.x,
val
c'est la chaîne"2"
.String#%
est une version infixe desprintf
,"2" % 7
équivaut donc àsprintf("2", 7)
, où"2"
est la chaîne de format. Comme la chaîne de format ne contient aucune séquence de format (par exemple%d
), les arguments suivants sont ignorés et"2"
sont renvoyés.Enfin,
$>
est un alias pour$stdout
, donc$> << ...
affiche le résultat.la source
?A==66?1:2
avant que je tombe sur votre réponsePython 2 et Python 3 ,
3634 octets, score de1817En Python 2 , le hachage de l'infini négatif est -271828 mais en Python 3, il s'agit de -314159. Edit: 2 octets enregistrés, 1 point de score, grâce à @ArBo.
la source
hash
été corrigé pour la première fois pour travailler sur des infinis à virgule flottante, le développeur concerné a utilisé pi * 1e5 et e * -1e5 comme valeurs de hachage. À un moment donné dans Python 3, la valeur has de l'infini négatif a été changée pour devenir la négation de la valeur de hachage pour l'infini.Python 3 , Python 2 , score 17,5
(35 octets, 2 versions)
Python 2 , 35 octets
Essayez-le en ligne!
Python 3 , 35 octets
Essayez-le en ligne!
5 octets sauvés grâce à ETHproductions
Pas une bonne réponse au golf, mais un changement énorme!
la source
try:exec("print 2")\nexcept:print(3)