Inspiré par cette question sur SO , votre tâche consiste à produire un programme qui est valide dans (au moins) deux versions principales de votre langue choisie qui produisent une sortie différente.
Règles
- Toute langue ayant plusieurs versions principales peut être utilisée.
- Aux fins de ce défi, je suggérerais qu'une "version majeure" soit l'endroit où le premier numéro du numéro de version change.
- PHP 4 et PHP 5 sont différents, PHP 5.3 et PHP 5.4 ne le sont pas.
- Cependant, comme je ne connais pas le schéma de versionnage pour toutes les langues, si vous pouvez défendre votre cas suffisamment bien, je suis sûr que la communauté déterminera si vous avez été juste dans la détermination de la "version majeure" vous-même.
- Aux fins de ce défi, je suggérerais qu'une "version majeure" soit l'endroit où le premier numéro du numéro de version change.
- Le code doit être compilé et exécuté avec les mêmes indicateurs et entrées à chaque fois
- Sauf pour changer la version de la langue si cela est pertinent
- Les erreurs ne comptent pas comme sortie et les réponses qui produisent des erreurs sont disqualifiées (plutôt que la sortie d'erreur est simplement ignorée)
- Le programme ne doit prendre aucune entrée autre que celle requise pour le faire fonctionner.
- Pour chaque version donnée, la sortie doit toujours être la même
- L'intention est que le changement soit une conséquence d'un changement de la spécification de langue plutôt que la spécification VM ou les métadonnées environnementales
Notation
- type de code-golf marquant la longueur, donc
+1
pour chaque caractère / octet -1
pour chaque différence de caractère dans la longueur de la sortie.- ex. sorties version 1
abcde
(5 caractères), sorties version 2123abc
(6 caractères) =-1
- ex. sorties version 1
Autres règles
- Des exceptions standard s'appliquent - aucun programme externe, demande Web, etc.
- Votre programme devrait se terminer (dans les 2 secondes)
- Le score le plus bas l'emporte.
"Meilleur" score
Gardez vos réponses originales, dans un souci d'équité, je marquerai le gagnant en fonction des règles d'origine.
Étant donné que mon score d'origine est fondamentalement cassé, pourquoi ne pas re-marquer / réessayer avec le système de score suivant:
- type de code-golf marquant la longueur, donc
+1
pour chaque caractère / octet +1
pour chaque caractère différence de longueur de sortieabcde
et123456
->+1
-1
pour chaque différence de caractère unique dans la sortie (limitée à la longueur de la sortie la plus courte)abcde
et123456
->-5
12345
et123456
->-1
12345
et123455
->0
- Scores les plus proches de zéro victoire
- En cas de deuxième bris d'égalité, un simple score de golf par code l' emporte.
code-challenge
James Webster
la source
la source
zzzz
etaaaa
cela me donne--4
t -il ? Voilà ce que cela me semble.Réponses:
Réponse révisée pour un «meilleur» système de notation
C89 / C99, Score: 0
Mon programme comporte 52 caractères et utilise le même mécanisme que dans ma réponse d'origine pour obtenir une sortie différente. Cela fonctionne car C89 ne traite pas
//
comme un commentaire:Les resultats:
Ancienne réponse:
C89 / C99, Score: -Infini?
Je ne suis pas tout à fait sûr si ce programme n'enfreint pas les règles, mais tant pis. Ce programme exploite le fait qu'en C89
//
n'est pas un commentaire valide mais l'/* ... */
est.En utilisant l'astuce de commentaire, une autre fonction est exécutée. En C89, la fonction s'imprime
"trolololol..."
jusqu'à ce que la pile déborde (elle peut donc se terminer dans les 2 secondes).C99
C89
la source
Scores closest to zero win
donc très loin d'être nul.Python - 10 points de moins que la meilleure réponse suivante
En Python 2, cela affichera la liste entière des entiers de 0 à 99.
En Python 3,
range
est un générateur et il n'imprimera donc que "range (0,100)".Étant donné que je n'ai jamais rencontré de limite de taille sur les nombres en Python, je peux remplacer ce 100 par un nombre beaucoup plus grand (2 ** 1000, par exemple) et finir avec une différence pratiquement infinie dans la sortie.
Modifié pour refléter le fait que, même si je peux obtenir un score infiniment bas à des fins pratiques, je ne peux pas atteindre l'infini réel avec un programme qui se termine en moins de 2 secondes
Pour la mise à jour du système de notation des bris d'égalité, je soumets:
Sortie:
Python 2:
[0, 1, 2, 3]
Python 3:
range(0, 4)
La première impression a 5 caractères uniques (
[123]
), la deuxième impression a 8 caractères uniques (range(4)
), la différence de longueur de sortie est de 1, le code a 15 caractères, la sortie la plus courte est de 11 caractères ... ces règles sont assez déroutantes mais Je pense que cela m'amène à un score final de 15 + 1-min (11,5 + 8) = 5.la source
Python - 0 point
Je ne sais pas comment celui-ci fonctionne: P Je suis juste tombé dessus en essayant du code aléatoire.
Sur Python 3, c'est
<class 'int'>
et sur Python 2, c'est<type 'int'>
(en utilisant la console interactive)"Meilleur" Score: 3 (longueur) + 1 (diff. Char) - 4 (chars uniques)
Python plus ancien 1-7 points
Un grand merci à @grc pour cette version et à m'aider à soustraire quatre points!
En Python 2, cette instruction est interprétée comme
print ()
qui imprime le tuple vide()
.En Python 3, la
print
est une fonction et n'entraîne aucune impression."Meilleur" score: 7 (longueur) + 2 (diff. De caractères) - 2 (caractères uniques)
Python plus ancien 2-13 points:
"Meilleur" score: 12 (longueur) + 2 (caractère diff. O / p) - 1 (caractère unique o / p)
Je sais que cela ne va pas gagner mais j'ai quand même donné une réponse, car c'est mon premier essai Python :)
la source
print()
.dict.itertools()
: PC #
J'ai également changé les algorithmes d'inférence de type de méthode générique entre C # 2, 3 et 4. Par exemple:
Dans la méthode C # 2, l'inférence de type dit que T ne peut pas être à la fois
int
etint?
, et donc produit2
. Dans la méthode C # 3, l'inférence de type dit "le meilleur compromis entreint
etint?
estint?
" et donc choisitM<int?>
et produit 1.la source
Ruby, 4 caractères + 0 différence de longueur de caractère - 3 différence de caractère unique = score de 1
Sur Ruby 1.9, il s'imprime
"d"
. Le 1.8, il s'imprime100
.Explication:
?d
est"d"
en 1.9 et100
(le code ASCII pour d) en 1.8.p x
est équivalent àputs x.inspect
.*
est à la fois la répétition et la multiplication de chaînes.Version "optimisée" pour les anciens scores:
Ruby, 8 caractères - 999999989 différence de caractères = score de -999999981
Imprime
33000000000.0
pour 1.8 et"!!!!!!
...!!!"
pour 1.9. (?!
est33
en 1.8 et"!"
en 1.9, et*
est à la fois la répétition et la multiplication de chaînes.)Vraiment, vous pouvez aller aussi loin que vous le souhaitez avec la multiplication, cela dépend simplement de la vitesse de votre ordinateur.
la source
Bash - -∞ (jusqu'aux limites pratiques)
Effectivement, quelle que soit la mémoire dont vous disposez. Par exemple, avec environ 10 Go:
Bash 2: ne prend pas en charge les plages dans l'extension d'accolade, donc imprime
{0..999999999}
.Bash 3:
N'importe quelle langue - -∞ (jusqu'à des limites pratiques)
Vous l'aurez dans presque toutes les langues, même si cela finit par être un peu plus complexe. Dès que vous pouvez créer deux valeurs différentes, vous pouvez écrire du code qui produit une sortie arbitrairement différente. Une meilleure méthode de notation ignorerait les différences de sortie.
la source
…
dans la version «toutes langues» représente toutes les astuces que vous utilisez pour faire dépendre votre programme d'une modification de la spécification de langue. C'est la détection de version, que vous le fassiezif $version >= 3
ouif isinstance(range(0),list)
.C #
Le code suivant produirait la sortie différente pour C # 5.0 et les versions précédentes de C #
Sortie: C # 5.0
Sortie: C # 4.0
La raison est expliquée dans le billet de blog d'Eric Lippert
La fermeture de la variable de boucle est considérée comme nuisible
la source
Python, -14 points (différence de longueur de 3 à 17 caractères = -14)
Sorties Python 2:
0
Sorties Python 3:
0.6666666666666666
Meilleure version de notation, 5 points (différence de longueur de 3 + 2 caractères = 5)
Sorties Python 2:
1
Sorties Python 3:
1.5
la source
C #
J'ai ajouté la covariance et la contravariance à C # 4, donc les programmes de la forme:
Produirait
false
en C # 2 et 3 ettrue
en C # 4.Cependant, on pourrait affirmer que cela ne compte pas car la bibliothèque contenant la définition de
IEnumerable<T>
devait également changer.la source
C ++ 98/11 - Score "meilleur" (115 caractères - 115 différences de caractères uniques dans la sortie = score de 0)
Une version légèrement modifiée pour se conformer aux nouvelles règles de notation
Golfé:
Version non golfée:
La nouvelle solution ne diffère pas beaucoup de l'ancienne. Dans la nouvelle solution, la sortie en C ++ 11 et C ++ 98 est de 116 caractères également longs, mais le seul caractère qu'ils ont en commun est le nouveau caractère de ligne ajouté par la fonction put.
C ++ 98 le
u8
enu8"\x7E"[0]
sera toujours remplacé, mais maintenant avec"\x0B"
. Ainsi, la valeur résultante après prétraitement sera"\x0B""\x7E"[0]
. Les deux chaînes seront concaténées"\x0B\x7E"
et l'opérateur d'indice accèdera au premier élément, dans ce cas le caractère avec la valeur 11 dans le codage de caractères. De plus, la valeur dei
sera ajoutée, qui est initialement 114. Le caractère avec la valeur 125 sera donc écrit dans le tableau résultant. Commei
à zéro, toutes les valeurs de 125 à 11 seront écrites dans le tableau etputs
imprimeront tous les caractères avec les valeurs de 11 à 125, plus la nouvelle ligne de fin.En C ++ 11
u8"\x7E"[0]
sera interprété comme une chaîne UTF-8 composée du caractère unique avec la valeur hexadécimale 7E. L'opérateur en indice accède maintenant à ce caractère et la valeur de yi
est ajoutée, résultant en la valeur décimale 241 lors de la première itération. Pendant quei
va à zéro, toutes les valeurs jusqu'à 126 seront écrites dans le tableau etputs
imprimeront les caractères avec les valeurs de 126 à 241, plus la nouvelle ligne de fin.Selon le jeu de caractères utilisé, cela produira des résultats différents, car la plupart des jeux de caractères n'ont en commun que les 128 premiers caractères.
Pour ISO-8859-2, la sortie serait la suivante:
C ++ 98:
C ++ 11:
C ++ (106 caractères - 107 différence de sortie = score de -1) (OLD RULES)
Golfé:
Version non golfée:
Compilé avec
g++ -std=c++98 main.cpp
etg++ -std=c++11 main.cpp
.En fait, vous pouvez remplacer
108
par n'importe quel nombre positif dans la plage entière pour obtenir des scores négatifs. Tant qu'il est supérieur à 108;)En C ++ 98
#define u8 "f"
, le préprocesseur sera remplacéu8""[0]
par"f"""[0]
. Cela se traduira par"f"[0]
, qui devient finalement le caractère unique'f'
, qui est écrit dans un tableau.puts(c)
imprimera le tableau résultant, composé de i-1'f'
.En C ++ 11
u8""[0]
, la chaîne vide sera interprétée comme une chaîne UTF-8, donc aucune concaténation de chaîne n'est effectuée. Comme il s'agit d'une chaîne C, l'opérateur d'indice accède à l'octet nul final et l'écrit dans un tableau.En fin de
puts(c)
compte imprimera le tableau résultant, qui se compose uniquement de null-bytes. Mais comme ilputs
arrête de lire l'entrée dès qu'il rencontre un octet nul, il n'imprimera qu'une nouvelle ligne et rien de plus.la source
?
(sur mon système (Mac) au moins)CSS2 vs CSS3 48 points
Rendu comme
ABCDEFGHIJKLMNOPQRSTUVWXYZ
(petites majuscules) sur les navigateurs CSS3Rendu comme
abcdefghijklmnopqrstuvwxyz
sur les navigateurs non CSS374 caractères - 26 caractères uniques différence = 48
la source
Perl, 24 caractères - (9 * (10 ^ 9)) - 1 différence de caractère = score de - ((9 * (10 ^ 9)) - 1) +24
Imprime 9e9 fois
a
pour toutes les versions inférieures à 5, imprimea
pour toutes les versions supérieures à 5. Vous pouvez rendre le score infiniment bas en ajoutant simplement plus dea
s à la deuxième sortie.la source
Befunge, 36 - 378 = -342; 164 - 2576 = -2412
Dans Befunge 93, cela produirait 3 espaces, suivis de
<v
, suivis de 76 espaces, suivis de<v
, puis 76 espaces, puis<v
, puis 76 espaces, puis<v
suivis de 77 espaces, puisv
suivis de 78 espaces. Longueur:3 + 2 + 76 + 2 + 76 + 2 + 76 + 2 + 77 + 1 + 78 = 395
il est extensible de manière triviale en ajoutant des lignes supplémentaires similaires aux 5 premières lignes.Dans Befunge 98, cela produirait
<v <v <v <v v
.La différence de longueur:
395 - 17 = 378
. Donc le score aurait été (selon les anciennes règles):-342
Remarque: j'aurais pu obtenir une différence encore plus grande si j'avais utilisé à la
.
place de,
; la différence aurait été-684
Changement de règle:
C'est un peu plus délicat.
Sortie Befunge 93:
Sortie Befunge 98:
Longueurs:
2576
. Aucun des personnages entre les cordes n'est le même, donc si j'ai bien compris le défi, mon score est164 - 2576 = -2412
(oui, j'étais censé viser0
, mais c'était plus amusant). Si je dois faire en sorte que chaque caractère de chaque chaîne soit unique et différent les uns des autres, je peux le faire, dites-le-moi.la source
Powershell, meilleur score, -163 (15 - 178 caractères diff = -163)
Powershell V2
Powershell V3
la source
PHP, Score: 0 (meilleur cas)
Wow, ça va être amusant à expliquer.
Selon ce site Web , la
srand()
fonction semble être passée de PHP 5.1.5 à PHP 5.3.14 . Par conséquent, nous allons garder en considération PHP 4.4.9 et une version aléatoire de PHP 5 qui tombe dans l'intervalle de version spécifié ci-dessus.Sortie PHP 4.4.9:
1505335290
Je ne pense pas que cela enfreigne les règles; Comme cela semble être un bug, la sortie devrait être la même, mais ce n'est pas le cas. Notre autre version PHP sautera simplement la
srand()
fonction et affichera un nombre aléatoire.la source
Java (environ -2.000.000.000)
Les versions Java sont parfois appelées 1.x, mais je pense que cela reste dans les règles.
Le moyen le plus simple est de vérifier s'il existe une classe introduite dans une version spécifique.
(Cela dépend un peu de votre terminal s'il est possible de sortir 2 milliards de caractères en deux secondes / Pour le nouveau score, remplacez-le
Integer.MAX_VALUE
par le nombre d'octets du programme pour obtenir un score zéro parfait.)Ce code dépend de la version de la VM / JDK utilisée (cela compte-t-il?)
Il imprime
z
s pour Java 6 et les JDK antérieurs eta
s pour les versions récentes.la source
JavaScript (ES3 vs ES5) - 9 points
longueur
10
+ différence de longueur0
- différence de sortie1
Sorties
1
pour les navigateurs modernes qui prennent en charge Array.prototype.map. Sorties0
sur les anciens navigateurs. J'ai testé cela avec IE8.Avec les anciennes règles: 0 point
longueur
26
- différence de longueur26
Sorties
00000000000000000000000000
sur les navigateurs modernes. Et chaîne vide sur vieux.la source
Python - 0
Python 2 imprime une quine, tandis que Python 3 n'imprime rien.
EDIT: mis à jour, corrigé.
la source
APL (5 - (1988894 - 1) = -1988888)
Dans les APL à l'ancienne (comme Dyalog si
⎕ML=0
*),↑
signifie mélange , ce qui, sur un vecteur à une dimension, ne fait rien. Dans les APL de style APL2, comme GNU APL, (ou Dyalog si⎕ML=3
),↑
signifie premier , qui prend le premier élément d'un vecteur.Ainsi, les
5
octets suivants (le jeu de caractères APL tient dans un octet),affichera des
1988894
octets (la liste des nombres séparés par des espaces de 1 à 3e5) dans les dialectes APL à l'ancienne,et
1
octet (juste le premier nombre de ladite liste, qui est1
et donc de longueur1
), dans les dialectes APL de style APL2.Remarques:
⎕ML
signifie le niveau de migration . Dans Dyalog APL, plus la valeur est élevée⎕ML
, plus les fonctionnalités de style APL2 sont activées. Il est par défaut0
. (Et c'est une variable globale! Fun!)3e5
était la valeur à 3 caractères la plus élevée acceptée par Dyalog APL⍳
.4e5
m'a donné unLIMIT ERROR
. Cette restriction dépend probablement de l'interpréteur. (GNU APL n'a eu aucun problème avec des valeurs plus élevées.)la source
Bash 7 (14 octets de longueur de programme + 0 différence de longueur de sortie - 7 différence de caractères uniques en sortie)
Lié à la réponse @Gilles, mais une fonctionnalité d'extension et des versions différentes. Notation selon la question éditée:
Sortie pour bash 3.x:
Sortie pour bash 4.x:
la source
PHP: −134217684 (43 - 134217727)
Usage:
En PHP5 +, cela n'imprimera rien puisque ip2long avec un argument invalide se transforme en faux qui se transforme en zéro. En PHP4, il
ip2long("")
renvoie -1 et nous remplissons la chaîne vide avec 128 Mo d'oga
.Le masque est ajusté pour qu'il revienne bien avant les 2 secondes sur ma machine. Si vous ne pouvez pas le faire en 2 secondes, achetez un meilleur matériel!
Avec de nouvelles règles: 0 (40 - 40. Vous ne pouvez pas vous rapprocher de zéro.)
Les sorties:
la source
Exploit de commentaire C89 / C99, 45 caractères, 0 score
sortie c89
QRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}
- 45 car.sortie c99
MLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!
- 45 car.la source
printf
àputchar
; le plus accablant est que pour r5, j'ai mal lu les règles et combiné accidentellement de nouveaux et d'anciens scores. La sortie pour [r5, r6] est une erreur. r3 dans l'autre réponse C contient exactement la même erreur. Si vous regardez les horodatages, vous verrez que c'est la r5 qui a été publiée ici lorsque l'autre réponse a été mise à jour. Ce n'est pas important, car il s'agit du code golf , et cette entrée répond au défi en moins de caractères, point.C ++ 98 / C ++ 11
Pour un compilateur C ++ 98 conforme standard, cela génère 199711 fois la lettre 'x', tandis que pour un compilateur C ++ 11 conforme standard, cela génère 201103 fois la lettre 'x'. La différence de longueur de la sortie est donc de 1392 caractères. Cela signifie qu'en fait, jouer au code source ne vaut pas la peine, car un effet beaucoup plus important peut être obtenu en remplaçant simplement
"x"
par une chaîne plus longue ou en multipliant__cplusplus
avec un certain nombre.la source
SmileBASIC 3 / SmileBASIC 2, Score: -5 (notation originale)
Dans les versions modernes de SB, cela s'imprime
1000000000
comme prévu, mais dans la version 2 et antérieure, il s'imprimait en10
raison d'un bogue.la source
TI-Basic 83 Plus vs 84 Plus, score 5-1 = 4
Sorties
2
sur la TI-83 Plus, où le même programme est analysé comme quelque chose qui ressemblelength("?►DMS
parce que lasetTime(
commande n'a pas encore été introduite. La chaîne contient donc deux jetons de 1 octet, sa longueur est de 2.Sorties
1
sur la TI-84 Plus, car une chaîne contenant un seul jeton de 2 octets a la longueur 1.la source
Allez 1.9-> 1.10. Score = 1 - 1 = 0
À partir de 1,10 notes :
1.8:
256
1.9:
1024
1.10:
10340
la source