Найкоротша програма шекспінгу


13

Виклик

Створіть консольну програму для відображення кожного байту файлу.


Перемога

Оскільки це , виграє найменше байтів.


Правила

  • Програма повинна бути консольним додатком , тобто вона буде запускатися з якогось інтерпретатора командного рядка;
  • Кожен байт повинен бути шістнадцятковим, розділеним пробілом, і він повинен бути двома цифрами; (перед цим поставте число 0, якщо воно має 1 цифру)
  • Файл повинен читатися за допомогою 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 Щоб уникнути facepalms, я настійно рекомендую використовувати Sandbox, щоб допомогти вам створити майбутні проблеми, перш ніж публікувати їх.
Адам

2
Як можливо відобразити всі значення байтів одночасно, якщо вони не помістяться на екрані? Прокрутка чітко не "відразу". Крім того, що не так (функція) просто повертає значення?
Adám

7
@ facepalm42 Будь ласка, не змінюйте специфікацію так довго після публікації виклику. У початковому дописі не було визначено точного формату шістнадцяткових чисел, залишаючи його відповіддю. Ваша остання редакція скасувала мою існуючу відповідь!
Адам

11
Чи є певна причина, що ви дозволяєте лише аргумент командного рядка або запит користувача? Що не так, наприклад, прийняття імені файлу як аргументу функції?
Адам

3
Було б корисно, якби у вас був простий hello.txtтекстовий файл в якості прикладу в якості вхідного даних і очікуваний результат. Наприклад, якщо hello.txtміститься просто слово helloз розривом рядка, як це виражатиметься у висновку? Ви групуєте байти в 16-бітні, 32-бітні або 64-бітні слова? Або кожен байт виражається як двозначний шестигранник? Чи допустимі пробіли після кожного байта як шістнадцяткові або після кожного x-бітового слова? Вам потрібен 0xпопередній виправлення для кожного байта?
Shaun Bebbers

Відповіді:



6

Рубін , 26 байт

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

Спробуйте в Інтернеті!


Чи читає це вміст файлу із заданим файловим шляхом як аргумент програми? На основі TIO, здається, він просто читає зі STDIN, але я не знаю Рубі досить добре, щоб сказати, що це неправильно.
Kevin Cruijssen

1
@KevinCruijssen Так, шлях файлу (файлів) використовується як аргумент програми. Якщо аргументів немає, $<замість цього переключається на зчитування з STDIN.
Значення чорнила


6

Java 11, 156 154 байт

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 байти завдяки @Holger .

Спробуйте його в Інтернеті , використовуючи ./.input.tioяк аргумент-файл-шлях, який буде мати даний вхід як вміст файлу.

Пояснення:

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коротші за class+ public.
Grimmy

3
З Java 11 ви можете використовувати Path.ofзамістьPaths.get
Holger

1
@Holger Дякую! :)
Кевін Кройсейсен

2
@Grimy з Java 9, методи інтерфейсу не завжди public, але вони є, publicякщо прямо не заявлено private.
Холгер

6

PHP , 60 59 54 байт

<?=wordwrap(bin2hex(implode(file($argv[1]))),2,' ',1);
  • -1 байт завдяки manassehkatz
  • -5 байт завдяки Blackhole

Спробуйте в Інтернеті!


1
Потрібно мати можливість скинути пробіл ?>і зберегти 2 байти, або якщо це не працює, замініть ?>крапкою з комою та збережіть 1 байт.
manassehkatz-Moving 2 Кодидакт

2
Використовуйте implode(file($x))замість file_get_contents($x)(-4 байти).
Blackhole

2
І wordwrap(), 1як останній параметр, на один байт коротший, ніж chunk_split().
Blackhole


4

APL (Dyalog Unicode) , 16 байт

Функція анонімного мовчазного префікса. Повертає (і неявно друкує, якщо значення не використовується іншим чином) дворядну матрицю з чотирма верхніми 4 бітами, представленими у вигляді десяткового числа 0–15 у верхньому рядку, а нижній 4 біт аналогічно представлений у нижньому рядку. Тобто в матриці є стільки стовпців, скільки у файлі байтів.

16 1683 ¯1∘⎕MAP

Спробуйте в Інтернеті!

⎕MAP зіставити ім'я файлу аргументу в масив
 з параметрами:
¯1 вся довжина файлу
83 читається як 8-бітні цілі числа

16 16⊤ перетворити (антиосновну) у 2-х позиційну шістнадцяткову


1
@ facepalm42 Це дуже багато у шістнадцятковій. Наприклад H, 72, що становить 4 × 16¹ + 8 × 16⁰ або [4,8] ₁₆. Звідси випливає перша колонка в прикладі [4,8].
Адам

О, я зовсім забув! Вибачте.
facepalm42

4

Python 3, 59 байт

-11 байт завдяки майже безшкодному!

-8 байт завдяки Джеймсу К Полку!

-24 байти завдяки Blue!

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

Спробуйте в Інтернеті!

