En kısa altıgen damping programı


13

Meydan okuma

Bir dosyanın her baytını görüntülemek için bir konsol programı oluşturun.


Kazanan

Bu , en az bayt kazanır.


kurallar

  • Program bir konsol uygulaması olmalıdır , yani bir tür komut satırı yorumlayıcısından çalıştırılacaktır;
  • Her bayt bir boşlukla ayrılmış büyük harf onaltılık olmalı ve 2 basamak olmalıdır; (1 basamak varsa 0 sayısını önüne koyun)
  • Dosya IO veya alternatif kullanılarak okunmalı ve sabit kodlanmış olmamalıdır;
  • Dosya yolu, komut satırı bağımsız değişkeni veya kullanıcı istemi (STDIN gibi) olarak belirtilmelidir ;
  • Hiçbir boşluklar lütfen ;

Misal

test.txt (LF ile biter)

Hello World!

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

16
@ facepalm42 önlemek facepalms için, şiddetle kullanmanızı tavsiye Sandbox bunları yayınlamadan önce gelecek zorlukları tasarım yardımcı olur.
Adám

2
Ekrana sığmıyorsa, tüm bayt değerlerini bir defada görüntülemek nasıl mümkün olur? Açıkça kaydırma "bir kerede" değildir. Ayrıca, (bir işlev) sadece değerleri döndürmekle ilgili sorun nedir?
Adám

7
@ facepalm42 Lütfen yarışmayı gönderdikten sonra spesifikasyonu çok uzun süre değiştirmeyin. Orijinal gönderi onaltılık sayıların tam biçimini belirtmedi ve yanıtlayıcılara bıraktı. Son düzenlemeniz mevcut cevabımı geçersiz kıldı!
Adám

11
Yalnızca komut satırı bağımsız değişkenine veya kullanıcı bilgi istemine izin vermenin belirli bir nedeni var mı? Örneğin dosya adını bir işlev argümanı olarak almakla ilgili sorun nedir?
Adám

3
Girişhello.txt olarak örnek olarak basit bir metin dosyanız varsa ve beklenen çıktının ne olması yararlı olacaktır. Örneğin, içerdiği satır sonu olan kelimeyi içeriyorsa , bu çıktıda nasıl ifade edilir? Baytları 16 bit, 32 bit veya 64 bit sözcüklerle mi gruplandırıyorsunuz? Yoksa her bayt iki haneli onaltılık olarak mı ifade edilir? Boşluklar her bayttan sonra onaltılı olarak mı yoksa her bir x-bit kelimesinden sonra mı kabul edilebilir? Her bayt için bir ön düzeltmeye mi ihtiyacınız var ? hello.txthello0x
Shaun Bebbers

Yanıtlar:



6

Ruby , 26 bayt

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

Çevrimiçi deneyin!


Bu, dosya yolu verilen bir dosyanın içeriğini program argümanı olarak okuyor mu? TIO'ya dayanarak sadece STDIN'den okuyor gibi görünüyor, ancak Ruby'nin yanlış olduğunu söyleyecek kadar iyi bilmiyorum.
Kevin Cruijssen

1
@KevinCruijssen Evet, dosya yollarını program argümanı olarak alır. $<Bağımsız değişken yoksa, bunun yerine STDIN'den okumaya geçer.
Değer Mürekkebi


6

Java 11, 156156 bayt

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

@Holger sayesinde -2 bayt .

./.input.tioDosya içeriği olarak belirli bir girdiye sahip olacak argüman dosya yolu olarak kullanarak çevrimiçi deneyin .

Açıklama:

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

Bunun interfaceyerine kullanmanın ardındaki mantık nedir class?
JakeDot

4
@JakeDot main genel olması gerekir, arayüz yöntemleri her zaman herkese açıktır, + ' interfacedan daha kısadır . classpublic
Grimmy

3
Java 11 ile, kullanabilirsiniz Path.ofyerinePaths.get
Holger

1
@Holger Teşekkürler! :)
Kevin Cruijssen

2
@Grimy Java 9'dan beri, arabirim yöntemleri her zaman değildir public, ancak publicaçıkça bildirilmedikçe private.
Holger

6

PHP , 60 59 54 bayt

<?=wordwrap(bin2hex(implode(file($argv[1]))),2,' ',1);
  • -1 bayt sayesinde manassehkatz
  • Blackhole sayesinde -5 bayt

Çevrimiçi deneyin!


1
Sondaki noktayı bırakabilmeli ?>ve 2 bayt kaydedebilmeli veya işe yaramazsa ?>noktalı virgül ile değiştirmeli ve 1 bayt kaydedilmelidir.
manassehkatz-Moving 2 Codidact

