Hex Gib deinen Quellcode aus

15

Beim Code-Golfen wird es Zeiten geben, in denen Sie einen Hex-Dump Ihres Codes benötigen, normalerweise, weil Sie nicht druckbare Zeichen verwendet haben. Warum also nicht ein Programm machen, das Hex Dumps selbst erstellt?

Die Herausforderung

Diese Herausforderung besteht darin, bei fehlender Eingabe einen Hex-Dump Ihres Quellcodes in der folgenden Formatierung auszugeben:

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  ................

Oder zum Beispiel, wenn Ihr Programm war 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)

Besonderheiten

Der hexadezimale Speicherauszug ist in Zeilen mit drei Teilen aufgeteilt, wobei jede Zeile 16 Byte Ihres Quellcodes darstellt.

Der erste Teil ist die Speicheradresse. Es gibt an, wo die aktuelle Zeile in Ihrem Code beginnt. Geschrieben als 2-Byte-Hexadezimalzahl, gefolgt von einem :, dann einem Leerzeichen.

Der zweite ist der Hex Dump. Dies sind 16 Bytes Ihres Quellcodes, die in hexadezimaler Form geschrieben und durch Leerzeichen getrennt sind. Dies sollte eine genaue Bytedarstellung unter Verwendung der Codierung Ihres Codes sein.

Nach einer Lücke von zwei Leerzeichen ist schließlich der Code selbst. Dies sind einfach 16 Zeichen Ihres Codes, wobei nicht druckbare Zeichen wie folgt geschrieben werden.

Anmerkungen

  • Dies ist eine Herausforderung für , daher gelten die Standard-Quine-Regeln .
  • Und dies ist auch eine Herausforderung, daher gelten Standard-Regelungslücken .
  • Schreiben Sie, wie im zweiten Beispiel gezeigt, keine Bytes nach EOF, sondern verwenden Sie stattdessen Leerzeichen.
  • Nachgestellte Leerzeichen sind in Ordnung.
  • Inbuilts to Hex Dump, falls Sie eines in diesem speziellen Format haben, werden nicht gebannt, sondern verpönt.
  • Nicht druckbare Zeichen beziehen sich auf alle Zeichen, die nur als ein einzelnes Byte dargestellt werden und nicht als einzelne Glyphen mit Abstand voneinander dargestellt werden können. Für UTF-8, bedeutet dies 0-31, 128-255. Für die Jelly-Codepage gibt es keine nicht druckbaren Zeichen, da alle Zeichen als einzelne Glyphen dargestellt werden können.
Ein Taco
quelle
verwandt / duplizieren? codegolf.stackexchange.com/q/11985/47022
Herb Wolfe
Persönlich denke ich, dass dies ein angewandter Quine ist, der es anders macht, aber ich bin bereit, die Gedanken der Community zu sehen.
ATaco
1
Also für den Datensatz können Sie Ihren Dateinamen und xxdes nicht lesen ?
16.
4
Natürlich nicht, Standard Quine Regeln verbieten das
ATaco
1
Persönlich würde ich es der Antwort überlassen. Aus diesem Grund ist es meiner Meinung nach absolut unnötig, eine Sprache auszuschließen. Wenn Sie auf einer festen Breite bestehen, sollten Sie etwas verwenden, das für die meisten Sprachen ausreicht. Die meisten Hexdump-Dienstprogramme verwenden 7 Hex-Ziffern.
Dennis

Antworten:

3

V , 39 Bytes

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

Probieren Sie es online!

Beachten Sie, dass V normalerweise die latin1-Codierung verwendet, wobei dies 36 Bytes sind (was TIO sagt), aber bei dieser Übermittlung wird UTF-8 verwendet, wo es 39 Bytes sind.

Dies ist so ziemlich nur eine Modifikation der V-Quine-Vorlage, über die ich geschrieben habe.

DJMcMayhem
quelle
Sollte der Zeilenumbruch 0aam Ende der Ausgabe nicht entfernt werden?
Kritixi Lithos
@kritixilithos Ah, das habe ich vergessen. Es ist einfacher, am Ende eine neue Zeile einzufügen.
DJMcMayhem
8

Perl, 81 Bytes

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

Zähle den Shebang als einen. Wenn die Codelänge ein Vielfaches von 16 ist, wird beim Formatieren einiges gespart. Verwenden Sie, evalum sich neu zuzuordnen,$_ die von ais523 ausgeliehen wurden .

Ausgabe:

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

Probieren Sie es online!

primo
quelle
5

Perl + xxd + cut, 61 Bytes

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

Probieren Sie es online!

Dies ist ein universeller Quine-Konstruktor in Perl + ein Aufruf von xxdund cutzum Hexdumping. Keines der fraglichen Programme verfügt über eine integrierte Funktion zum Erstellen eines Hexdumps im fraglichen Format. jedoch xxd -g1sehr nahe kommt und so ist es möglich , verwenden Sie cutdie Ausgabe in die richtige Form zu trimmen.

Der universelle Quine-Konstruktor $_=q("\$_=q($_);eval");evalerstellt eine Kopie seines eigenen Quellcodes im Speicher und kann geändert werden, um beliebige Operationen auszuführen. In diesem Fall verwende ich open "|"und, printum die Eingabe in externe Programme zu xxdleiten , die den Großteil der Hexdumping-Arbeit erledigen und cutdie sie in das erforderliche Format ändern.


quelle
3

JavaScript (ES6) 229 219 162 Bytes

Vielen Dank an @Neil für das Speichern vieler Bytes

Hinweis

Nicht wenige Leute denken, dass der Zugriff auf den Quellcode einer Funktion so ist, wie ich es tue, aber laut @Dennis ist das in Ordnung. Als solches werde ich meine Antwort hier lassen.

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`

Verwendung

f()

Rufen Sie einfach die Funktion ohne Argumente auf.

Ausgabe

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`                                     
Luke
quelle
1
(Ich bin mir nicht sicher, ob 'f =' + f nach den Standard-Quine-Regeln zulässig ist, aber wenn es sich dann um 161 Bytes handelt, gebe ich es Ihnen 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
Cleverer Ansatz. Ich habe einige Fragen gelesen und es sieht so aus, als würden die Leute allgemein denken, dass es als Betrug betrachtet wird, weil ich eine praktische Sprachfunktion missbrauche. Ich werde das zusammen mit Ihrem verbesserten Code zu meiner Antwort hinzufügen.
Luke
Ich denke, es ist erlaubt, sagte Dennis auf einer anderen Herausforderung, dass die Verwendung der Funktionsquellenprüfung in Ordnung ist, und ich weiß, dass mehrere "Golf a quine" -Antworten dies verwenden.
FlipTack
Ändern Sie den ersten .toStringin [t=toString]und den zweiten in [t], um 3 Bytes zu sparen. Ändern Sie das <backtick>\n<backtick>zu <backtick><newline><backtick>, um ein anderes zu speichern.
user2428118
Wenn Sie die Zeichenfolgemethode ändern, muss der Funktionsname eine Zeichenfolge sein, sodass nur ein Byte gespeichert wird. Was die Newline betrifft, würde dies zu einem aHex-Dump führen, dem eine 0 vorangestellt werden muss, und das Hinzufügen dieser Prüfung würde nur den Bytecount erhöhen.
Luke
2

Ruby, 128 112 Bytes

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}'

Ohne nachlaufende Newline.

Danke an primo für die Idee, sich an der 16-Byte-Grenze auszurichten.

Ausgabe

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}'
GB
quelle