Hex Dump votre code source


15

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 , donc standard Quine règles applicables.
  • Et c'est aussi un défi de , 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.


Personnellement, j'ai l'impression que c'est un quine appliqué qui le rend suffisamment différent, mais je suis prêt à voir les pensées de la communauté.
ATaco

1
Donc pour mémoire, vous ne pouvez pas lire votre nom de fichier et xxdça?
Rɪᴋᴇʀ

4
Bien sûr que non, les règles standard de Quine interdisent cela
ATaco

1
Personnellement, je laisse le soin à la réponse. Exclure une langue à cause de cela est absolument inutile à mon avis. Si vous insistez sur une largeur fixe, utilisez quelque chose qui devrait être suffisant pour la plupart des langues. La plupart des utilitaires hexdump utilisent 7 chiffres hexadécimaux.
Dennis

Réponses:


3

V , 39 octets

ñi241"qp:%!xxd
Î4x
Íøø / &
f&3i ÿ

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 nouvelle ligne 0aà la fin de la sortie ne doit-elle pas être supprimée?
Kritixi Lithos

@kritixilithos Ah, j'ai oublié ça. Il est plus facile d'ajouter simplement une nouvelle ligne à la fin.
DJMcMayhem

8

Perl, 81 octets

#!perl -l
$_=q($%+=print"00$%0: @{[unpack'(H2)*']}  $_"for"\$_=q($_);eval"=~/.{16}/g);eval

Compter le shebang comme un. La longueur du code étant un multiple de 16 permet d'économiser un peu sur le formatage. L' utilisation evalde réattribuer $_à lui - même emprunté de ais523 .

Production:

0000: 24 5f 3d 71 28 24 25 2b 3d 70 72 69 6e 74 22 30  $_=q($%+=print"0
0010: 30 24 25 30 3a 20 40 7b 5b 75 6e 70 61 63 6b 27  0$%0: @{[unpack'
0020: 28 48 32 29 2a 27 5d 7d 20 20 24 5f 22 66 6f 72  (H2)*']}  $_"for
0030: 22 5c 24 5f 3d 71 28 24 5f 29 3b 65 76 61 6c 22  "\$_=q($_);eval"
0040: 3d 7e 2f 2e 7b 31 36 7d 2f 67 29 3b 65 76 61 6c  =~/.{16}/g);eval

Essayez-le en ligne!


5

Perl + xxd + cut, 61 octets

$_=q(open F,"|xxd -g1|cut -c5-";print F"\$_=q($_);eval");eval

Essayez-le en ligne!

Il s'agit d'un constructeur de quine universel en Perl + un appel à xxdet cutpour 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 -g1est 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'utilise open "|"et printpour diriger l'entrée vers des programmes externes, xxdce qui fait la majeure partie du travail de vidage hexadécimal et cutqui le change dans le format requis.


3

JavaScript (ES6) 229 219 162 octets

Merci à @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

f=_=>([...c=`f=`+f].map(d=>d.charCodeAt()[t=`toString`](16)).join‌​` `+` `.repeat(46)).match(/.{48}/g).map((s,i)=>`00${i[t](16)}0: `+s+c.substr(i*16,16)).join`\n`

Usage

f()

Appelez simplement la fonction sans arguments.

Production

0000: 66 3d 5f 3d 3e 28 5b 2e 2e 2e 63 3d 60 66 3d 60 f=_=>([...c=`f=`
0010: 2b 66 5d 2e 6d 61 70 28 63 3d 3e 63 2e 63 68 61 +f].map(c=>c.cha
0020: 72 43 6f 64 65 41 74 28 29 5b 74 3d 60 74 6f 53 rCodeAt()[t=`toS
0030: 74 72 69 6e 67 60 5d 28 31 36 29 29 2e 6a 6f 69 tring`](16)).joi
0040: 6e 60 20 60 2b 60 20 60 2e 72 65 70 65 61 74 28 n` `+` `.repeat(
0050: 34 36 29 29 2e 6d 61 74 63 68 28 2f 2e 7b 34 38 46)).match(/.{48
0060: 7d 2f 67 29 2e 6d 61 70 28 28 73 2c 69 29 3d 3e }/g).map((s,i)=>
0070: 60 30 30 24 7b 69 5b 74 5d 28 31 36 29 7d 30 3a `00${i[t](16)}0:
0080: 20 60 2b 73 2b 63 2e 73 75 62 73 74 72 28 69 2a  `+s+c.substr(i*
0090: 31 36 2c 31 36 29 29 2e 6a 6f 69 6e 60 5c 6e 60 16,16)).join`\n`                                     

1
(Je ne suis pas sûr que 'f =' + f soit autorisé selon les règles de quine standard mais si c'est alors pour 161 octets, je vous donne 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`.
Neil

Approche intelligente. J'ai lu quelques questions, et il semble que les gens pensent généralement que c'est considéré comme de la triche parce que j'abuse d'une langue pratique. J'ajouterai cela, ainsi que votre code amélioré, à ma réponse.
Luke

Je pense que c'est permis, Dennis a déclaré dans un autre défi quine que l'utilisation de l'inspection de source de fonction est très bien, et je sais que plusieurs réponses "Golf a quine" l'utilisent.
FlipTack

Remplacez le premier .toStringpar [t=toString]et le second par [t]pour enregistrer 3 octets. Modifiez le <backtick>\n<backtick>pour <backtick><newline><backtick>en enregistrer un autre.
user2428118

En la modifiant, la méthode de chaîne requiert que le nom de la fonction soit une chaîne, en tant que telle, elle enregistre uniquement un octet. Quant à la nouvelle ligne, elle se traduirait par un avidage 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.
Luke

2

Rubis, 128 112 octets

eval b='7.times{|y|$><<"%04x:"%y*=16;c=("eval b="+(a=39.chr)+b+a)[y,16];c.chars{|x|$><<" %x"%x.ord};puts"  "+c}'

Sans retour à la ligne.

Merci primo pour l'idée de s'aligner sur une limite de 16 octets.

Production

0000: 65 76 61 6c 20 62 3d 27 37 2e 74 69 6d 65 73 7b  eval b='7.times{
0010: 7c 79 7c 24 3e 3c 3c 22 25 30 34 78 3a 22 25 79  |y|$><<"%04x:"%y
0020: 2a 3d 31 36 3b 63 3d 28 22 65 76 61 6c 20 62 3d  *=16;c=("eval b=
0030: 22 2b 28 61 3d 33 39 2e 63 68 72 29 2b 62 2b 61  "+(a=39.chr)+b+a
0040: 29 5b 79 2c 31 36 5d 3b 63 2e 63 68 61 72 73 7b  )[y,16];c.chars{
0050: 7c 78 7c 24 3e 3c 3c 22 20 25 78 22 25 78 2e 6f  |x|$><<" %x"%x.o
0060: 72 64 7d 3b 70 75 74 73 22 20 20 22 2b 63 7d 27  rd};puts"  "+c}'
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.