2
(-4 bayt) implode(file($x))yerine kullanın file_get_contents($x).
Kara delik

2
Ve wordwrap(), ile 1son parametre olarak, birden bayt kısadır chunk_split().
Kara delik


4

APL (Dyalog Unicode) , 16 bayt

Anonim zımni önek fonksiyonu. En üstteki 4 bit, üst satırda 0–15 ondalık sayı olarak ve alt 4 bit, alt satırda benzer şekilde temsil edilen iki sıralı bir matris döndürür (ve örtük olarak yazdırır). Yani, matriste dosyanın bayt sayısı kadar sütun vardır.

16 1683 ¯1∘⎕MAP

Çevrimiçi deneyin!

⎕MAP bağımsız değişken dosya adını
 parametreleri içeren bir diziyle eşleme :
¯1 dosyanın tüm uzunluğu
83 8 bit tamsayı olarak okunur

16 16⊤ (anti-base) 2 konumlu onaltılık biçime dönüştür


1
@ facepalm42 Çok fazla onaltılıdır. Örneğin H72, 4 × 16¹ + 8 × 16⁰ veya [4,8] 8'dir. Dolayısıyla örnekteki ilk sütun okunur [4,8].
Adám

Oh, tamamen unuttum! Üzgünüm.
facepalm42

4

Python 3, 59 bayt

Çoğunlukla Zararsız sayesinde -11 bayt!

James K Polk sayesinde -8 bayt!

Blue sayesinde -24 bayt!

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

Çevrimiçi deneyin!

Bu oldukça basit; STDIN'de girdi olarak verilen bir dosya adı açar, okur, her karakteri ASCII değerine dönüştürür, her sayıyı onaltılık "0x"biçime dönüştürür , Python'da onaltılı değerlerden önce olanı çıkarır, gerekirse değeri sıfırla doldurur, sonra değerleri birleştirir boşluklarla birlikte.


'%02X'%ord(i)Hex çıktısını dilimlemek yerine birkaç bayt tasarruf edebilir
Çoğunlukla Zararsız

@MostlyHarmless Bitti! -11 bayt. Teşekkürler!
mprogrammer

'% 02x' yerine '% 02X' hakkında bilgi edinin ve kurtulun.upper()
Başkan James Moveon Polk

Bunun yerine baytları dosya adı olarak import syskullanarak kaydedebilirsiniz raw_input(); kuralları kullanıcının sormasına izin verir.
Blue

@Mavi Teşekkürler! Ve sadece yapabileceğiniz Python 3'te daha da kısadırinput()
mprogrammer

3

Bash ,  33  23 bayt

... çok yardımla:
-3 manatwork
sayesinde -4 takılma
sayesinde -3- Nahuel Fouilleul sayesinde

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

Çevrimiçi deneyin!

Biz dosyaları yerel olarak yazabilmek için - kullandığı girdi yukarıda TIO bağlantının söz konusu Not bu gösterileri bir dosya yolu alarak bir program olarak çalışan.


Minör indirim: xxd -u -p $1|fold -2|tr \\n \ .
manatwork

Teşekkürler, 'bu' bağlantı sürümünde \nve \ nasıl çalışacağına dair bir fikir var mı? EDIT: Başka bir kaçış karakteri ekledim.
Jonathan Allan

Sizi doğru anlarsam, çift tırnak işaretlerinden tek tırnak işaretlerine geçmek istiyorsunuz: Çevrimiçi deneyin!
manatwork

Harika. Teşekkürler!
Jonathan Allan

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

3

Kotlin , 130 127 104 93 92 bayt

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

Çevrimiçi deneyin!

Düzenleme: @ChrisParton sayesinde -11 bayt

Düzenleme: Çalışma TIO'su

Düzenleme: @KevinCruijssen sayesinde -1 bayt


1
İçe aktarma ve referansı Filebunun java.io.Fileyerine atabilir misiniz ?
Chris Parton

@ChrisParton haklısın, teşekkürler!
Quinn

İşte çalışan bir TIO. Sen kullanabilirsiniz ./.input.tiodosya yolunu argüman olarak ve dosya içeriği olarak STDIN kullanacaktır. :)
Kevin Cruijssen

@KevinCruijssen teşekkürler! sadece güncellenmiş cevap
Quinn

1
Kotlin'i tanımıyorum, ancak TIO alandaki alanı kaldırırsam hala çalışır a:Array, bu yüzden bir bayt kaydedebilirsiniz.
Kevin Cruijssen

2

Dart , 140 134 bayt

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

