Programme de dumping hexagonal le plus court

13

Défi

Créez un programme de console pour afficher chaque octet d'un fichier.


Gagnant

Puisqu'il s'agit de , le moins d'octets gagne.


Règles

  • Le programme doit être une application console , ce qui signifie qu'il sera exécuté à partir d'une sorte d'interpréteur de ligne de commande;
  • Chaque octet doit être en hexadécimal majuscule, séparé par un espace, et il doit être composé de 2 chiffres; (mettez le numéro 0 devant s'il a 1 chiffre)
  • Le fichier doit être lu en utilisant IO ou une alternative, et non codé en dur;
  • Le chemin du fichier doit être spécifié sous forme d' argument de ligne de commande ou d'invite utilisateur (comme STDIN) ;
  • Pas d' échappatoires s'il vous plaît ;

Exemple

test.txt (se termine par LF)

Hello World!

$ ./hexdump.exe test.txt
48 65 6C 6C 6F 20 57 6F 72 6C 64 21 0A
facepalm42
la source
16
@ facepalm42 Pour éviter les facepalms, je recommande fortement d'utiliser le Sandbox pour vous aider à concevoir les futurs défis avant de les publier.
Adám
2
Comment est-il possible d'afficher toutes les valeurs d'octets à la fois, si cela ne tient pas sur l'écran? Le défilement n'est clairement pas "à la fois". De plus, quel est le problème avec (une fonction) renvoyant simplement les valeurs?
Adám
7
@ facepalm42 Veuillez ne pas modifier les spécifications si longtemps après avoir posté le défi. Le message d'origine ne spécifiait pas le format exact des nombres hexadécimaux, laissant le choix aux répondeurs. Votre dernière modification a invalidé ma réponse actuelle!
Adám
11
Y a-t-il une raison particulière pour laquelle vous autorisez uniquement l'argument de ligne de commande ou une invite utilisateur? Quel est le problème, par exemple, en prenant le nom de fichier comme argument de fonction?
Adám
3
Il serait utile si vous aviez un simple hello.txtfichier texte comme exemple d' entrée et quelle devrait être la sortie attendue. Par exemple, si le hello.txtcontenait simplement le mot helloavec un saut de ligne, comment cela serait-il exprimé dans la sortie? Regroupez-vous les octets en mots 16 bits, 32 bits ou 64 bits? Ou chaque octet est-il exprimé en hexadécimal à deux chiffres? Les espaces sont-ils acceptables après chaque octet en hexadécimal ou après chaque mot de x bits? Avez-vous besoin d'un 0xpréfixe pour chaque octet?
Shaun Bebbers

Réponses:

11

C (gcc) sur * nix, 73 71 octets

i;main(c,v)int**v;{for(c=open(v[1],0);read(c,&i,1);printf("%02X ",i));}

Essayez-le en ligne! Suite de tests

-2 octets grâce à Johan du Toit

Cela dépend de O_RDONLY == 0et sur int_one == 1int int_one; *(char*)&int_one = 1;.

wastl
la source
11
69 octets ;)
Johan du Toit
6

Rubis , 26 octets

$<.bytes{|b|$><<"%02X "%b}

Essayez-le en ligne!

GB
la source
Est-ce que cela lit le contenu d'un fichier donné un chemin de fichier comme argument de programme? Sur la base du TIO, il semble simplement lire à partir de STDIN, mais je ne connais pas assez bien Ruby pour dire que c'est incorrect.
Kevin Cruijssen
1
@KevinCruijssen Oui, il prend le (s) chemin (s) de fichier comme argument de programme. S'il n'y a pas d'arguments, $<passe à la lecture de STDIN à la place.
Value Ink
6

Java 11, 156 154 octets

import java.nio.file.*;interface M{static void main(String[]a)throws Exception{for(int b:Files.readAllBytes(Path.of(a[0])))System.out.printf("%02X ",b);}}

-2 octets grâce à @Holger .

Essayez-le en ligne en utilisant ./.input.tiocomme argument chemin-fichier, qui aura une entrée donnée comme contenu-fichier.

Explication:

