Herausforderung
Erstellen Sie ein Konsolenprogramm, um jedes Byte einer Datei anzuzeigen.
Gewinnen
Da dies Codegolf ist , gewinnen die wenigsten Bytes.
Regeln
- Das Programm muss eine Konsolenanwendung sein , dh, es wird von einer Art Befehlszeileninterpreter ausgeführt.
- Jedes Byte muss hexadezimal in Großbuchstaben und durch ein Leerzeichen getrennt sein und aus zwei Ziffern bestehen. (setze die Zahl 0 davor, wenn es eine Ziffer hat)
- Die Datei muss mit IO oder alternativ gelesen und nicht fest codiert werden.
- Der Dateipfad muss als Befehlszeilenargument oder als Benutzeraufforderung (wie STDIN) angegeben werden .
- Keine Lücken bitte ;
Beispiel
test.txt (endet mit LF)
Hello World!
$ ./hexdump.exe test.txt
48 65 6C 6C 6F 20 57 6F 72 6C 64 21 0A
hello.txt
Textdatei als Beispiel als Eingabe hätten und wie die erwartete Ausgabe aussehen sollte. Wenn beispielsweisehello.txt
das Worthello
mit einem Zeilenumbruch enthalten wäre, wie würde dies in der Ausgabe ausgedrückt werden? Gruppieren Sie die Bytes in 16-Bit-, 32-Bit- oder 64-Bit-Wörtern? Oder wird jedes Byte als zweistelliges Hex ausgedrückt? Sind Leerzeichen nach jedem Byte als Hex oder nach jedem x-Bit-Wort zulässig? Benötigen Sie einen0x
Pre-Fix für jedes Byte?Antworten:
C (gcc) auf * nix,
7371 BytesProbieren Sie es online! Testsuite
-2 Bytes dank Johan du Toit
Das hängt davon
O_RDONLY == 0
ab,int_one == 1
woint int_one; *(char*)&int_one = 1;
.quelle
Ruby , 26 Bytes
Probieren Sie es online!
quelle
$<
stattdessen zum Lesen von STDIN gewechselt.PowerShell ,
45 bis40 ByteProbieren Sie es online!
-5 Bytes dank mazzy
quelle
./.input.tio
. 40 Bytes mit beibehaltenem CRLF.Java 11,
156154 Bytes-2 Bytes dank @Holger .
Probieren Sie es online mit
./.input.tio
als Argument den Dateipfad verwenden, der eine bestimmte Eingabe als Dateiinhalt enthält.Erläuterung:
quelle
interface
anstelle vonclass
?interface
ist kürzer alsclass
+public
.Path.of
anstelle vonPaths.get
public
, aber espublic
sei denn , sie werden explizit deklariertprivate
.PHP ,
605954 BytesProbieren Sie es online!
quelle
?>
und 2 Bytes zu speichern, oder wenn das nicht funktioniert, ersetzen Sie es?>
durch ein Semikolon und speichern Sie 1 Byte.implode(file($x))
anstelle vonfile_get_contents($x)
(-4 Byte).wordwrap()
ist mit1
als letztem Parameter ein Byte kürzer alschunk_split()
.Perl 5 (
-aF//
), 23 BytesTIO
quelle
APL (Dyalog Unicode) , 16 Bytes
Anonyme implizite Präfixfunktion. Gibt eine zweizeilige Matrix zurück (und gibt diese implizit aus, wenn der Wert nicht anderweitig verwendet wird), wobei die oberen 4 Bits in der oberen Zeile als Dezimalzahl 0-15 und die unteren 4 Bits in der unteren Zeile auf ähnliche Weise dargestellt werden. Das heißt, die Matrix enthält so viele Spalten wie die Datei Bytes enthält.
Probieren Sie es online!
⎕MAP
Ordnen Sie das Argument Dateiname einem Array∘
mit Parametern zu:¯1
Die gesamte Länge der Datei wird83
als 8-Bit-Ganzzahl gelesen16 16⊤
Konvertieren (Anti-Base) in 2-stelliges Hexadezimalquelle
H
ist 72, was 4 × 16¹ + 8 × 16⁰ oder [4,8] ₁₆ ist. Daher lautet die erste Spalte im Beispiel[4,8]
.Python 3, 59 Bytes
-11 Bytes dank Mostly Harmless!
-8 Bytes dank James K Polk!
-24 Bytes dank Blue!
Probieren Sie es online!
Das ist ziemlich einfach; Es öffnet einen Dateinamen, der als Eingabe in STDIN angegeben wurde, liest ihn, konvertiert jedes Zeichen in seinen ASCII-Wert, konvertiert jede Zahl in Hex, entfernt die
"0x"
hexadezimalen Werte vor Python, füllt den Wert bei Bedarf mit einer Null auf und fügt die Werte dann zusammen zusammen mit Leerzeichen.quelle
'%02X'%ord(i)
anstatt die Ausgabe von hex.upper()
import sys
indem Sie stattdessenraw_input()
als Dateinamen verwenden. Regeln ermöglichen Benutzeraufforderungen.input()
Bash ,
3323 Bytes... mit viel Hilfe:
-3 dank Manatwork
-4 dank Spuck
-3 dank Nahuel FOUILLEUL
Probieren Sie es online!
Beachten Sie, dass der obige TIO-Link Eingaben verwendet - wir können Dateien lokal schreiben, dies zeigt also, dass es als Programm arbeitet, das einen Dateipfad verwendet.
quelle
xxd -u -p $1|fold -2|tr \\n \
.\n
und\
in der 'this'-Link-Version zum Laufen bringt? EDIT: Ich habe ein weiteres Escape-Zeichen hinzugefügt.xxd -c1 -p -u $1|tr \\n \
Kotlin,
1301271049392 bytesTry it online!
Edit: -11 bytes thanks to @ChrisParton
Edit: Working TIO
Edit: -1 byte thanks to @KevinCruijssen
quelle
File
asjava.io.File
instead?./.input.tio
as file-path argument, and it will use the STDIN as file-content. :)a:Array
, so I think you can save a byte.Dart,
140134 bytesTry it online!
-6 bytes because I forgot to reduce variable names
quelle
Haskell,
145143 bytesquelle
import Data.ByteString
plusmain=getArgs>>=Data.ByteString.readFile.(!!0)>>=mapM_(printf"%02X ").unpack
.Rust, 141 bytes (contributed version)
Rust, 151 bytes (original version)
quelle
Bash + Stax, 6 + 4 + 1 = 11 Bytes
Dies ist zu diesem Zeitpunkt ein vollständiges theoretisches Handwerk. Sie können das nicht ausführen. Wenn alles gemäß seiner Spezifikation funktioniert, würde dies funktionieren, aber noch nicht alles.
Das Bash-Skript lautet
und das stax-programm muss kompiliert und gespeichert werden]
Stellen Sie Ihren Zeichensatz auf ISO 8859-1 ein (Windows-1252 funktioniert hier nicht) und fahren Sie fort
Ausgepackt und erklärt
quelle
Emojicode ,
186162 BytesProbieren Sie es online aus hier aus.
Ungolfed:
quelle
Perl 6 , 45 Bytes
Probieren Sie es online!
@*ARGS[0]
ist das erste Befehlszeilenargument..IO
verwandelt diesen (vermuteten) Dateinamen in einIO::Path
Objekt..slurp(:bin)
Liest die gesamte Datei in einenBuf
Byte-Puffer. (Ohne die:bin
Datei würde der Inhalt als Unicode-String zurückgegeben.).list
gibt eine Liste der Bytewerte aus dem Puffer zurück..fmt('%02X')
ist eineList
Methode, mit der die Elemente der Liste mit der angegebenen Formatzeichenfolge formatiert und anschließend mit Leerzeichen verbunden werden. (Praktisch!).say
druckt diese Zeichenfolge.quelle
.list
für 41 BytesD 98 Bytes
Probieren Sie es online!
quelle
Python 3, 75 Bytes
Meistens eine Kopie von Maxwells Python 2-Antwort.
quelle
sys.argv[1]
. mitsys.argv[0]
diesem Skript funktioniert eher wie ein Quine ;-)Schläger, 144 Bytes
Diese Übermittlung gibt ein Leerzeichen und keine Zeilenumbrüche aus. Lass es mich wissen, wenn dies eine Lücke ist :)
Aufgeräumt
quelle
Viertens (gviertens) , 71 Bytes
Probieren Sie es online!
TIO hat
3 arg
in der letzten Zeile, weil TIO "-e bye" an den Kommandozeilen-Parser übergibt, bevor der Code übergeben wirdCode Erklärung
quelle
Javascript, 155 Bytes
quelle
VBScript, 143 Bytes
quelle
Wolfram Language (Mathematica) ,
9489 BytesProbieren Sie es online!
Der Code ist aufgrund der langen Befehlsnamen selbsterklärend. Es sollte meistens von rechts nach links gelesen werden:
quelle
Gema , 45 Zeichen
Probelauf:
Probieren Sie es online!
quelle
Pyth , 12 Bytes
Probieren Sie es online!
Nimmt Eingaben als Benutzeraufforderung entgegen (kein Zugriff auf Befehlszeilenargumente AFAIK).
(*) Ich bin mir nicht zu 100% sicher, ob dies beabsichtigt ist, aber eine 256-stellige Basis (wie in einem Zeichen) wird immer in genau 2 Hexadezimalziffern umgewandelt, sodass keine Nullen aufgefüllt werden müssen.
quelle
Node.js, 118 Bytes
Wie das Ergebnis aussieht:
Übrigens ist der Inhalt des
test.txt
Beispiels wie folgt:quelle
C # .NET Framework 4.7.2 -
235213203191175140 BytesProbieren Sie es online!
quelle
05AB1E , 18 Bytes
Probieren Sie es online!
Erläuterung:
quelle