Remarque: ce défi permet uniquement les réponses dans les langues compilées
Tâche
Votre tâche est assez simple, créez deux programmes différents qui, une fois compilés, produisent la même sortie.
Notation
C'est ici que le plaisir entre en jeu. Votre score sera le nombre d' octets uniques présents dans exactement un programme. Par exemple, si vos deux programmes (codés dans IBM Code page 437 ) sont
☻☻Program A
et
☺Program B
Les caractères qui sont dans exactement un programme sont
☻☺AB
Ainsi, le score est de 4. Notez qu'il ☻
apparaît deux fois dans le premier programme mais n'est compté qu'une seule fois.
Votre objectif est d'obtenir le meilleur score, le meilleur score possible est de 256.
Voici un programme de notation qui fonctionne pour les programmes encodés en ASCII.
Stipulations
Chaque octet des deux programmes devrait pouvoir être remplacé par un octet différent, ce qui entraînerait la compilation du programme dans un résultat différent ou l'échec de la compilation tous ensemble. La suppression d'un octet doit faire de même.
Vous pouvez utiliser n'importe quel indicateur de compilation tant que les deux programmes sont exécutés avec les mêmes indicateurs.
La compilation résultante doit être statique (c'est-à-dire qu'elle ne doit pas varier d'une exécution à l'autre), si les résultats varient d'une machine à l'autre, indiquez la machine sur laquelle elle doit fonctionner.
La sortie de la compilation doit être octet par octet identique et non "équivalente" ou "assez similaire".
La sortie de la compilation doit être non vide
Les avertissements / erreurs n'ont pas besoin d'être les mêmes entre les compilations
Si les programmes ou la compilation contiennent des caractères non imprimables, assurez-vous d'inclure un hexdump. Bien qu'il ne soit pas techniquement nécessaire.
la source
abcdefghijqlmnop...
pour utiliser plus de 20 caractères uniques. Est-ce permis?Code-Bowling
question!Réponses:
Perl, score 254 + 2 = 256
Voici un vidage hexadécimal d'un programme:
et voici l'autre programme:
Perl n'est normalement pas pensé à un langage compilé, mais il l'est; il est d'abord compilé en bytecode, puis le bytecode est exécuté. Vous pouvez appliquer un filtre sur le bytecode (par exemple pour le vider plutôt que d'exécuter le programme) en utilisant l'
-MO
option. Ces deux programmes se compilent dans le bytecode suivant (désassemblé en utilisant-MO=Terse
):Explication
Perl remplace toutes les instructions sans effet (telles que les littéraux de chaîne seuls) par une instruction "instruction sans effet" codée en dur dans le bytecode résultant, de sorte que les deux programmes compilent la même chose. En termes de remplacement de caractères, le remplacement de la plupart des caractères du programme 1 par des apostrophes entraînera l'échec de la compilation (ou le remplacement des apostrophes par
0
). Dans le programme 2, le remplacement du caractère anyc
entraînera l'échec de la compilation du programme (comme\c
prend un argument).En ce qui concerne les suppressions de caractères, la première version de cette réponse est antérieure à la "règle de durcissement par rayonnement" (que la suppression de tout caractère doit changer le comportement du programme). Cette version mise à jour et durcie aux radiations fonctionne via l'utilisation d'une somme de contrôle; si la suppression d'un caractère ne provoque pas d'erreurs de syntaxe, le code sera compilé en un appel à la fonction inexistante
x
. Le compilateur Perl n'optimise pas l'appel dans le cas où il est fait (et en général ne semble pas conscient que la fonction n'existe pas), et donc la sortie est différente. Cependant, le dossier constant de Perl est capable de voir que le programme non muté est une seule instruction sans effet, et optimise ainsi le tout en une seule instruction comme auparavant.À l'origine, j'ai mal lu la question en ne comptant que les caractères uniques d'un programme, et j'ai essayé d'optimiser pour cela. De toute évidence, le programme 2 doit contenir au moins un caractère afin de générer l'opcode "déclaration sans effet", ce qui signifie que le meilleur score possible dans un programme est 255. Je n'ai pas encore trouvé de moyen d'inclure une barre oblique inverse dans le programme 1 de manière à ce que le caractère qui le suit immédiatement ne puisse pas être remplacé de manière à provoquer la rupture du programme, mais cela ne me surprendrait pas si cela était possible (conduisant à un score de 255 + 1 = 256 ).
la source
C, 231
Programme A
Beaucoup d'imprimables ci-dessus. Voici l'hexdump xxd:
Programme B
Ceux-ci se compilent précisément avec le même code objet. GCC incorpore le nom de fichier dans le code objet, vous devrez donc donner aux fichiers le même nom (dans différents répertoires).
J'étais inquiet que le fait qu'il n'y ait pas de références pour
i
que le compilateur optimise complètement cette variable, mais je pense que cela en faisant une garantie globale qu'elle sera présente dans l'objet. Cela peut être vérifié en inspectant l'ensemble généré:Notez que dans le programme B, (la plupart des) les valeurs char sont données en octal. Ils auraient également pu être donnés en décimal, mais en utilisant octal, nous gagnons quelques caractères supplémentaires -
8
et9
- dans l'ensemble de différence.GCC ne semble pas aimer CR, LF et (pour des raisons évidentes) les caractères NUL à l'intérieur des guillemets simples
''
.Essayez-le en ligne et marquez .
la source
char
au lieu d'impliciteint
, au détriment du score.Python, score
16262728Personnages uniques:
-+;132547698<ACBEDFOXabopsx|
Calculez le score
Programme 1:
Dans le programme 1, il y a 5 espaces dans la ligne apparemment vierge.
Programme 2:
Une aide a été trouvée avec le code source de l'optimiseur de judas .
Testé avec ce script d'aide: essayez-le en ligne!
la source
Python 3.6,
2 3 56Programme 1:
Programme 2:
Python n'est normalement pas compilé, mais il compile son code source dans des fichiers pyc. Fondamentalement, une telle compilation comprend une passe d'optimisation qui change "1111 + 4168" en 5279. Les traits de soulignement ont deux objectifs: l'un d'eux est d'ajouter un au score, et l'autre est de conserver la longueur, qui est stockée dans le pyc en-tête le même. Toutes les affectations de variables autres que «x» doivent conserver le
co_consts
dans le bon ordre. Lex*x
à la fin sert à garderco_stacksize
le même.la source
compile
fonction intégrée, qui n'ajoute pas l'en-tête. Le mtime et le nom du fichier concernent s'applique uniquement à l'en-têteos.utime
fonctionFASM, 254
pas de 0x00 et 0x1A car fasm ne supporte pas les deux symboles
la source