import java.nio.file.*;        // Required import for Files and Paths
interface M{                   // Class
  static void main(String[]a)  //  Mandatory main method
      throws Exception{        //  With mandatory thrown clause for the readAllBytes builtin
                                         a[0]    // Get the first argument
                                 Path.of(    )   // Get the file using that argument as path
              Files.readAllBytes(             )  // Get all bytes from this file
    for(int b:                                 ) // Loop over each of them:
      System.out.printf(                         //  And print the current byte
                        "%02X ",b);}}            //  As uppercase hexadecimal with leading 0
                                                 //  and trailing space as delimiter
Kevin Cruijssen
la source
Quelle est la justification derrière l'utilisation interfaceau lieu de class?
JakeDot
4
@JakeDot main doit être publique, les méthodes d'interface sont toujours publiques, interfaceest plus courte que class+ public.
Grimmy
3
Avec Java 11, vous pouvez utiliser à la Path.ofplace dePaths.get
Holger
1
@Holger Merci! :)
Kevin Cruijssen
2
@Grimy depuis Java 9, les méthodes d'interface ne sont pas toujours public, mais elles le sont publicsauf si explicitement déclarées private.
Holger
6

PHP , 60 59 54 octets

<?=wordwrap(bin2hex(implode(file($argv[1]))),2,' ',1);
  • -1 octet grâce à manassehkatz
  • -5 octets grâce à Blackhole

Essayez-le en ligne!

John
la source
1
Doit être capable de supprimer le dernier ?>et enregistrer 2 octets, ou si cela ne fonctionne pas, remplacez-le ?>par un point-virgule et enregistrez 1 octet.
manassehkatz-Moving 2 Codidact
2
Utilisez implode(file($x))au lieu de file_get_contents($x)(-4 octets).
Blackhole
2
Et wordwrap(), avec 1comme dernier paramètre, est un octet plus court que chunk_split().
Blackhole
5

