최단 16 진수 덤핑 프로그램


13

도전

파일의 각 바이트를 표시하는 콘솔 프로그램을 작성하십시오.


승리

이것은 이므로 가장 적은 바이트가 이깁니다.


규칙

  • 프로그램 은 콘솔 응용 프로그램 이어야합니다. 즉, 일종의 명령 줄 인터프리터에서 실행됩니다.
  • 모든 바이트는 공백으로 구분 된 대문자 16 진수 여야하며 2 자리 여야합니다. (숫자가 1이면 숫자 0을 입력)
  • 하드 코딩되지 않은 IO 또는 대체 파일을 사용하여 파일 을 읽어야합니다 .
  • 파일 경로는 명령 행 인수 또는 STDIN과 같은 사용자 프롬프트 로 지정해야합니다 .
  • 어떤 허점이 만족하지 ;

test.txt (LF로 끝남)

Hello World!

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

16
@ facepalm42 페이스 팜을 피하려면 샌드 박스 를 사용 하여 향후 과제를 게시하기 전에 디자인 하는 것이 좋습니다 .
Adám

2
화면에 맞지 않으면 모든 바이트 값을 한 번에 표시하는 방법은 무엇입니까? 스크롤은 "한 번에"명확하지 않습니다. 또한 값을 반환하는 (함수)의 문제점은 무엇입니까?
Adám

7
@ facepalm42 챌린지를 게시 한 후 사양을 너무 오랫동안 변경하지 마십시오. 원래 게시물은 16 진 숫자의 정확한 형식을 지정하지 않았으므로 응답자에게 맡겼습니다. 최근 수정 사항으로 기존 답변이 무효화되었습니다.
Adám

11
명령 줄 인수 나 사용자 프롬프트 만 허용하는 특별한 이유가 있습니까? 예를 들어 파일 이름을 함수 인수로 사용하면 무엇이 문제입니까?
Adám

3
입력hello.txt 으로 간단한 텍스트 파일 이 있고 예상 출력이 무엇인지 도움이 될 것입니다. 예를 들어, 단어 에 줄 바꿈이 있는 단어 가 포함되어 있으면 어떻게 출력에 표시됩니까? 16 비트, 32 비트 또는 64 비트 워드로 바이트를 그룹화하고 있습니까? 아니면 각 바이트가 두 자리 16 진수로 표시됩니까? 각 바이트 뒤에 16 진수로 또는 각 x 비트 단어 뒤에 공백이 허용됩니까? 당신은 필요하십니까 각 바이트에 대한 사전 수정? hello.txthello0x
Shaun Bebbers

답변:



6

루비 , 26 바이트

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

온라인으로 사용해보십시오!


프로그램 경로로 파일 경로가 지정된 파일의 내용을 읽습니까? TIO를 기반으로하면 STDIN에서 읽은 것 같지만 Ruby가 잘못되었다는 것을 잘 알지 못합니다.
Kevin Cruijssen

1
@KevinCruijssen 예, 파일 경로를 프로그램 인수로 사용합니다. 인수가 없으면 $<대신 STDIN에서 읽기로 전환합니다.
밸류 잉크


6

자바 11, 156154 바이트

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 덕분 -2 바이트 .

./.input.tio주어진 입력을 파일 내용으로 갖는 인수 file-path 를 사용하여 온라인 으로 시도하십시오 .

설명:

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

interface대신에 사용하는 이유는 무엇입니까 class?
JakeDot

4
@JakeDot main은 공용이어야하며 인터페이스 메소드는 항상 공용이며 + interface보다 짧습니다 . classpublic
Grimmy

3
Java 11에서는 다음 Path.of대신 사용할 수 있습니다Paths.get
Holger

1
@Holger 감사합니다! :)
Kevin Cruijssen

2
Java 9 이후 @Grimy, 인터페이스 메소드가 항상 그런 것은 아니지만 public, public명시 적으로 선언되지 않는 한 인터페이스 메소드는 항상 그렇지 않다 private.
Holger

6

PHP , 60 59 54 바이트

<?=wordwrap(bin2hex(implode(file($argv[1]))),2,' ',1);
  • manassehkatz 덕분에 -1 바이트
  • 블랙홀 덕분에 -5 바이트

온라인으로 사용해보십시오!


1
후행을 삭제하고 ?>2 바이트를 저장할 수 있거나 작동하지 않으면 ?>세미콜론으로 바꾸고 1 바이트를 저장하십시오.
manassehkatz-Moving 2 Codidact

2
(-4 바이트) implode(file($x))대신 사용하십시오 file_get_contents($x).
블랙홀

