Najkrótszy program zrzutu heksów


13

Wyzwanie

Utwórz program konsoli, aby wyświetlić każdy bajt pliku.


Zwycięski

Ponieważ jest to , wygrywa najmniej bajtów.


Zasady

  • Program musi być aplikacją konsolową , co oznacza, że ​​będzie uruchamiany z jakiegoś interpretera wiersza poleceń;
  • Każdy bajt musi być wielkimi literami szesnastkowymi, oddzielonymi spacją i musi składać się z 2 cyfr; (wstaw cyfrę 0, jeśli ma 1 cyfrę)
  • Plik musi być odczytany przy użyciu IO lub alternatywnie i nie może być zakodowany na stałe;
  • Ścieżka do pliku musi być określona jako argument wiersza polecenia lub monit użytkownika (np. STDIN) ;
  • Brak luki podobać ;

Przykład

test.txt (kończy się na LF)

Hello World!

$ ./hexdump.exe test.txt
48 65 6C 6C 6F 20 57 6F 72 6C 64 21 0A

16
@ facepalm42 Aby uniknąć twarzy, zdecydowanie zalecamy korzystanie z piaskownicy, aby pomóc w projektowaniu przyszłych wyzwań przed ich opublikowaniem.
Adám

2
Jak można wyświetlić wszystkie wartości bajtów jednocześnie, jeśli nie zmieści się na ekranie? Przewijanie wyraźnie nie jest „naraz”. Co jest nie tak z funkcją zwracającą wartości (funkcja)?
Adám

7
@ facepalm42 Nie zmieniaj specyfikacji tak długo po opublikowaniu wyzwania. Oryginalny post nie określał dokładnego formatu liczb szesnastkowych, pozostawiając to autorom odpowiedzi. Twoja ostatnia edycja unieważniła moją istniejącą odpowiedź!
Adám

11
Czy istnieje konkretny powód, dla którego dopuszczasz tylko argument wiersza polecenia lub monit użytkownika? Co jest złego w na przykład traktowaniu nazwy pliku jako argumentu funkcji?
Adám

3
Byłoby pomocne, gdybyś miał prosty hello.txtplik tekstowy jako przykład jako dane wejściowe i jakie powinno być oczekiwane wyjście. Na przykład, jeśli hello.txtzawiera po prostu słowo helloz podziałem wiersza, jak wyraziłoby się to w wyniku? Czy grupujesz bajty w słowa 16-bitowe, 32-bitowe lub 64-bitowe? A może każdy bajt jest wyrażony jako dwucyfrowa liczba szesnastkowa? Czy spacje są akceptowane po każdym bajcie jako szesnastkowym, czy po każdym słowie x-bitowym? Czy potrzebujesz 0xwstępnej poprawki dla każdego bajtu?
Shaun Bebbers

Odpowiedzi:



6

Rubinowy , 26 bajtów

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

Wypróbuj online!


Czy to czyta zawartość pliku, podając ścieżkę pliku jako argument programu? Na podstawie TIO wydaje się po prostu czytać ze STDIN, ale nie znam Ruby wystarczająco dobrze, by stwierdzić, że jest niepoprawny.
Kevin Cruijssen

1
@KevinCruijssen Tak, przyjmuje ścieżki pliku jako argument programu. Jeśli nie ma argumentów, $<zamiast tego przełącza się na odczyt ze STDIN.
Wartość tuszu


6

Java 11, 156 154 bajtów

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 bajty dzięki @Holger .

Wypróbuj online , używając ./.input.tiojako argumentu ścieżki do pliku, która będzie miała dane wejściowe jako zawartość pliku.

Wyjaśnienie:

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

Jakie jest uzasadnienie używania interfacezamiast class?
JakeDot,

4
@JakeDot main musi być publiczny, metody interfejsu są zawsze publiczne, interfacejest krótszy niż class+ public.
Grimmy,

3
W Javie 11 możesz używać Path.ofzamiastPaths.get
Holger

1
@Holger Thanks! :)
Kevin Cruijssen

2
@Grimy od Java 9, metody interfejsu nie zawsze są public, ale nie są publicjawne private.
Holger,

6

PHP , 60 59 54 bajtów

<?=wordwrap(bin2hex(implode(file($argv[1]))),2,' ',1);
  • -1 bajt dzięki manassehkatz
  • -5 bajtów dzięki Blackhole

Wypróbuj online!


1
Powinien być w stanie upuścić końcowy ?>i zapisać 2 bajty, a jeśli to nie zadziała, zastąp ?>średnikiem i zapisz 1 bajt.
manassehkatz-Moving 2 Codidact

2
Użyj implode(file($x))zamiast file_get_contents($x)(-4 bajtów).
Blackhole