Perl 5 ( -aF//), 23 octets

printf"%02X ",ord for@F

TIO

Nahuel Fouilleul
la source
4

APL (Dyalog Unicode) , 16 octets

Fonction de préfixe tacite anonyme. Renvoie (et imprime implicitement, si la valeur n'est pas consommée autrement) une matrice à deux lignes avec les 4 bits supérieurs représentés sous la forme d'un nombre décimal 0–15 dans la ligne supérieure et les 4 bits inférieurs représentés de manière similaire dans la ligne inférieure. Autrement dit, la matrice a autant de colonnes que le fichier a d'octets.

16 1683 ¯1∘⎕MAP

Essayez-le en ligne!

⎕MAP mapper l'argument nom de fichier à un tableau
 avec des paramètres:
¯1 toute la longueur du fichier
83 lu comme des entiers 8 bits

16 16⊤ convertir (anti-base) en hexadécimal à 2 positions

Adam
la source
1
@ facepalm42 Il est très bien en hexadécimal. Par exemple H, 72, soit 4 × 16¹ + 8 × 16⁰ ou [4,8] ₁₆. Par conséquent, la première colonne de l'exemple indique [4,8].
Adám
Oh, j'ai complètement oublié! Pardon.
facepalm42
4

Python 3, 59 octets

-11 octets grâce à Mostly Harmless!

-8 octets grâce à James K Polk!

-24 octets grâce à Blue!

print(' '.join('%02X'%ord(i)for i in open(input()).read()))

Essayez-le en ligne!

C'est assez simple; il ouvre un nom de fichier donné en entrée sur STDIN, le lit, convertit chaque caractère en sa valeur ASCII, convertit chaque nombre en hexadécimal, "0x"supprime le qui précède les valeurs hexadécimales en Python, remplit la valeur avec un zéro si nécessaire, puis joint les valeurs avec des espaces.

mprogrammer
la source
Peut économiser quelques octets avec '%02X'%ord(i)au lieu de découper la sortie hexadécimale
Généralement inoffensif
@MostlyHarmless Done! -11 octets. Merci!
mprogrammer
que diriez-vous de '% 02X' au lieu de '% 02x', et débarrassez-vous.upper()
président James Moveon Polk
Vous pouvez enregistrer les octets du import sysen utilisant raw_input()à la place comme nom de fichier; les règles autorisent les invites utilisateur.
Blue
@Blue Merci! Et c'est encore plus court en Python 3, où vous pouvez simplement le faireinput()
mprogrammer
3

Bash ,  33  23 octets

... avec beaucoup d'aide:
-3 grâce à manatwork
-4 grâce à spuck
-3 grâce à Nahuel Fouilleul

echo `xxd -c1 -p -u $1`

Essayez-le en ligne!

Notez que le lien TIO ci-dessus utilise une entrée - nous pouvons écrire des fichiers localement, donc cela montre qu'il fonctionne comme un programme prenant un chemin de fichier.

Jonathan Allan
la source
Réductions mineures: xxd -u -p $1|fold -2|tr \\n \ .
manatwork
Merci, avez-vous une idée de comment obtenir \net \ travailler dans la version "this" du lien? EDIT: J'ai ajouté un autre personnage d'échappement.
Jonathan Allan
Si je vous comprends bien, vous voulez simplement passer des guillemets doubles aux guillemets simples: essayez-le en ligne!
manatwork
Super merci!
Jonathan Allan
xxd -c1 -p -u $1|tr \\n \
lancé le
3

Kotlin , 130 127 104 93 92 octets

fun main(a:Array<String>){java.io.File(a[0]).readBytes().forEach{print("%02X ".format(it))}}

Essayez-le en ligne!

Edit: -11 octets grâce à @ChrisParton

Edit: Travailler TIO

Edit: -1 octet grâce à @KevinCruijssen

Quinn
la source
1
Pourriez-vous abandonner l'importation et la référence Fileà la java.io.Fileplace?
Chris Parton
@ChrisParton vous avez raison, merci!
Quinn
Voici un TIO fonctionnel. Vous pouvez utiliser ./.input.tiocomme argument de chemin de fichier, et il utilisera le STDIN comme contenu de fichier. :)
Kevin Cruijssen
@KevinCruijssen merci! réponse juste mise à jour
Quinn
1
Je ne connais pas Kotlin, mais le TIO fonctionne toujours si je supprime l'espace à a:Array, donc je pense que vous pouvez enregistrer un octet.
Kevin Cruijssen
2

Fléchette , 140 134 octets

import'dart:io';main(a){print(new File(a[0]).readAsBytesSync().map((n)=>n.toRadixString(16).toUpperCase().padLeft(2,'0')).join(' '));}

Essayez-le en ligne!

-6 octets car j'ai oublié de réduire les noms de variables

Elcan
la source
+1 pour fléchette. Une telle langue sous-estimée.
vasilescur
Difficile de jouer avec, car il s'agit essentiellement de JS sans système de type très laxiste
Elcan
2

Haskell, 145 143 octets

import System.Environment
import Text.Printf
import Data.ByteString
main=getArgs>>=Data.ByteString.readFile.(!!0)>>=mapM_(printf"%02X ").unpack
Damien
la source
1
Un peu plus court: import Data.ByteStringplus main=getArgs>>=Data.ByteString.readFile.(!!0)>>=mapM_(printf"%02X ").unpack.
nimi
2

Rust, 141 octets (version contribuée)

use std::{io::*,fs::*,env::*};fn main(){for x in File::open(args().nth(1).unwrap()).unwrap().bytes(){print!("{:02X} ",x.unwrap())}println!()}

Rouille, 151 octets (version originale)

fn main(){std::io::Read::bytes(std::fs::File::open(std::env::args().nth(1).unwrap()).unwrap()).map(|x|print!("{:02X} ",x.unwrap())).count();println!()}
Vi.
la source
-10 octets: TIO
Herman L
2

bash + Stax, 6 + 4 + 1 = 11 octets

C'est un métier de théorie complet à ce stade. Vous ne pouvez pas réellement exécuter cela. Si tout fonctionne selon ses spécifications, cela fonctionnera, mais tout ne fonctionne pas encore.

Le script bash est

]<$1

et le programme stax doit être compilé et enregistré dans] est

╛↕ßú┼_

Réglez votre jeu de caractères sur ISO 8859-1 (Windows-1252 ne fonctionnera pas ici) et allez

Déballé et expliqué

_          push all input as a single array
F          run the rest of the program for each element of the array
 |H        write the hex of the byte to standard output
 |         write a space to standard output
Joshua
la source
2

Emojicode , 186 162 octets

📦files🏠🏁🍇🔂b🍺📇🐇📄🆕🔡👂🏼❗️❗️🍇👄📫🍪🔪🔡🔢b❗️➕256 16❗️1 2❗️🔤 🔤🍪❗️❗️🍉🍉

Essayez-le en ligne ici.

Non golfé:

