Ao jogar golfe com código, haverá momentos em que você precisará de um Hex Dump do seu código, geralmente porque você usou caracteres não imprimíveis. Então, por que não criar um programa que o Hex Dumps em si?
O desafio
Esse desafio é, sem nenhuma entrada, gerar um Hex Dump do seu código-fonte na seguinte formatação:
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 ................
Ou, por exemplo, se seu programa foi 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)
Específicos
O dump hexadecimal é dividido em linhas de três partes, cada linha representando 16 bytes do seu código-fonte.
A primeira parte é o endereço da memória. Ele especifica onde a linha atual começa no seu código. Escrito como um número hexadecimal de 2 bytes, seguido por um:
, em seguida, um espaço.
O segundo, é o próprio Hex Dump. São 16 bytes do seu código-fonte, escritos em formato hexadecimal, separados por espaços. Essa deve ser uma representação precisa de bytes, usando a codificação do seu código.
Por fim, após uma lacuna de dois espaços, é o próprio código. São apenas 16 caracteres do seu código, com caracteres não imprimíveis escritos como.
Notas
- Este é um desafio quine , então Regras de Quine padrão se aplicam.
- E esse também é um desafio do código-golfe , então brechas padrão se aplicam.
- Conforme mostrado no segundo exemplo, não escreva bytes após o EOF, use espaço em branco.
- O espaço em branco à direita é bom.
- Inbuilts para Hex dump, se houver um nesse formato específico, não são proibidos, mas são mal vistos.
- Caracteres não imprimíveis se referem a qualquer caractere que, representado como apenas um byte, não pode ser representado como um glifo com espaçamento único. Para UTF-8, este meio
0-31
,128-255
. Para a página de código Jelly , como todos os caracteres podem ser representados como um glifo com espaçamento único, não há caracteres não imprimíveis.
xxd
ele?Respostas:
V , 39 bytes
Experimente online!
Observe que normalmente o V usa a codificação latin1, onde são 36 bytes (que é o que diz o TIO), mas esse envio está usando UTF-8, onde são 39 bytes.
Isso é apenas uma modificação do modelo V-quine sobre o qual escrevi.
fonte
0a
no final da saída não deve ser removida?Perl, 81 bytes
Contando o shebang como um. O fato de o comprimento do código ser múltiplo de 16 economiza bastante na formatação. Usando
eval
para reatribuir$_
para si mesmo emprestado do ais523 .Resultado:
Experimente online!
fonte
Perl + xxd + cut, 61 bytes
Experimente online!
Este é um construtor universal de quine no Perl + uma chamada para
xxd
ecut
para fazer o hexdumping. Nenhum dos programas em questão possui um built-in para executar um hexdump no formato da pergunta; no entanto,xxd -g1
chega muito perto e, portanto, é possível usarcut
para aparar a saída na forma correta.O construtor de quine universal é
$_=q("\$_=q($_);eval");eval
, que cria uma cópia de seu próprio código-fonte na memória e pode ser modificado para executar operações arbitrárias nele. Nesse caso, eu usoopen "|"
e canalizoprint
a entrada para programas externos,xxd
que executam a maior parte do trabalho de hexdumping e ocut
alteram para o formato necessário.fonte
JavaScript (ES6)
229219162 bytesObrigado a @Neil por salvar muitos bytes
Nota
Muitas pessoas acham que acessar o código fonte de uma função do jeito que eu faço isso é trapaça, mas de acordo com @Dennis, tudo bem. Como tal, deixarei minha resposta aqui.
Código
Uso
Simplesmente chame a função sem argumentos.
Resultado
fonte
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
para[t=toString]
e o segundo[t]
para salvar 3 bytes. Mude<backtick>\n<backtick>
para<backtick><newline><backtick>
para salvar outro.a
dump hexadecimal, que precisa de um 0 acrescentado e a adição dessa verificação aumentaria apenas o número de bytes.Ruby,
128112 bytesSem nova linha final.
Obrigado primo pela idéia de alinhar ao limite de 16 bytes.
Resultado
fonte