2
I wordwrap(), 1jako jako ostatni parametr, jest o jeden bajt krótszy niż chunk_split().
Blackhole


4

APL (Dyalog Unicode) , 16 bajtów

Anonimowa ukryta funkcja prefiksu. Zwraca (i domyślnie drukuje, jeśli wartość nie zostanie w inny sposób zużyta), macierz dwurzędową z 4 górnymi bitami przedstawionymi jako liczba dziesiętna 0–15 w górnym rzędzie i 4 dolne bity podobnie reprezentowane w dolnym rzędzie. Oznacza to, że macierz ma tyle kolumn, ile plik ma bajtów.

16 1683 ¯1∘⎕MAP

Wypróbuj online!

⎕MAP zamapuj nazwę pliku argumentu na tablicę
 z parametrami:
¯1 cała długość pliku
83 odczytywana jako 8-bitowe liczby całkowite

16 16⊤ konwertuj (anty-bazowy) na szesnastkowy 2-położeniowy


1
@ facepalm42 To bardzo dużo w systemie szesnastkowym. Np. H72, czyli 4 × 16¹ + 8 × 16⁰ lub [4,8] ₁₆. W związku z tym w pierwszej kolumnie w przykładzie odczytuje [4,8].
Adám

Och, zupełnie zapomniałem! Przepraszam.
facepalm42

4

Python 3, 59 bajtów

-11 bajtów dzięki przeważnie nieszkodliwemu!

-8 bajtów dzięki Jamesowi K Polkowi!

-24 bajty dzięki Blue!

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

Wypróbuj online!

To jest całkiem proste; otwiera nazwę pliku podaną jako dane wejściowe na STDIN, czyta ją, konwertuje każdy znak na jego wartość ASCII, konwertuje każdą liczbę na szesnastkową, oddziela tę, "0x"która poprzedza wartości szesnastkowe w Pythonie, w razie potrzeby uzupełnia wartość zerową, a następnie łączy wartości wraz ze spacjami.


Można zaoszczędzić kilka bajtów '%02X'%ord(i)zamiast przekrawać dane wyjściowe heksadecymalne
większości nieszkodliwe

@MostlyHarmless Done! -11 bajtów. Dzięki!
mprogrammer

co powiesz na „% 02X” zamiast „% 02x” i pozbądź się .upper()
Prezydent James Moveon Polk

Możesz zapisać bajty z import sys, używając raw_input()zamiast tego nazwy pliku; Reguły zezwalają na monitowanie użytkownika.
Blue

@Blue Thanks! Jest jeszcze krótszy w Pythonie 3, gdzie możesz to zrobićinput()
mprogrammer

3

Bash ,  33  23 bajty

... z dużą pomocą:
-3 dzięki manatwork
-4 dzięki spuck
-3 dzięki Nahuel Fouilleul

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

Wypróbuj online!

Należy zauważyć, że związek TIO powyżej wejścia zastosowań - możemy zapisywać pliki lokalnie, więc tym pokazuje, że pracuje jako programu biorąc ścieżkę do pliku.


Niewielkie redukcje: xxd -u -p $1|fold -2|tr \\n \ .
manatwork

Dzięki, masz pomysł, jak zdobyć \ni \ pracować w „tej” wersji linku? EDYCJA: Dodałem kolejną postać ucieczki.
Jonathan Allan

Jeśli dobrze cię rozumiem, po prostu chcesz zmienić podwójne cudzysłowy na pojedyncze: Wypróbuj online!
manatwork

Wspaniale! Dziękuję!
Jonathan Allan

xxd -c1 -p -u $1|tr \\n \
spuck

3

Kotlin , 130 127 104 93 92 bajty

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

Wypróbuj online!

Edycja: -11 bajtów dzięki @ChrisParton

Edycja: działające TIO

Edycja: -1 bajt dzięki @KevinCruijssen


1
Mógłbyś rowu import i odniesienie Filejako java.io.Filezamiast?
Chris Parton,

@ChrisParton masz rację, dzięki!
Quinn,

Oto działające TIO. Możesz użyć ./.input.tiojako argumentu ścieżki do pliku, a on użyje STDIN jako zawartości pliku. :)
Kevin Cruijssen,

@KevinCruijssen dzięki! właśnie zaktualizowana odpowiedź
Quinn,

1
Nie znam Kotlina, ale TIO nadal działa, jeśli usunę miejsce w a:Array, więc myślę, że możesz zapisać bajt.
Kevin Cruijssen

2

Dart , 140 134 bajtów

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

Wypróbuj online!

-6 bajtów, ponieważ zapomniałem zredukować nazwy zmiennych


+1 za rzutkę. Taki niedoceniany język.
vasilescur

Trudno grać w golfa, ponieważ jest to w zasadzie JS bez bardzo
luźnego

2

Haskell, 145 143 bajtów

