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 Quines , daher gelten die Standard-Quine-Regeln .
- Und dies ist auch eine Code-Golf- 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.
xxd
es nicht lesen ?Antworten:
V , 39 Bytes
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.
quelle
0a
am Ende der Ausgabe nicht entfernt werden?Perl, 81 Bytes
Zähle den Shebang als einen. Wenn die Codelänge ein Vielfaches von 16 ist, wird beim Formatieren einiges gespart. Verwenden Sie,
eval
um sich neu zuzuordnen,$_
die von ais523 ausgeliehen wurden .Ausgabe:
Probieren Sie es online!
quelle
Perl + xxd + cut, 61 Bytes
Probieren Sie es online!
Dies ist ein universeller Quine-Konstruktor in Perl + ein Aufruf von
xxd
undcut
zum Hexdumping. Keines der fraglichen Programme verfügt über eine integrierte Funktion zum Erstellen eines Hexdumps im fraglichen Format. jedochxxd -g1
sehr nahe kommt und so ist es möglich , verwenden Siecut
die Ausgabe in die richtige Form zu trimmen.Der universelle Quine-Konstruktor
$_=q("\$_=q($_);eval");eval
erstellt eine Kopie seines eigenen Quellcodes im Speicher und kann geändert werden, um beliebige Operationen auszuführen. In diesem Fall verwende ichopen "|"
und,print
um die Eingabe in externe Programme zuxxd
leiten , die den Großteil der Hexdumping-Arbeit erledigen undcut
die sie in das erforderliche Format ändern.quelle
JavaScript (ES6)
229219162 BytesVielen 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
Verwendung
Rufen Sie einfach die Funktion ohne Argumente auf.
Ausgabe
quelle
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
in[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.a
Hex-Dump führen, dem eine 0 vorangestellt werden muss, und das Hinzufügen dieser Prüfung würde nur den Bytecount erhöhen.Ruby,
128112 BytesOhne nachlaufende Newline.
Danke an primo für die Idee, sich an der 16-Byte-Grenze auszurichten.
Ausgabe
quelle