Hex Dump ваш исходный код


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-байтовое шестнадцатеричное число, после которого :следует пробел.

Второе - это сам шестнадцатеричный дамп. Это 16 байт вашего исходного кода, написанных в шестнадцатеричной форме, разделенных пробелами. Это должно быть точное представление байтов с использованием кодировки вашего кода.

Наконец, после двух пробелов, сам код. Это просто 16 символов вашего кода с непечатными символами, написанными как.

Примечания

  • Это является задачей, поэтому стандартные Куайн правила применяются.
  • И это тоже вызов , поэтому применяются стандартные лазейки .
  • Как показано во втором примере, не пишите байты после EOF, вместо этого используйте пробелы.
  • Задний пробел в порядке.
  • Встраивания в шестнадцатеричный дамп, если он у вас есть в этом конкретном формате, не запрещаются, а осуждаются.
  • Непечатаемые символы относятся к любому символу, который, представленный только как один байт, не может быть представлен в виде одного глифа с интервалом. Для UTF-8, то это означает 0-31, 128-255. Для кодовой страницы желе , так как все символы могут быть представлены в виде одного глифа с интервалом, нет непечатаемых символов.

связанный с / продублировать? codegolf.stackexchange.com/q/11985/47022
Херб Вульф

Лично я чувствую, что эта прикладная квинна делает ее достаточно разной, но я хочу увидеть мысли сообщества.
ATaco

1
Итак, для записи, вы не можете прочитать имя вашего файла и xxdэто?
Rɪᴋᴇʀ

4
Конечно, нет, стандартные правила Куайна запрещают это
ATaco

1
Лично я бы оставил это до ответа. Исключение языка из-за этого абсолютно ненужно по моему мнению. Если вы настаиваете на фиксированной ширине, используйте то, что должно быть достаточно для большинства языков. Большинство утилит hexdump используют 7 шестнадцатеричных цифр.
Деннис

Ответы:


3

V , 39 байт

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

Попробуйте онлайн!

Обратите внимание, что обычно V использует кодировку latin1, где это 36 байтов (это то, что говорит TIO), но это представление использует UTF-8, где это 39 байтов.

Это всего лишь модификация шаблона V-quine, о котором я писал.


Разве перевод строки 0aв конце вывода не должен быть удален?
Критиси Литос

@kritixilithos Ах, я забыл об этом. Проще просто добавить новую строку в конец.
DJMcMayhem

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 + cut, 61 байт

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

Попробуйте онлайн!

Это универсальный конструктор quine в Perl + вызов xxdи cutвыполнение hexdumping. Ни одна из рассматриваемых программ не имеет встроенной функции для выполнения hexdump в формате, о котором идет речь; тем не менее, 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`.
Нейл

Умный подход. Я прочитал несколько вопросов, и кажется, что люди обычно думают, что это обман, потому что я злоупотребляю удобной языковой функцией. Я добавлю это вместе с вашим улучшенным кодом в мой ответ.
Лука

Я думаю, что это разрешено, сказал Деннис на другой проблеме с квайном, что использование проверки источника функции - это хорошо, и я знаю, что несколько ответов "Golf a quine" используют это.
FlipTack

Измените первое .toStringна, [t=toString]а второе на, [t]чтобы сохранить 3 байта. Измените на, <backtick>\n<backtick>чтобы <backtick><newline><backtick>сохранить другой.
user2428118

Чтобы изменить его, метод строки требует, чтобы имя функции было строкой, поэтому он сохраняет только один байт. Что касается новой строки, это привело бы aк шестнадцатеричному дампу, которому нужно добавить 0, и добавление этой проверки только увеличило бы число пользователей.
Лука

2

Рубин, 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}'

Без завершающего перевода строки.

Спасибо primo за идею выравнивания по 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.