import System.Environment
import Text.Printf
import Data.ByteString
main=getArgs>>=Data.ByteString.readFile.(!!0)>>=mapM_(printf"%02X ").unpack

1
Troszkę krótszy: import Data.ByteStringplus main=getArgs>>=Data.ByteString.readFile.(!!0)>>=mapM_(printf"%02X ").unpack.
nimi

2

Rdza, 141 bajtów (wersja przekazana)

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

Rdza, 151 bajtów (wersja oryginalna)

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!()}

-10 bajtów: TIO
Herman L

2

bash + Stax, 6 + 4 + 1 = 11 bajtów

W tym momencie jest to kompletna jednostka teoretyczna. Nie możesz tego uruchomić. Jeśli wszystko działa zgodnie ze specyfikacją, działałoby, ale jeszcze nie wszystko.

Skrypt bash jest

]<$1

i program stax musi zostać skompilowany i zapisany w] is

╛↕ßú┼_

Ustaw swój zestaw znaków na ISO 8859-1 (Windows-1252 nie będzie tu działał) i idź

Rozpakowano i wyjaśniono

_          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

2

Emojicode , 186 162 bajtów

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

Wypróbuj online tutaj.

Nie golfowany:

📦 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
    🍪
    ❗️❗️
  🍉
🍉

2

Perl 6 , 45 bajtów

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

Wypróbuj online!

  • @*ARGS[0] jest pierwszym argumentem wiersza poleceń.
  • .IOzamienia tę (przypuszczalnie) nazwę pliku w IO::Pathobiekt.
  • .slurp(:bin)wczytuje cały plik do Bufbufora bajtów. (Bez :binzawartości plik byłby zwracany jako ciąg Unicode.)
  • .list zwraca listę wartości bajtów z bufora.
  • .fmt('%02X')to Listmetoda, która formatuje elementy listy przy użyciu podanego ciągu formatu, a następnie łączy je spacjami. (Wygodna!)
  • .say wypisuje ten ciąg.

Na podstawie odpowiedzi w języku Python łącze TIO jest w rzeczywistości całkiem możliwe.
Draco18s nie ufa już SE

Niektóre Zmiana układu można usunąć .listdo 41 bajtów
Jo królowi



1

Rakieta, 144 bajty

To przesłanie generuje końcowe miejsce i brak końcowego nowego wiersza. Daj mi znać, jeśli uważa się to za lukę :)

(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")))))

Oczyszczone

(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")))))

1

Dalej (gforth) , 71 bajtów

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

Wypróbuj online!

TIO znajduje się 3 argw ostatnim wierszu, ponieważ TIO przekazuje „-e pa” do parsera wiersza poleceń przed przekazaniem kodu

Objaśnienie kodu

: 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

1

JavaScript, 155 bajtów

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

1

VBScript, 143 bajty

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

1

Wolfram Language (Mathematica) , 94 89 bajtów

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

Wypróbuj online!

Kod jest dość zrozumiały ze względu na długie nazwy poleceń. Należy go czytać głównie od prawej do lewej:

$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

1

Gema , 45 znaków

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

Przykładowy przebieg:

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 

Wypróbuj online!


1

Pyth , 12 bajtów

jdcr1.Hjb'w2

Wypróbuj online!

Pobiera dane wejściowe jako monit użytkownika (nie ma możliwości uzyskania dostępu do argumentów wiersza polecenia 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()

(*) Nie jestem w 100% pewien, czy jest to zamierzone, ale jedna podstawowa 256 cyfra (jak w, jeden znak) zawsze zamieni się na dokładnie 2 cyfry szesnastkowe, eliminując potrzebę wypełniania zerami.


1

Node.js, 118 bajtów

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

Jak wygląda wynik: wprowadź opis zdjęcia tutaj

Btw zawartość test.txtw przykładzie jest następująca:

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

(Dlaczego, u licha, potrzeba dużych liter. Musiałem dodać konwersję z toUpperCase(), a to kosztowało 13 bajtów.)


0

C # .NET Framework 4.7.2 - 235 213 203 191 175 140 bajtów

Wypróbuj online!

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") + " ");
            }
        }
    }
}

1
Myślę, że poniższe zapisują niektóre bajty (myślę, że teraz 181): użycie System.IO; klasa P {static void Main (string [] a) {if (a.Length> 0 && File.Exists (a [0]) ) {foreach (zmienna b File.ReadAllBytes (A [0])) {System.Console.Write ($ "{b.ToString (" x2" )} „);}}}}
PmanAce

@PmanAce Jeśli usuniesz trochę białych znaków, liczba spadnie do 175.
facepalm42

0

05AB1E , 18 bajtów

IvyÇh2j' 0.:' Jvy?

Wypróbuj online!

Wyjaśnienie:

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?
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.