📦 files 🏠  💭 Import the files package into the default namespace
🏁 🍇  💭 Main code block
🔂 b  💭 For each b in ...
  🍺  💭 (ignoring IO errors)
  📇 🐇 📄  💭 ... the byte representation of the file ...
  🆕 🔡 👂🏼  💭 ... read from user input:
  ❗️ ❗️ 🍇
    👄  💭 Print ...
    📫  💭 ... in upper case (numbers in bases > 10 are in lower case) ...
    🍪  💭 ... the concatenation of:
      🔪 🔡 🔢 b ❗️ ➕ 256  💭 b + 256 (this gives the leading zero in case the hex representation of b is a single digit) ...
              16  💭 ... represented in hexadecimal ...
           ❗️
         1 2  💭 ... without the leading one,
      ❗️
      🔤 🔤  💭 ... and a space
    🍪
    ❗️❗️
  🍉
🍉
OOBalance
la source
2

Perl 6 , 45 octets

@*ARGS[0].IO.slurp(:bin).list.fmt('%02X').say

Essayez-le en ligne!

  • @*ARGS[0] est le premier argument de ligne de commande.
  • .IOtransforme ce nom de fichier (présumé) en IO::Pathobjet.
  • .slurp(:bin)lit le fichier entier dans un Buftampon d'octets. (Sans le :bincontenu du fichier serait retourné sous forme de chaîne Unicode.)
  • .list renvoie une liste des valeurs d'octets du tampon.
  • .fmt('%02X')est une Listméthode qui formate les éléments de la liste en utilisant la chaîne de formatage donnée, puis les joint avec des espaces. (Pratique!)
  • .say imprime cette chaîne.
Sean
la source
Sur la base de la réponse Python, un lien TIO est en fait tout à fait possible.
Draco18s ne fait plus confiance au SE
Certains réarrangements peuvent supprimer le .listpour 41 octets
Jo King
1

D , 98 octets

import std;void main(string[]s){File(s[1]).byChunk(9).joiner.each!(a=>writef("%02X ",a.to!byte));}

Essayez-le en ligne!

Samuel
la source
1

Python 3, 75 octets

Surtout une copie de la réponse de Maxwell en python 2.

import sys
print(' '.join('%02X'%b for b in open(sys.argv[1],'rb').read()))
Président James Moveon Polk
la source
tu veux dire probablement sys.argv[1]. avec sys.argv[0]ce script fonctionne plus comme une quine ;-)
anion
@anion: oups, haha, réparation ...
président James Moveon Polk
1

Raquette, 144 octets

Cette soumission génère un espace de fin et aucune nouvelle ligne de fin. Faites-moi savoir si cela est considéré comme une échappatoire :)