2
그리고 wordwrap(),와 1마지막 매개 변수로, 하나 이상의 바이트 짧다 chunk_split().
블랙홀


4

APL (Dyalog Unicode) , 16 바이트

익명의 암묵적 접두사 기능. 맨 위 행의 상위 4 비트는 0-15 사이의 10 진수로 표시되고 맨 아래 행과 유사하게 하단 4 비트는 상위 4 비트가있는 2 행 매트릭스를 반환합니다 (값이 다른 방식으로 소비되는 경우 암시 적으로 인쇄). 즉, 행렬에는 파일의 바이트 수만큼 열이 있습니다.

16 1683 ¯1∘⎕MAP

온라인으로 사용해보십시오!

⎕MAP 인수 filename을
 매개 변수 가있는 배열에 맵핑하십시오. 파일
¯1 의 전체 길이는
83 8 비트 정수로 읽습니다.

16 16⊤ 16 진법으로 2 진법으로 변환


1
@ facepalm42 16 진수입니다. 예를 들어 H72는 4x16¹ + 8x16⁰ 또는 [4,8] ₁₆입니다. 따라서 예제의 첫 번째 열은 다음과 같습니다 [4,8].
Adám

아, 나는 완전히 잊었다! 죄송합니다.
facepalm42

4

파이썬 3, 59 바이트

무해한 덕분에 -11 바이트!

James K Polk 덕분에 -8 바이트!

Blue 덕분에 -24 바이트!

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

온라인으로 사용해보십시오!

이것은 매우 간단합니다. STDIN에서 입력으로 주어진 파일 이름을 열고, 읽고, 각 문자를 ASCII 값으로 변환하고, 각 숫자를 16 진수로 변환하고, "0x"파이썬에서 16 진 값 앞에 오는 것을 제거하고 , 필요한 경우 값을 0으로 채운 다음 값을 조인합니다. 공백과 함께.


'%02X'%ord(i)16 진수의 출력을 슬라이스하는 대신 몇 바이트를 절약 할 수 있습니다
대부분 무해한

트윗 담아 가기 -11 바이트 감사!
mprogrammer

어떻게 '% 02X'대신에 대한 '% 02x', 그리고 제거.upper()
대통령 제임스 Moveon 포크

대신 파일 이름 import sys으로 사용하여 바이트를 저장할 수 있습니다 raw_input(). 규칙은 사용자 프롬프트를 허용합니다.
Blue

@ 블루 감사합니다! 그리고 파이썬 3에서는 훨씬 더 짧습니다input()
mprogrammer

3

배쉬 ,  33  23 바이트

... 많은 도움과 :
-3 감사 manatwork
-4 감사합니다 spuck
-3 덕분에 나우 Fouilleul을

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

온라인으로 사용해보십시오!

우리가 로컬 파일을 쓸 수 있습니다 - 사용하는 입력 위의 TIO 링크가 있습니다 프로그램은 파일 경로를 복용하는 프로그램으로 작업.


사소한 감소 : xxd -u -p $1|fold -2|tr \\n \ .
manatwork

덕분에, 어떤 아이디어는 어떻게 얻을 \n\ '은행'링크 버전에 대한 작업은? 편집 : 다른 이스케이프 문자를 추가했습니다.
Jonathan Allan

올바르게 이해하면 큰 따옴표에서 작은 따옴표로 변경하고 싶습니다. 온라인으로 시도하십시오!
manatwork

좋아 고마워!
Jonathan Allan

xxd -c1 -p -u $1|tr \\n \
sp 다

3

코 틀린 , 130 (127) 104 93 92 바이트

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

온라인으로 사용해보십시오!

편집 : @ChrisParton 덕분에 -11 바이트

편집 : Working TIO

편집 : @KevinCruijssen 덕분에 -1 바이트


1
당신은 가져 오기 및 참조 도랑 수 Filejava.io.File을 대신?
Chris Parton

@ChrisParton 그렇습니다. 감사합니다!
Quinn

작동하는 TIO입니다. 당신이 사용할 수있는 ./.input.tio파일 경로 인수로, 그리고 파일 내용으로 STDIN을 사용합니다. :)
Kevin Cruijssen

@KevinCruijssen 감사합니다! 방금 업데이트 된 답변
Quinn

1
Kotlin을 모르지만에서 공간을 제거하면 TIO가 계속 작동 a:Array하므로 바이트를 절약 할 수 있다고 생각합니다.
Kevin Cruijssen

2

다트 , 140 134 바이트

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

온라인으로 사용해보십시오!

