Desafio
Crie um programa de console para exibir cada byte de um arquivo.
Ganhando
Como se trata de código-golfe , o menor número de bytes vence.
Regras
- O programa deve ser um aplicativo de console , o que significa que será executado a partir de algum tipo de interpretador de linha de comando;
- Cada byte deve estar em maiúsculas hexadecimal, separado por um espaço e deve ter 2 dígitos; (coloque o número 0 antes, se tiver 1 dígito)
- O arquivo deve ser lido usando IO ou alternativa e não codificado;
- O caminho do arquivo deve ser especificado como um argumento da linha de comandos ou um prompt do usuário (como STDIN) ;
- Não há brechas, por favor ;
Exemplo
test.txt (termina com LF)
Hello World!
$ ./hexdump.exe test.txt
48 65 6C 6C 6F 20 57 6F 72 6C 64 21 0A
hello.txt
arquivo de texto simples como exemplo como entrada e qual deveria ser a saída esperada. Por exemplo, sehello.txt
contivesse simplesmente a palavrahello
com uma quebra de linha, como isso seria expresso na saída? Você está agrupando os bytes em palavras de 16, 32 ou 64 bits? Ou cada byte é expresso como hexadecimal de dois dígitos? Os espaços são aceitáveis após cada byte como hexadecimal ou após cada palavra de bit x? Você precisa de uma0x
pré-correção para cada byte?Respostas:
C (gcc) em * nix,
7371 bytesExperimente online! Suíte de teste
-2 bytes graças a Johan du Toit
Isso depende
O_RDONLY == 0
deint_one == 1
ondeint int_one; *(char*)&int_one = 1;
.fonte
Ruby , 26 bytes
Experimente online!
fonte
$<
alterne para a leitura de STDIN.PowerShell ,
4540 bytesExperimente online!
-5 bytes graças ao mazzy
fonte
./.input.tio
. 40 bytes com o CRLF preservado.Java 11,
156154 bytes-2 bytes graças a @Holger .
Experimente online usando
./.input.tio
como argumento caminho do arquivo, que terá uma entrada específica como conteúdo do arquivo.Explicação:
fonte
interface
vez declass
?interface
são mais curtos queclass
+public
.Path.of
vez dePaths.get
public
, mas são, apublic
menos que declarados explicitamenteprivate
.PHP ,
605954 bytesExperimente online!
fonte
?>
e salvar 2 bytes ou, se isso não funcionar, substitua?>
por um ponto-e-vírgula e salve 1 byte.implode(file($x))
vez defile_get_contents($x)
(-4 bytes).wordwrap()
, com1
o último parâmetro, é um byte menor quechunk_split()
.Perl 5 (
-aF//
), 23 bytesTIO
fonte
APL (Dyalog Unicode) , 16 bytes
Função de prefixo tácito anônimo. Retorna (e imprime implicitamente, se o valor não for consumido de outra forma) uma matriz de duas linhas com os 4 bits superiores representados como um número decimal de 0 a 15 na linha superior e os 4 bits inferiores representados da mesma forma na linha inferior. Ou seja, a matriz possui tantas colunas quanto o arquivo possui bytes.
Experimente online!
⎕MAP
mapeie o nome do arquivo do argumento para uma matriz∘
com parâmetros:¯1
todo o comprimento do arquivo83
lido como números inteiros de 8 bits16 16⊤
converter (anti-base) em hexadecimal de 2 posiçõesfonte
H
, 72 é 4 × 16 4 + 8 × 16⁰ ou [4,8] ,8. Portanto, a primeira coluna no exemplo é lida[4,8]
.Python 3, 59 bytes
-11 bytes graças a Mostly Harmless!
-8 bytes graças a James K Polk!
-24 bytes graças ao Blue!
Experimente online!
Isso é bem direto; abre um nome de arquivo fornecido como entrada no STDIN, lê, converte cada caractere em seu valor ASCII, converte cada número em hexadecimal, retira o
"0x"
que precede os valores hexadecimais em Python, preenche o valor com zero, se necessário, e une os valores junto com espaços.fonte
'%02X'%ord(i)
, em vez de cortar a saída do hex.upper()
import sys
usandoraw_input()
como o nome do arquivo; regras permitem que o usuário solicite.input()
Bash ,
3323 bytes... com muita ajuda:
-3 graças a manatwork
-4 graças a spuck
-3 graças a Nahuel Fouilleul
Experimente online!
Observe que o link TIO acima usa entrada - podemos escrever arquivos localmente, portanto isso mostra que ele funciona como um programa que segue um caminho de arquivo.
fonte
xxd -u -p $1|fold -2|tr \\n \
.\n
e\
trabalhar na versão do link 'this'? Edição: eu adicionei outro caractere de escape.xxd -c1 -p -u $1|tr \\n \
Kotlin ,
1301271049392 bytesExperimente online!
Edit: -11 bytes graças a @ChrisParton
Edit: Working TIO
Edit: -1 byte graças a @KevinCruijssen
fonte
File
comojava.io.File
em vez disso?./.input.tio
como argumento do caminho do arquivo e ele usará o STDIN como conteúdo do arquivo. :)a:Array
, então acho que você pode salvar um byte.Dardo ,
140134 bytesExperimente online!
-6 bytes porque esqueci de reduzir nomes de variáveis
fonte
Haskell,
145143 bytesfonte
import Data.ByteString
maismain=getArgs>>=Data.ByteString.readFile.(!!0)>>=mapM_(printf"%02X ").unpack
.Ferrugem, 141 bytes (versão contribuída)
Ferrugem, 151 bytes (versão original)
fonte
bash + Stax, 6 + 4 + 1 = 11 bytes
Este é um ofício teórico completo neste momento. Você não pode realmente executar isso. Se tudo funcionar de acordo com suas especificações, isso funcionaria, mas nem tudo ainda funciona.
O script bash é
eo programa stax deve ser compilado e salvo em] é
Defina seu conjunto de caracteres para ISO 8859-1 (Windows-1252 não funcionará aqui) e vá
Desembalado e explicado
fonte
Emojicode ,
186162 bytesExperimente online aqui.
Ungolfed:
fonte
Perl 6 , 45 bytes
Experimente online!
@*ARGS[0]
é o primeiro argumento da linha de comandos..IO
transforma esse nome de arquivo (presumido) em umIO::Path
objeto..slurp(:bin)
lê o arquivo inteiro em umBuf
buffer de bytes. (Sem o:bin
arquivo, o conteúdo seria retornado como uma string Unicode.).list
retorna uma lista dos valores de bytes do buffer..fmt('%02X')
é umList
método que formata os elementos da lista usando a sequência de formato fornecida e os une a espaços. (Conveniente!).say
imprime essa sequência.fonte
.list
para 41 bytesD , 98 bytes
Experimente Online!
fonte
Python 3, 75 bytes
Principalmente uma cópia da resposta python 2 de Maxwell.
fonte
sys.argv[1]
. comsys.argv[0]
esse script funciona mais como uma Quine ;-)Raquete, 144 bytes
Esse envio gera um espaço à direita e nenhuma nova linha à direita. Deixe-me saber se isso é considerado uma brecha :)
Limpo
fonte
Quarto (gforth) , 71 bytes
Experimente online!
O TIO está
3 arg
na última linha porque o TIO passa "-e bye" para o analisador de linha de comando antes de passar o códigoCódigo Explicação
fonte
Javascript, 155 bytes
fonte
VBScript, 143 bytes
fonte
Wolfram Language (Mathematica) ,
9489 bytesExperimente online!
O código é bastante auto-explicativo por causa dos nomes de comando longos. Deve ser lido principalmente da direita para a esquerda:
fonte
Gema , 45 caracteres
Exemplo de execução:
Experimente online!
fonte
Pitão , 12 bytes
Experimente online!
Recebe entrada como prompt do usuário (nenhuma maneira de acessar os argumentos da linha de comando AFAIK).
(*) Não tenho 100% de certeza se isso é pretendido, mas um dígito básico de 256 dígitos (como em um caractere) sempre será convertido em exatamente 2 dígitos hexadecimais, eliminando a necessidade de zerar.
fonte
Node.js, 118 bytes
Como é o resultado:
Entre o conteúdo do
test.txt
exemplo é o seguinte:fonte
C # .NET Framework 4.7.2 -
235213203191175140 bytesExperimente online!
fonte
05AB1E , 18 bytes
Experimente online!
Explicação:
fonte