Lorsque vous jouez au code, vous aurez parfois besoin d'un vidage hexadécimal de votre code, généralement parce que vous avez utilisé des caractères non imprimables. Alors, pourquoi ne pas créer un programme qui se décharge lui-même?
Le défi
Ce défi consiste, sans aucune entrée, à générer un vidage hexadécimal de votre code source dans le format suivant:
0000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
Ou, par exemple, si votre programme était print("SomeString"):rep(123)
0000: 70 72 69 6e 74 28 5c 22 53 6f 6d 65 53 74 72 69 print("SomeStrin
0010: 6e 67 5c 22 29 3a 72 65 70 28 31 32 33 29 g"):rep(123)
Détails
Le vidage hexadécimal est divisé en lignes de trois parties, chaque ligne représentant 16 octets de votre code source.
La première partie est l'adresse mémoire. Il spécifie où la ligne actuelle commence dans votre code. Écrit sous la forme d'un nombre hexadécimal de 2 octets, suivi d'un:
, puis d'un espace.
Le deuxième est le vidage hexadécimal lui-même. Il s'agit de 16 octets de votre code source, écrits sous forme hexadécimale séparés par des espaces. Cela devrait être une représentation précise des octets en utilisant l'encodage de votre code.
Enfin, après un espace de deux espaces, c'est le code lui-même. Il s'agit simplement de 16 caractères de votre code, avec des caractères non imprimables écrits comme.
Remarques
- Ceci est un défi quine , donc standard Quine règles applicables.
- Et c'est aussi un défi de code-golf , donc les échappatoires standard s'appliquent.
- Comme indiqué dans le deuxième exemple, n'écrivez pas d'octets après EOF, utilisez plutôt des espaces.
- La fin des espaces blancs est très bien.
- Les intégrations au vidage hexadécimal, si vous en avez un dans ce format spécifique, ne sont pas interdites mais sont mal vues.
- Les caractères non imprimables font référence à tout caractère qui, représenté comme un seul octet, ne peut pas être représenté comme un glyphe à simple espacement. Pour UTF-8, ce moyen
0-31
,128-255
. Pour la Jelly Codepage , comme tous les caractères peuvent être représentés comme un glyphe à simple espacement, il n'y a pas de caractères non imprimables.
xxd
ça?Réponses:
V , 39 octets
Essayez-le en ligne!
Notez que normalement V utilise l'encodage latin1, où cela fait 36 octets (c'est ce que dit TIO) mais cette soumission utilise UTF-8 où il fait 39 octets.
Il s'agit à peu près d'une modification du modèle V-quine sur lequel j'ai écrit.
la source
0a
à la fin de la sortie ne doit-elle pas être supprimée?Perl, 81 octets
Compter le shebang comme un. La longueur du code étant un multiple de 16 permet d'économiser un peu sur le formatage. L' utilisation
eval
de réattribuer$_
à lui - même emprunté de ais523 .Production:
Essayez-le en ligne!
la source
Perl + xxd + cut, 61 octets
Essayez-le en ligne!
Il s'agit d'un constructeur de quine universel en Perl + un appel à
xxd
etcut
pour effectuer le vidage hexadécimal. Aucun des programmes en question n'a de fonction intégrée pour effectuer un vidage hexadécimal au format de la question; cependant,xxd -g1
est très proche et il est donc possible d'utilisercut
pour couper la sortie dans la forme correcte.Le constructeur universel quine est
$_=q("\$_=q($_);eval");eval
, qui crée une copie de son propre code source en mémoire, et peut être modifié pour effectuer des opérations arbitraires sur celui-ci. Dans ce cas, j'utiliseopen "|"
etprint
pour diriger l'entrée vers des programmes externes,xxd
ce qui fait la majeure partie du travail de vidage hexadécimal etcut
qui le change dans le format requis.la source
JavaScript (ES6)
229219162 octetsMerci à @Neil d'avoir économisé beaucoup d'octets
Remarque
Beaucoup de gens pensent que l'accès au code source d'une fonction comme je le fais est de la triche, mais selon @Dennis, ça va. En tant que tel, je vais laisser ma réponse ici.
Code
Usage
Appelez simplement la fonction sans arguments.
Production
la source
f=_=>([...c=`f=`+f].map(c=>c.charCodeAt().toString(16)).join` `+` `.repeat(46)).match(/.{48}/g).map((s,i)=>`00`+i.toString(16)+`0 `+s+c.substr(i*16,16)).join`\n`
..toString
par[t=toString]
et le second par[t]
pour enregistrer 3 octets. Modifiez le<backtick>\n<backtick>
pour<backtick><newline><backtick>
en enregistrer un autre.a
vidage hexadécimal, qui a besoin d'un 0 ajouté au début, et l'ajout de cette vérification ne ferait qu'augmenter le bytecount.Rubis,
128112 octetsSans retour à la ligne.
Merci primo pour l'idée de s'aligner sur une limite de 16 octets.
Production
la source