(command-line #:args(f)(for([b(call-with-input-file f port->bytes)])(printf"~a "(string-upcase(~r b #:base 16 #:min-width 2 #:pad-string"0")))))

Nettoyé

(command-line #:args (f)
 (for ([b (call-with-input-file f port->bytes)])
   (printf "~a "
           (string-upcase
            (~r b #:base 16 #:min-width 2 #:pad-string "0")))))
Winny
la source
1

Forth (gforth) , 71 octets

: f slurp-file hex 0 do dup c@ 0 <# # # #> type space 1+ loop ;
1 arg f

Essayez-le en ligne!

TIO a 3 argdans la dernière ligne car TIO passe "-e bye" à l'analyseur de ligne de commande avant de passer le code

Explication du code

: f             \ start a function definition
  slurp-file    \ open the file indicated by the string on top of the stack,
                \ then put its contents  in a new string on top of the stack
  hex           \ set the interpreter to base 16
  0 do          \ loop from 0 to file-length - 1 (inclusive)
    dup c@      \ get the character value from the address on top of the stack
    0 <# # # #> \ convert to a double-length number then convert to a string of length 2
    type        \ output the created string 
    space       \ output a space 
    1+          \ add 1 to the current address value
  loop          \ end the loop
;               \ end the word definition
1 arg f         \ get the filename from the first command-line argument and call the function
reffu
la source
1

Javascript, 155 octets

for(b=WScript,a=new ActiveXObject("Scripting.FileSystemObject").OpenTextFile(b.Arguments(0));;b.echo(('0'+a.read(1).charCodeAt(0).toString(16)).slice(-2)))
peter ferrie
la source
1

VBScript, 143 octets

set a=CreateObject("Scripting.FileSystemObject").OpenTextFile(WScript.Arguments(0)):while 1 WScript.echo(right("0"+Hex(Asc(a.read(1))),2)):wend
peter ferrie
la source
1

Wolfram Language (Mathematica) , 94 89 octets

Print@ToUpperCase@StringRiffle@IntegerString[BinaryReadList@Last@$ScriptCommandLine,16,2]

Essayez-le en ligne!

Le code est assez explicite en raison des noms de commandes longs. Il doit être lu principalement de droite à gauche:

$ScriptCommandLine       is a list of {scriptname, commandlinearg1, commandlinearg2, ...}
Last@...                 extracts the last command-line argument
BinaryReadList@...       reads the named file into a list of bytes
IntegerString[...,16,2]  converts each byte to a 2-digit hex string (lowercase)
StringRiffle@...         converts this list of strings into a single string with spaces
ToUpperCase@...          converts the string to uppercase
Print@...                prints the result to stdout
romain
la source
1

Gema , 45 caractères

?=@fill-right{00;@radix{10;16;@char-int{?}}} 

Exemple d'exécution:

bash-5.0$ gema '?=@fill-right{00;@radix{10;16;@char-int{?}}} ' <<< 'Hello World!'
48 65 6C 6C 6F 20 57 6F 72 6C 64 21 0A 

Essayez-le en ligne!

homme au travail
la source
1

Pyth , 12 octets

jdcr1.Hjb'w2

Essayez-le en ligne!

Prend l'entrée comme invite utilisateur (aucun moyen d'accéder aux arguments de la ligne de commande AFAIK).

jd           # join on spaces
  c        2 # chop into pieces of length 2
   r1        # convert to uppercase
     .H      # convert to hex string, interpreting as base 256 (*)
       jb    # join on newlines
         '   # read file as list of lines
          w  # input()

(*) Je ne suis pas sûr à 100% si cela est prévu, mais un chiffre de base 256 (comme dans, un caractère), sera toujours converti en exactement 2 chiffres hexadécimaux, éliminant ainsi la nécessité de remplir avec des zéros.

ar4093
la source
1

Node.js, 118 octets

console.log([...require("fs").readFileSync(process.argv[2])].map(y=>(y<16?0:"")+y.toString(16).toUpperCase()).join` `)

À quoi ressemble le résultat: entrez la description de l'image ici

Btw le contenu de test.txtdans l'exemple est le suivant:

做乜嘢要輸出大楷姐,搞到要加番toUpperCase()去轉番,咁就13byte啦。

(Pourquoi diable la sortie en majuscules est-elle nécessaire? J'ai dû ajouter la conversion avec toUpperCase(), et cela a coûté 13 octets.)

Shieru Asakoto
la source
0

C # .NET Framework 4.7.2 - 235 213 203 191 175 140 140 octets

Essayez-le en ligne!

using System.IO;class P{static void Main(string[]a){foreach(var b in File.ReadAllBytes(a[0])){System.Console.Write(b.ToString("X2")+" ");}}}

using System;
using System.IO;

namespace hexdump
{
    class Program
    {
        static void Main(string[] args)
        {
            // Read the bytes of the file
            byte[] bytes = File.ReadAllBytes(args[0]);

            // Loop through all the bytes and show them
            foreach (byte b in bytes)
            {
                // Show the byte converted to hexadecimal
                Console.Write(b.ToString("X2") + " ");
            }
        }
    }
}
facepalm42
la source
1
Je pense que ce qui suit permettra d'économiser quelques octets (maintenant 181 je pense): en utilisant System.IO; classe P {static void Main (string [] a) {if (a.Length> 0 && File.Exists (a [0]) ) {foreach (var b dans File.ReadAllBytes (a [0])) {System.Console.Write ($ "{b.ToString (" X2 ")}");}}}}
PmanAce
@PmanAce Si vous supprimez une partie de l'espace, cela descend à 175.
facepalm42
0

05AB1E , 18 octets

IvyÇh2j' 0.:' Jvy?

Essayez-le en ligne!

Explication:

IvyÇh2j' 0.:' Jvy?
Iv                 Loop through each character in input
  y                Push current character
   Ç               ASCII value
    h              Convert to hexadecimal
     2j            Pad with at least 2 spaces
       ' 0.:       Replace all spaces with 0s
            ' J    Add space to end
               vy? Convert to string and print
IvyÇh2j' 0.:' Jvy?
facepalm42
la source