Desafío
Cree un programa de consola para mostrar cada byte de un archivo.
Victorioso
Como se trata de código de golf , gana menos bytes.
Reglas
- El programa debe ser una aplicación de consola , lo que significa que se ejecutará desde algún tipo de intérprete de línea de comandos;
- Cada byte debe ser hexadecimal en mayúsculas, separado por un espacio, y debe tener 2 dígitos; (ponga el número 0 antes si tiene 1 dígito)
- El archivo debe leerse usando IO o alternativa, y no codificado;
- La ruta del archivo debe especificarse como un argumento de línea de comandos o un mensaje de usuario (como STDIN) ;
- No hay escapatorias por favor ;
Ejemplo
test.txt (termina con LF)
Hello World!
$ ./hexdump.exe test.txt
48 65 6C 6C 6F 20 57 6F 72 6C 64 21 0A
hello.txt
archivo de texto simple como ejemplo como entrada y cuál debería ser la salida esperada. Por ejemplo, sihello.txt
contuviera simplemente la palabrahello
con un salto de línea, ¿cómo se expresaría esto en la salida? ¿Está agrupando los bytes en palabras de 16 bits, 32 bits o 64 bits? ¿O cada byte se expresa como hexadecimal de dos dígitos? ¿Son aceptables los espacios después de cada byte como hexadecimal o después de cada palabra de x bits? ¿Requiere una0x
corrección previa para cada byte?Respuestas:
C (gcc) en * nix,
7371 bytesPruébalo en línea! Banco de pruebas
-2 bytes gracias a Johan du Toit
Esto se basa en
O_RDONLY == 0
y sobreint_one == 1
dóndeint int_one; *(char*)&int_one = 1;
.fuente
Rubí , 26 bytes
Pruébalo en línea!
fuente
$<
cambia a lectura de STDIN en su lugar.PowerShell ,
4540 bytesPruébalo en línea!
-5 bytes gracias a mazzy
fuente
./.input.tio
. 40 bytes con CRLF preservado.Java 11,
156154bytes-2 bytes gracias a @Holger .
Pruébelo en línea utilizando
./.input.tio
como argumento file-path, que tendrá una entrada determinada como contenido de archivo.Explicación:
fuente
interface
lugar declass
?interface
es más corto queclass
+public
.Path.of
lugar dePaths.get
public
, pero apublic
menos que se declaren explícitamenteprivate
.PHP ,
605954 bytesPruébalo en línea!
fuente
?>
y guardar 2 bytes, o si eso no funciona, reemplácelo?>
con un punto y coma y guarde 1 byte.implode(file($x))
lugar defile_get_contents($x)
(-4 bytes).wordwrap()
,1
como último parámetro, es un byte más corto quechunk_split()
.Perl 5 (
-aF//
), 23 bytesTIO
fuente
APL (Dyalog Unicode) , 16 bytes
Función de prefijo tácito anónimo. Devuelve (e imprime implícitamente, si el valor no se consume) una matriz de dos filas con los 4 bits superiores representados como un número decimal 0-15 en la fila superior y los 4 bits inferiores representados de manera similar en la fila inferior. Es decir, la matriz tiene tantas columnas como el archivo tiene bytes.
Pruébalo en línea!
⎕MAP
mapear el nombre de archivo del argumento a una matriz∘
con parámetros:¯1
la longitud total del archivo se83
lee como enteros de 8 bits16 16⊤
convertir (anti-base) a hexadecimal de 2 posicionesfuente
H
, 72, que es 4 × 16¹ + 8 × 16⁰ o [4,8] ₁₆. Por lo tanto, se lee la primera columna del ejemplo[4,8]
.Python 3, 59 bytes
-11 bytes gracias a Mayormente inofensivo!
-8 bytes gracias a James K Polk!
-24 bytes gracias a Blue!
Pruébalo en línea!
Esto es bastante sencillo; abre un nombre de archivo dado como entrada en STDIN, lo lee, convierte cada carácter a su valor ASCII, convierte cada número a hexadecimal, quita el
"0x"
que precede a los valores hexademicos en Python, rellena el valor con un cero si es necesario, luego une los valores junto con espacios.fuente
'%02X'%ord(i)
lugar de cortar la salida de hexadecimal.upper()
import sys
utilizandoraw_input()
como nombre de archivo en su lugar; las reglas permiten avisar al usuario.input()
Bash ,
3323 bytes... con mucha ayuda:
-3 gracias a manatwork
-4 gracias a spuck
-3 gracias a Nahuel Fouilleul
Pruébalo en línea!
Tenga en cuenta que el enlace TIO anterior usa entrada: podemos escribir archivos localmente, por lo que esto muestra que funciona como un programa que toma una ruta de archivo.
fuente
xxd -u -p $1|fold -2|tr \\n \
.\n
y\
trabajar en la versión de enlace 'this'? EDITAR: agregué otro personaje de escape.xxd -c1 -p -u $1|tr \\n \
Kotlin ,
1301271049392 bytesPruébalo en línea!
Editar: -11 bytes gracias a @ChrisParton
Editar: TIO de trabajo
Editar: -1 byte gracias a @KevinCruijssen
fuente
File
como en sujava.io.File
lugar?./.input.tio
como argumento de ruta de archivo, y usará el STDIN como contenido de archivo. :)a:Array
, así que creo que puedes guardar un byte.Dardo ,
140134 bytesPruébalo en línea!
-6 bytes porque olvidé reducir los nombres de las variables
fuente
Haskell,
145143 bytesfuente
import Data.ByteString
másmain=getArgs>>=Data.ByteString.readFile.(!!0)>>=mapM_(printf"%02X ").unpack
.Rust, 141 bytes (versión contribuida)
Óxido, 151 bytes (versión original)
fuente
bash + Stax, 6 + 4 + 1 = 11 bytes
Esta es la teoría completa en este punto. En realidad no puedes ejecutar esto. Si todo funciona de acuerdo con sus especificaciones, esto funcionaría, pero no todo funciona todavía.
El script bash es
y el programa stax debe compilarse y guardarse en] es
Establezca su conjunto de caracteres en ISO 8859-1 (Windows-1252 no funcionará aquí) y vaya
Desempaquetado y explicado
fuente
Emojicode ,
186162 bytesPruébelo en línea aquí.
Sin golf:
fuente
Perl 6 , 45 bytes
Pruébalo en línea!
@*ARGS[0]
es el primer argumento de línea de comando..IO
convierte ese nombre de archivo (presunto) en unIO::Path
objeto..slurp(:bin)
lee todo el archivo en unBuf
búfer de bytes. (Sin el:bin
contenido del archivo se devolvería como una cadena Unicode)..list
devuelve una lista de los valores de bytes del búfer..fmt('%02X')
es unList
método que formatea los elementos de la lista usando la cadena de formato dada, luego los une con espacios. (¡Conveniente!).say
imprime esa cadena.fuente
.list
de 41 bytesD , 98 bytes
Pruébalo en línea!
fuente
Python 3, 75 bytes
Principalmente una copia de la respuesta de Maxwell en python 2.
fuente
sys.argv[1]
. consys.argv[0]
este script funciona más como una quine ;-)Raqueta, 144 bytes
Este envío genera un espacio final y no una nueva línea final. Avísame si esto se considera una escapatoria :)
Limpiado
fuente
Adelante (gforth) , 71 bytes
Pruébalo en línea!
TIO tiene
3 arg
en la última línea porque TIO pasa "-e bye" al analizador de línea de comando antes de pasar el códigoExplicación del código
fuente
Javascript, 155 bytes
fuente
VBScript, 143 bytes
fuente
Wolfram Language (Mathematica) ,
9489 bytesPruébalo en línea!
El código se explica por sí mismo debido a los largos nombres de comandos. Debe leerse principalmente de derecha a izquierda:
fuente
Gema , 45 personajes
Ejecución de muestra:
Pruébalo en línea!
fuente
Pyth , 12 bytes
Pruébalo en línea!
Toma datos como solicitud del usuario (no hay forma de acceder a los argumentos de la línea de comandos AFAIK)
(*) No estoy 100% seguro de si esto es lo que se pretende, pero una base de 256 dígitos (como en un carácter), siempre se convertirá en exactamente 2 dígitos hexadecimales, eliminando la necesidad de rellenar con ceros.
fuente
Nodo.js, 118 bytes
Cómo se ve el resultado:
Por cierto, el contenido de
test.txt
en el ejemplo es el siguiente:fuente
C # .NET Framework 4.7.2 -
235213203191175140 bytesPruébalo en línea!
fuente
05AB1E , 18 bytes
Pruébalo en línea!
Explicación:
fuente