Çevrimiçi deneyin!

-6 bayt çünkü değişken isimlerini azaltmayı unuttum


Dart için +1. Bu kadar önemsiz bir dil.
vasilescur

Temelde çok gevşek tip sistemi olmadan JS olduğu için golf zor
Elcan

2

Haskell, 145 143 bayt

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

1
Biraz daha kısa: import Data.ByteStringartı main=getArgs>>=Data.ByteString.readFile.(!!0)>>=mapM_(printf"%02X ").unpack.
nimi

2

Pas, 141 bayt (katkıda bulunan sürüm)

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

Pas, 151 bayt (orijinal versiyon)

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 bayt: TIO
Herman L

2

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

Bu, bu noktada tam bir teori aracıdır. Aslında bunu çalıştıramazsınız. Her şey kendi özelliklerine göre çalışırsa, bu işe yarayacaktır, ancak henüz her şey işe yaramaz.

Bash betiği

]<$1

ve stax programı derlenip kaydedilmeli]

╛↕ßú┼_

Karakter setinizi ISO 8859-1 olarak ayarlayın (Windows-1252 burada çalışmaz) ve gidin

Ambalajsız ve açıklanmış

_          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 bayt

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

Burada çevrimiçi deneyin .

Ungolfed:

📦 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 bayt

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

Çevrimiçi deneyin!

  • @*ARGS[0] ilk komut satırı bağımsız değişkenidir.
  • .IObu (varsayılan) dosya adını bir IO::Pathnesneye dönüştürür .
  • .slurp(:bin)tüm dosyayı bir Buftampon bayt olarak okur . ( :binDosya olmadan Unicode dizesi olarak döndürülür.)
  • .list arabellekten bayt değerlerinin bir listesini döndürür.
  • .fmt('%02X'), Listverilen biçim dizesini kullanarak listenin öğelerini biçimlendiren ve ardından boşluklarla birleştiren bir yöntemdir. (Uygun!)
  • .say dizeyi yazdırır.

Python cevabına dayanarak, bir TIO Bağlantısı aslında oldukça mümkündür.
Draco18s artık SE

Bazı yeniden düzenleme .listiçin 41 bayt
Jo King



1

Raket, 144 bayt

Bu gönderim, sondaki boşluğu çıkarır ve sondaki yeni satır içermez. Bu bir boşluk olarak kabul edilirse bana bildirin :)

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

Temizledik

(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

İleri (gforth) , 71 bayt

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

Çevrimiçi deneyin!

TIO 3 argson satıra sahiptir , çünkü TIO kodu geçmeden önce komut satırı ayrıştırıcısına "-e bye" iletir

Kod Açıklaması

: 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 bayt

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 bayt

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

1

Wolfram Dili (Mathematica) , 94 89 bayt

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

Çevrimiçi deneyin!

Kod, uzun komut adları nedeniyle oldukça açıklayıcıdır. Çoğunlukla sağdan sola okunmalıdır:

$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 karakter

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

Örnek çalışma:

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 

Çevrimiçi deneyin!


1

Pyth , 12 bayt

jdcr1.Hjb'w2

Çevrimiçi deneyin!

Girişi kullanıcı istemi olarak alır (AFAIK komut satırı bağımsız değişkenlerine erişmenin bir yolu yoktur).

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

(*) Bunun amaçlandığından% 100 emin değilim, ancak bir temel 256 basamaklı (bir karakter olduğu gibi), her zaman tam olarak 2 onaltılık basamağa dönüşecek ve sıfırlarla doldurma ihtiyacını ortadan kaldıracaktır.


1

Node.js, 118 bayt

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

Sonuç neye benziyor: resim açıklamasını buraya girin

test.txtÖrnekte yer alan içerik şu şekildedir:

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

(Neden yeryüzünde büyük harf çıktı gerekiyor? Dönüşümü eklemek zorunda kaldım toUpperCase()ve bu 13 bayt.


0

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

Çevrimiçi deneyin!

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
Aşağıdaki bazı bayt kaydeder düşünüyorum (şimdi 181 sanırım): System.IO kullanarak; sınıf P {statik void Main (dize [] a) {if (a.Length> 0 && File.Exists (a [0]) ) {foreach (File.ReadAllBytes (a [0]) içinde var b)) {System.Console.Write ($ "{b.ToString (" X2 ")}");}}}}
PmanAce

@PmanAce Boşluğun bir kısmını kaldırırsanız, 175'e iner.
facepalm42

0

05AB1E , 18 bayt

IvyÇh2j' 0.:' Jvy?

Çevrimiçi deneyin!

Açıklama:

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?
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.