Це досить просто; він відкриває ім'я файлу, вказане як вхід на STDIN, читає його, перетворює кожен символ у його значення ASCII, перетворює кожне число у шістнадцятковий, знімає те, "0x"що передує гексадемічним значенням у Python, при необхідності додає значення з нулем, а потім приєднується до значень разом з пробілами.


Ви можете зберегти кілька байтів, '%02X'%ord(i)замість того, щоб нарізати вихід шістнадцяткових
Здебільшого

@MostlyHarmless Готово! -11 байт. Дякую!
mprogrammer

як щодо '% 02X' замість '% 02x', і позбутися.upper()
президент Джеймс Moveon Полк

Ви можете зберегти байти з import sys, використовуючи raw_input()замість цього ім'я файлу; правила дозволяють спонукати користувачів.
Блакитний

@Blue Дякую! А ще коротше в Python 3, де можна просто зробитиinput()
mprogrammer

3

Баш ,  33  23 байти

... з великою допомогою:
-3 завдяки манатурності
-4 завдяки spuck
-3 завдяки Nahuel Fouilleul

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

Спробуйте в Інтернеті!

Зверніть увагу, що посилання TIO вище використовує введення - ми можемо записувати файли локально, тому це показує, що він працює як програма, яка бере шлях до файлу.


Незначні скорочення: xxd -u -p $1|fold -2|tr \\n \ .
манатура

Дякую, будь-яка ідея, як отримати \nта \ працювати у версії "це" посилання? EDIT: Я додав ще одного символу втечі.
Джонатан Аллан

Якщо я вас правильно зрозумів, ви просто хочете перейти від подвійних пропозицій до одиничних цитат: Спробуйте це в Інтернеті!
манатура

Дивовижне дякую!
Джонатан Аллан

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

3

Котлін , 130 127 104 93 92 байт

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

Спробуйте в Інтернеті!

Редагувати: -11 байт завдяки @ChrisParton

Редагувати: Робота TIO

Редагувати: -1 байт завдяки @KevinCruijssen


1
Чи не могли б ви канаву імпорту та посилання Fileяк java.io.Fileзамість цього?
Кріс Партон

@ChrisParton правильно, дякую!
Квін

Тут працює ТІО. Ви можете використовувати ./.input.tioяк аргумент шляху-файлу, і він буде використовувати STDIN як файл-контент. :)
Кевін Кройсейсен

@KevinCruijssen дякую! щойно оновлена ​​відповідь
Квін

1
Я не знаю Котліна, але 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 без дуже
розслабленої

2

Haskell, 145 143 байт

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

1
Трохи коротше: import Data.ByteStringплюс main=getArgs>>=Data.ByteString.readFile.(!!0)>>=mapM_(printf"%02X ").unpack.
Ними

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
Герман Л

2

bash + Stax, 6 + 4 + 1 = 11 байт

Це повне теоретичне ремесло на даний момент. Насправді це не можна запустити. Якби все працює відповідно до його специфікацій, це працювало б, але ще не все.

Баш сценарій є

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

Perl 6 , 45 байт

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

Спробуйте в Інтернеті!

  • @*ARGS[0] є першим аргументом командного рядка.
  • .IOперетворює це (припущене) ім'я файлу в IO::Pathоб'єкт.
  • .slurp(:bin)читає весь файл у Bufбуфер байтів. (Без :binвмісту файлу повертається як рядок Unicode.)
  • .list повертає список байтових значень з буфера.
  • .fmt('%02X')це Listметод, який форматує елементи списку за допомогою заданого рядка формату, потім з'єднує їх з пробілами. (Зручно!)
  • .say друкує цей рядок.

На основі відповіді Python, посилання TIO насправді цілком можливо.
Draco18s більше не довіряє SE

Деякі перестановки можна видалити .listдля 41 байт
Джо Кінгу


1

Python 3, 75 байт

Переважно копію відповіді піттона 2 Максвелла.

import sys
print(' '.join('%02X'%b for b in open(sys.argv[1],'rb').read()))

ви маєте в виду , ймовірно sys.argv[1]. з sys.argv[0]цей сценарій працює більше як Куайна ;-)
аніону

@anion: ой, ха-ха, виправлення ...
Президент Джеймс Moveon Polk

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в останньому рядку, оскільки TIO передає "-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

Javascript, 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

Мова Вольфрама (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 цифра (як, наприклад, один символ) завжди перетворюватиметься в точно два шістнадцяткових цифри, виключаючи необхідність прокладки з нулями.


1

Node.js, 118 байт

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

Як виглядає результат: введіть тут опис зображення

Btw зміст test.txtу прикладі такий:

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

(Чому на землі потрібен вихід великого регістру. Мені довелося додати конверсію toUpperCase(), і це коштувало 13 байт.)


0

C # .NET Framework 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): використання System.IO; клас P {статичний недійсний Main (string [] a) {if (a.Length> 0 && File.Exists (a [0]) ) {foreach (var b у File.ReadAllBytes (a [0])) {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?
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.