Шестнадцятковий дамп ваш вихідний код


15

Під час гольфу на коді буде час, коли вам потрібен шістнадцятковий дамп вашого коду, як правило, тому, що ви використовували недруковані символи. Отже, чому б не зробити програму, яку Hex Dumps сам?

Змагання

Ця проблема полягає в тому, щоб, не вводячи даних, виводити шістнадцятковий дамп вашого вихідного коду у такому форматі:

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

Або, наприклад, якщо ваша програма була 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)

Особливості

Шістнадцятковий дамп розбивається на рядки з трьох частин, кожен рядок представляє 16 байт вашого вихідного коду.

Перша частина - це адреса пам'яті. Він визначає, звідки починається поточний рядок у вашому коді. Написано у вигляді 2-байтного шістнадцяткового числа, за яким слід a :, потім пробіл.

Друге - це сам Hex Dump. Це 16 байт вашого вихідного коду, написаного у шістнадцятковій формі, розділеною пробілами. Це має бути точне байтове подання з використанням кодування вашого коду.

Нарешті, після двох пробілів у просторі - це сам код. Це просто 16 символів вашого коду, а символи, які не друкуються, написані як.

Примітки

  • Це є завданням, тому стандартними Куайном правил застосовуються.
  • І це також завдання , тому стандартні лазівки застосовуються .
  • Як показано у другому прикладі, не пишіть байти після EOF, а використовуйте пробіли.
  • Трейлінг пробілу добре.
  • Вбудовування на шістнадцятковий дамп, якщо у вас є такий у цьому конкретному форматі, не заборонені, але нахмурені.
  • Символи, що не друкуються, позначають будь-який символ, який, представлений лише одним байтом, не може бути представлений як один рознесений гліф. Для UTF-8 це означає 0-31, що 128-255. Для сторінки Jelly Codepage , оскільки всі символи можуть бути представлені як один проміжний гліф, немає символів, які не можна друкувати.

пов'язані / дублікати? codegolf.stackexchange.com/q/11985/47022
Герб Вулф

Особисто я відчуваю, що ця застосована королева робить її досить різною, але я готовий бачити думки громади.
Атако

1
Отже, для запису ви не можете прочитати ім'я файлу і xxdце?
Rɪᴋᴇʀ

4
Звичайно, ні, стандартні правила Quine забороняють це
ATaco

1
Особисто я б залишив це до відповіді. Виключати мову через це, на мою думку, абсолютно непотрібно. Якщо ви наполягаєте на фіксованій ширині, використовуйте щось, чого повинно вистачити для більшості мов. Більшість комунальних служб hexdump використовують 7 шістнадцяткових цифр.
Денніс

Відповіді:


3

V , 39 байт

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

Спробуйте в Інтернеті!

Зауважте, що зазвичай V використовує кодування latin1, де це 36 байт (що говорить TIO), але для цього представлення використовується UTF-8, де він становить 39 байт.

Це майже лише модифікація шаблону V-quine, про який я писав.


Чи не 0aслід видаляти новий рядок в кінці виводу?
Kritixi Lithos

@kritixilithos Ага, я забув про це. Простіше просто додати новий рядок до кінця.
Джеймс

8

Perl, 81 байт

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

Порахувавши шебанг як один. Маючи довжину коду кратною 16, це значно заощаджує на форматуванні. Використовуючи evalдля перепризначення $_себе, запозиченого у ais523 .

Вихід:

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

Спробуйте в Інтернеті!


5

Perl + xxd + вирізати, 61 байт

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

Спробуйте в Інтернеті!

Це універсальний конструктор quine в Perl + заклик до xxdта cutробити hexdumping. Жодна із програм, про які йдеться, не має вбудованої програми для виконання гексадуми у форматі запитання; проте,xxd -g1 підходить дуже близько, і це можливо використовувати cutдля підрізання виводу в потрібній формі.

Універсальний конструктор quine є $_=q("\$_=q($_);eval");eval, який створює копію власного вихідного коду в пам'яті і може бути модифікований для виконання довільних операцій над ним. У цьому випадку я використовую open "|"та передаю printвхід у зовнішні програми, xxdщо виконує основну масу гексдумпінгу та cutяка змінює його на потрібний формат.


3

JavaScript (ES6) 229 219 162 байт

Дякуємо @Neil за те, що зберегла багато байтів

Примітка

Дуже небагато людей думають, що отримати доступ до вихідного коду функції так, як я це роблю, це обман, але за словами @Dennis, це добре. Я буду залишати свою відповідь тут.

Код

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`

Використання

f()

Просто викликайте функцію без аргументів.

Вихідні дані

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
(не впевнений, що 'f =' + f дозволено за стандартними правилами quine, але якщо це тоді на 161 байт, я даю вам 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`.
Ніл

Розумний підхід. Я читаю деякі запитання, і, здається, люди взагалі вважають, що це вважається обманом, оскільки я зловживаю зручною мовною функцією. Я додам це разом із вашим удосконаленим кодом до своєї відповіді.
Лука

Я думаю, що це дозволено, Денніс сказав на чергову проблему, що використовує перевірку джерел функцій, це добре, і я знаю, що декілька відповідей "Гольф-королева" використовують це.
FlipTack

Зміна першого .toStringдо [t=toString]і другий , щоб [t]врятувати 3 байта. Змініть <backtick>\n<backtick>на, <backtick><newline><backtick>щоб зберегти інший.
користувач2428118

Змінивши його методом string, потрібно, щоб ім'я функції було рядком, як таке, воно зберігає лише один байт. Що стосується нового рядка, то це призведе aдо шестнадцяткового дампа, який потребує попереднього 0, і додасть, що перевірка лише збільшить кількість рахунків.
Лука

2

Ruby, 128 112 байт

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

Без останнього рядка.

Дякую примо за ідею вирівнювання до 16-байтової межі.

Вихідні дані

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}'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.