Когда вы играете в код, иногда вам понадобится шестнадцатеричный дамп кода, обычно потому, что вы использовали непечатаемые символы. Итак, почему бы не сделать программу, которая сама 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
. Для кодовой страницы желе , так как все символы могут быть представлены в виде одного глифа с интервалом, нет непечатаемых символов.
xxd
это?Ответы:
V , 39 байт
Попробуйте онлайн!
Обратите внимание, что обычно V использует кодировку latin1, где это 36 байтов (это то, что говорит TIO), но это представление использует UTF-8, где это 39 байтов.
Это всего лишь модификация шаблона V-quine, о котором я писал.
источник
0a
в конце вывода не должен быть удален?Perl, 81 байт
Считая Шебанг как один. Наличие длины кода, кратной 16, значительно экономит на форматировании. Используется
eval
для переназначения$_
себе заимствованного из ais523 .Выход:
Попробуйте онлайн!
источник
Perl + xxd + cut, 61 байт
Попробуйте онлайн!
Это универсальный конструктор quine в Perl + вызов
xxd
иcut
выполнение hexdumping. Ни одна из рассматриваемых программ не имеет встроенной функции для выполнения hexdump в формате, о котором идет речь; тем не менее,xxd -g1
подходит очень близко, и поэтому можно использовать,cut
чтобы обрезать вывод в правильную форму.Универсальный конструктор quine
$_=q("\$_=q($_);eval");eval
, который создает копию своего собственного исходного кода в памяти и может быть изменен для выполнения произвольных операций над ним. В этом случае я используюopen "|"
иprint
для передачи ввода во внешние программы,xxd
который выполняет основную часть работы с шестнадцатеричной печатью иcut
изменяет ее в требуемый формат.источник
JavaScript (ES6)
229219162 байтаСпасибо @Neil за сохранение большого количества байтов
Заметка
Многие думают, что доступ к исходному коду функции, как я это делаю, обманывает, но, по словам @Dennis, это нормально. Поэтому я оставлю свой ответ здесь.
Код
использование
Просто вызовите функцию без аргументов.
Выход
источник
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
на,[t=toString]
а второе на,[t]
чтобы сохранить 3 байта. Измените на,<backtick>\n<backtick>
чтобы<backtick><newline><backtick>
сохранить другой.a
к шестнадцатеричному дампу, которому нужно добавить 0, и добавление этой проверки только увеличило бы число пользователей.Рубин,
128112 байтБез завершающего перевода строки.
Спасибо primo за идею выравнивания по 16-байтовой границе.
Выход
источник