변수 이름을 줄이는 것을 잊었 기 때문에 -6 바이트


다트 +1 그런 과소 평가 된 언어.
vasilescur

골프는 어렵다. 왜냐하면 기본적으로 매우 느슨한 타입 시스템이없는 JS이기 때문이다
Elcan

2

하스켈 145 143 바이트

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

1
조금 더 짧습니다 : import Data.ByteStringplus main=getArgs>>=Data.ByteString.readFile.(!!0)>>=mapM_(printf"%02X ").unpack.
nimi

2

녹, 141 바이트 (기여 버전)

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

녹, 151 바이트 (원본 버전)

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 바이트 : TIO
허먼 L

2

bash + Stax, 6 + 4 + 1 = 11 바이트

이 시점에서 이것은 완전한 이론 기술입니다. 실제로 이것을 실행할 수 없습니다. 모든 것이 사양에 따라 작동하면 작동하지만 아직 모든 것이 작동하지는 않습니다.

bash 스크립트는

]<$1

stax 프로그램을 컴파일하여 저장해야합니다]

╛↕ßú┼_

문자 세트를 ISO 8859-1로 설정하고 (Windows-1252는 작동하지 않음)

포장 풀고 설명

_          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 바이트

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

여기에서 온라인으로 사용해보십시오 .

언 골프 드 :

📦 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

펄 6 , 45 바이트

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

온라인으로 사용해보십시오!

  • @*ARGS[0] 첫 번째 명령 줄 인수입니다.
  • .IO(추정 된) 파일 이름을 IO::Path객체 로 바꿉니다 .
  • .slurp(:bin)전체 파일을 Buf바이트 버퍼 로 읽습니다 . :bin파일이 없으면 파일 내용이 유니 코드 문자열로 반환됩니다.
  • .list 버퍼에서 바이트 값 목록을 리턴합니다.
  • .fmt('%02X')A는 List소정의 형식 문자열을 이용하여리스트의 요소를 포맷 방법은 다음 공백으로 결합한다. (편리한!)
  • .say 해당 문자열을 인쇄합니다.

파이썬 답변을 바탕으로 TIO 링크 는 실제로 가능합니다.
Draco18s는 더 이상

일부 재배치는 제거 할 수 있습니다 .list위한 41 바이트
조 왕에게



1

라켓, 144 바이트

이 제출은 후행 공백을 출력하고 후행 줄 바꿈을 출력하지 않습니다. 이것이 허점으로 간주되는지 알려주십시오. :)

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

정리

(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

넷째 (gforth) , 71 바이트

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

온라인으로 사용해보십시오!

TIO는 3 arg코드를 전달하기 전에 "-e bye"를 명령 행 구문 분석기에 전달하기 때문에 마지막 행에 있습니다.

코드 설명

: 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

자바 스크립트, 155 바이트

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 바이트

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 바이트

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

온라인으로 사용해보십시오!

명령 이름이 길기 때문에 코드는 매우 자명하다. 주로 오른쪽에서 왼쪽으로 읽어야합니다.

$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

Pyth , 12 바이트

jdcr1.Hjb'w2

온라인으로 사용해보십시오!

입력을 사용자 프롬프트로 취합니다 (명령 행 인수 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()

(*) 이것이 의도 된 것인지 100 % 확신 할 수는 없지만 기본 256 자리 (한 문자와 같이) 하나는 항상 정확히 2 개의 16 진수로 변환되어 0으로 채울 필요가 없습니다.


1

Node.js, 118 바이트

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

결과는 다음과 같습니다. 여기에 이미지 설명을 입력하십시오

test.txt예제 의 내용은 다음과 같습니다.

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

(대지에서 대문자 출력이 필요한 이유는입니다.로 변환을 추가해야했고 toUpperCase()비용은 13 바이트입니다.)


0

C # .NET 프레임 워크 4.7.2 - 235 213 203 191 175 140 바이트

온라인으로 사용해보십시오!

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
다음은 약간의 바이트를 절약 할 것이라고 생각합니다 (현재 생각하는 181) : using System.IO; class P {static void Main (string [] a) {if (a.Length> 0 && File.Exists (a [0]) ) {foreach (File.ReadAllBytes (a [0])의 var b) {System.Console.Write ($ "{b.ToString ("X2 ")}");}}}}
PmanAce

@PmanAce 공백을 제거하면 175로 줄어 듭니다.
facepalm42

0

05AB1E , 18 바이트

IvyÇh2j' 0.:' Jvy?

온라인으로 사용해보십시오!

설명:

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?
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.