Al jugar golf con códigos, habrá momentos en los que necesitará un volcado hexadecimal de su código, generalmente porque ha utilizado caracteres no imprimibles. Entonces, ¿por qué no hacer un programa que Hex Dumps mismo?
El reto
Este desafío es, sin entrada, generar un volcado hexadecimal de su código fuente en el siguiente formato:
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 ................
O, por ejemplo, si su programa fue 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)
Detalles específicos
El volcado hexadecimal se divide en filas de tres partes, cada fila representa 16 bytes de su código fuente.
La primera parte es la dirección de memoria. Especifica dónde comienza la fila actual en su código. Escrito como un número hexadecimal de 2 bytes, seguido de un :
, luego un espacio.
El segundo, es el volcado hexadecimal en sí. Esto es 16 bytes de su código fuente, escrito en forma hexadecimal separados por espacios. Esto debería ser una representación de bytes precisa utilizando la codificación de su código.
Por último, después de un espacio de dos espacios, es el código en sí. Esto es simplemente 16 caracteres de su código, con caracteres no imprimibles escritos como.
Notas
- Este es un desafío de quine , por lo que se aplican las reglas estándar de quine .
- Y este también es un desafío de código de golf , por lo que se aplican las lagunas estándar .
- Como se muestra en el segundo ejemplo, no escriba bytes después de EOF, en su lugar use espacios en blanco.
- El espacio en blanco al final está bien.
- Las incorporaciones al volcado hexadecimal, si tiene una en este formato específico, no están prohibidas, pero están mal vistas.
- Los caracteres no imprimibles se refieren a cualquier carácter que, representado como un solo byte, no puede representarse como un glifo espaciado único. Para UTF-8, significa esto
0-31
,128-255
. Para la página de códigos Jelly , como todos los caracteres se pueden representar como un glifo espaciado, no hay caracteres no imprimibles.
xxd
eso?Respuestas:
V , 39 bytes
Pruébalo en línea!
Tenga en cuenta que normalmente V usa la codificación latin1, donde esto es 36 bytes (que es lo que dice TIO), pero este envío usa UTF-8 donde tiene 39 bytes.
Esto es prácticamente solo una modificación de la plantilla V-quine sobre la que escribí.
fuente
0a
eliminarse la nueva línea al final de la salida?Perl, 81 bytes
Contando el shebang como uno. Tener la longitud del código en múltiplo de 16 ahorra bastante en el formateo. Utilizando
eval
para reasignarse$_
a sí mismo prestado de ais523 .Salida:
Pruébalo en línea!
fuente
Perl + xxd + corte, 61 bytes
Pruébalo en línea!
Este es un constructor universal de quine en Perl + una llamada a
xxd
ycut
para hacer el hexdumping. Ninguno de los programas en cuestión tiene una función para hacer un hexdump en el formato de la pregunta; sin embargo, sexxd -g1
acerca mucho, por lo que es posible usarlocut
para recortar la salida en la forma correcta.El constructor universal de quine es
$_=q("\$_=q($_);eval");eval
, que crea una copia de su propio código fuente en la memoria, y puede modificarse para realizar operaciones arbitrarias en él. En este caso, utilizoopen "|"
yprint
canalizo la entrada a programas externos, loxxd
que hace la mayor parte del trabajo hexdumping ycut
lo cambia al formato requerido.fuente
JavaScript (ES6)
229219162 bytesGracias a @Neil por guardar muchos bytes
Nota
Muchas personas piensan que acceder al código fuente de una función de la forma en que lo hago es hacer trampa, pero según @Dennis, está bien. Como tal, dejaré mi respuesta aquí.
Código
Uso
Simplemente llame a la función sin argumentos.
Salida
fuente
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
a[t=toString]
y el segundo a[t]
para guardar 3 bytes. Cambie<backtick>\n<backtick>
a<backtick><newline><backtick>
para guardar otro.a
volcado hexadecimal, que necesita un 0 antepuesto, y agregar esa verificación solo aumentaría el recuento de bytes.Ruby,
128112 bytesSin rastro de nueva línea.
Gracias primo por la idea de alinear con el límite de 16 bytes.
Salida
fuente