Ketika bermain golf kode akan ada saat-saat di mana Anda memerlukan Hex Dump dari kode Anda, biasanya karena Anda telah menggunakan karakter yang tidak diinginkan. Jadi, mengapa tidak membuat program yang Hex Dumps sendiri?
Tantangan
Tantangan ini adalah, tanpa input, mengeluarkan Hex Dump kode sumber Anda dalam pemformatan berikut:
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 ................
Atau, misalnya, jika program Anda 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)
Spesifik
Dump hex dibagi menjadi baris tiga bagian, setiap baris mewakili 16 byte kode sumber Anda.
Bagian pertama adalah alamat memori. Ini menentukan di mana baris saat ini dimulai dalam kode Anda. Ditulis sebagai angka Byte 2 Heksadesimal, diikuti oleh :
, lalu spasi.
Yang Kedua, adalah Hex Dump itu sendiri. Ini adalah 16 byte Kode Sumber Anda, ditulis dalam bentuk Heksadesimal yang dipisahkan oleh spasi. Ini harus merupakan representasi byte yang akurat menggunakan pengkodean kode Anda.
Terakhir, setelah celah dua ruang, adalah kode itu sendiri. Ini hanya 16 karakter kode Anda, dengan karakter yang tidak dapat dicetak ditulis sebagai.
Catatan
- Ini adalah sebuah Quine tantangan, sehingga Standard Quine Aturan berlaku.
- Dan ini adalah tantangan kode-golf juga, jadi Standard Loopholes berlaku.
- Seperti yang ditunjukkan pada contoh kedua, jangan menulis byte setelah EOF, alih-alih gunakan spasi putih.
- Trailing whitespace baik-baik saja.
- Inbuilt ke Hex dump, jika Anda memilikinya dalam format spesifik ini, tidak dilarang tetapi disukai.
- Karakter yang tidak dapat dicetak mengacu pada karakter apa pun yang, yang direpresentasikan sebagai hanya satu byte, tidak dapat direpresentasikan sebagai mesin terbang spasi tunggal. Untuk UTF-8, ini berarti
0-31
,128-255
. Untuk Jelly Codepage , karena semua karakter dapat direpresentasikan sebagai mesin terbang spasi tunggal, tidak ada karakter yang tidak dapat dicetak.
xxd
itu?Jawaban:
V , 39 byte
Cobalah online!
Perhatikan bahwa biasanya V menggunakan pengkodean latin1, di mana ini adalah 36 byte (yang merupakan apa yang dikatakan TIO) tetapi pengiriman ini menggunakan UTF-8 di mana 39 byte.
Ini cukup banyak hanya modifikasi dari template V-quine yang saya tulis.
sumber
0a
di akhir output dihapus?Perl, 81 byte
Menghitung shebang sebagai satu. Memiliki panjang kode menjadi kelipatan 16 menghemat cukup banyak pada pemformatan. Menggunakan
eval
untuk menetapkan ulang$_
untuk dirinya sendiri dipinjam dari ais523 .Keluaran:
Cobalah online!
sumber
Perl + xxd + cut, 61 byte
Cobalah online!
Ini adalah konstruktor quine universal di Perl + panggilan ke
xxd
dancut
untuk melakukan hexdumping. Tak satu pun dari program yang dimaksud memiliki builtin untuk melakukan hexdump dalam format dalam pertanyaan; Namun,xxd -g1
sangat dekat dan jadi mungkin digunakancut
untuk memotong output ke bentuk yang benar.Konstruktor quine universal adalah
$_=q("\$_=q($_);eval");eval
, yang membuat salinan kode sumbernya sendiri dalam memori, dan dapat dimodifikasi untuk melakukan operasi sewenang-wenang di dalamnya. Dalam hal ini, saya menggunakanopen "|"
danprint
menyalurkan input ke program eksternal,xxd
yang melakukan sebagian besar pekerjaan hexdumping dancut
yang mengubahnya ke dalam format yang diperlukan.sumber
JavaScript (ES6)
229219162 byteTerima kasih kepada @Neil untuk menghemat banyak byte
Catatan
Cukup banyak orang berpikir bahwa mengakses kode sumber suatu fungsi sama dengan cara saya melakukannya, tetapi menurut @ Dennis, tidak masalah. Karena itu, saya akan meninggalkan jawaban saya di sini.
Kode
Pemakaian
Cukup panggil fungsi tanpa argumen.
Keluaran
sumber
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
menjadi[t=toString]
dan yang kedua[t]
untuk menghemat 3 byte. Ubah<backtick>\n<backtick>
to<backtick><newline><backtick>
untuk menyimpan yang lain.a
hex dump, yang membutuhkan 0 diawali, dan menambahkan bahwa cek hanya akan meningkatkan bytecount.Ruby,
128112 byteTanpa membuntuti baris baru.
Terima kasih untuk ide menyelaraskan ke batas 16-byte.
Keluaran
sumber