16 진수 소스 코드를 덤프하십시오


15

코드 골프를 할 때 보통 인쇄 할 수없는 문자를 사용했기 때문에 코드의 16 진 덤프가 필요한 경우가 있습니다. 그렇다면 Hex Dumps 자체 프로그램을 작성해 보시겠습니까?

도전

이 과제는 입력이 없으면 소스 코드의 16 진 덤프를 다음 형식으로 출력하는 것입니다.

0000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

또는 예를 들어 프로그램이 print("SomeString"):rep(123)

0000: 70 72 69 6e 74 28 5c 22 53 6f 6d 65 53 74 72 69  print("SomeStrin
0010: 6e 67 5c 22 29 3a 72 65 70 28 31 32 33 29        g"):rep(123)

사양

16 진 덤프는 소스 코드의 16 바이트를 나타내는 각 부분으로 세 부분으로 나뉩니다.

첫 번째 부분은 메모리 주소입니다. 코드에서 현재 행이 시작되는 위치를 지정합니다. 2 바이트 16 진수로 작성된 다음에: 공백이옵니다.

두 번째는 Hex Dump 자체입니다. 이것은 16 바이트 소스 코드의 16 바이트이며 공백으로 구분됩니다. 이것은 코드 인코딩을 사용한 정확한 바이트 표현이어야합니다.

마지막으로 두 개의 공백이 있으면 코드 자체입니다. 이것은 인쇄 할 수없는 문자는 다음과 같이 코드의 16 자입니다..

노트

  • 이것은 이다 , 그래서 도전 표준 Quine 규칙이 적용됩니다.
  • 그리고 이것은 또한 도전입니다. 표준 허점이 적용됩니다.
  • 두 번째 예에서와 같이 EOF 뒤에 바이트를 쓰지 말고 공백을 사용하십시오.
  • 후행 공백이 좋습니다.
  • Inbuilts to Hex 덤프는이 특정 형식의 파일이 있으면 금지되지 않지만 눈살을 찌푸립니다.
  • 인쇄 할 수없는 문자는 단일 바이트만으로 표현되고 단일 공백 ​​글리프로 표현할 수없는 문자를 나타냅니다. UTF-8 수단이 0-31, 128-255. 를 들어 젤리 코드 페이지 의 모든 문자가 하나의 간격 그래프로 표현 될 수있는, 더 비 인쇄 문자가 없습니다.


개인적으로 이것은 적용된 퀴인이 충분히 다른 것처럼 느껴지지만 커뮤니티의 생각을 기꺼이 볼 것입니다.
ATaco

1
기록을 위해 파일 이름과 파일을 읽을 수 xxd없습니까?
Rɪᴋᴇʀ

4
물론 표준 Quine 규칙은 허용하지 않습니다
ATaco

1
개인적으로 대답에 맡길 것입니다. 이 때문에 언어를 제외시키는 것은 절대적으로 필요하지 않습니다. 고정 너비를 고집하는 경우 대부분의 언어에 충분한 것을 사용하십시오. 대부분의 hexdump 유틸리티는 7 개의 16 진수를 사용합니다.
Dennis

답변:


3

V , 39 바이트

ñi241"qp:%!xxd
Î4x
Íøø / &
f&3i ÿ

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

일반적으로 V는 latin1 인코딩을 사용하는데, 여기서 이것은 36 바이트 (TIO가 말하는 것)이지만이 제출은 39 바이트 인 UTF-8을 사용합니다.

이것은 내가 쓴 V- 퀸 템플릿 의 수정에 불과합니다 .


0a출력 끝에 줄 바꿈 을 제거 해서는 안 됩니까?
Kritixi Lithos

@kritixilithos 아, 나는 그것에 대해 잊었다. 끝에 줄 바꿈을 추가하는 것이 더 쉽습니다.
DJMcMayhem

8

펄, 81 바이트

#!perl -l
$_=q($%+=print"00$%0: @{[unpack'(H2)*']}  $_"for"\$_=q($_);eval"=~/.{16}/g);eval

shebang을 하나로 계산합니다. 코드 길이를 16의 배수로 설정하면 서식을 상당히 절약 할 수 있습니다. ais523 에서 빌린 자체 eval재 할당 사용$_ .

산출:

0000: 24 5f 3d 71 28 24 25 2b 3d 70 72 69 6e 74 22 30  $_=q($%+=print"0
0010: 30 24 25 30 3a 20 40 7b 5b 75 6e 70 61 63 6b 27  0$%0: @{[unpack'
0020: 28 48 32 29 2a 27 5d 7d 20 20 24 5f 22 66 6f 72  (H2)*']}  $_"for
0030: 22 5c 24 5f 3d 71 28 24 5f 29 3b 65 76 61 6c 22  "\$_=q($_);eval"
0040: 3d 7e 2f 2e 7b 31 36 7d 2f 67 29 3b 65 76 61 6c  =~/.{16}/g);eval

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


5

Perl + xxd + cut, 61 바이트

$_=q(open F,"|xxd -g1|cut -c5-";print F"\$_=q($_);eval");eval

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

이것은 Perl의 보편적 인 quine 생성자이며 hexdumping 을 xxd하고 호출 cut하는 것입니다. 문제의 프로그램 중 어느 것도 문제의 형식으로 16 진 덤프를 수행 할 수있는 기능이 없습니다. 그러나 xxd -g1매우 가까이 와서 사용할 수 있습니다cut 출력을 올바른 모양으로 자르는 수 있습니다.

범용 quine constructor는 $_=q("\$_=q($_);eval");eval메모리에 자체 소스 코드의 사본을 작성하고 임의 조작을 수행하도록 수정할 수 있습니다. 이 경우, 내가 사용 open "|"하고 print파이프에 외부 프로그램에 입력, xxdhexdumping 작업의 대부분을 수행하고 cut필요한 형식으로 변경합니다.


3

자바 스크립트 (ES6) 229 (219) 162 바이트

많은 바이트를 절약 한 @Neil에게 감사합니다

노트

꽤 많은 사람들이 내가 바람을 피우는 방식으로 함수의 소스 코드에 액세스한다고 생각하지만 @Dennis에 따르면 괜찮습니다. 따라서 나는 여기에 내 대답을 남길 것입니다.

암호

f=_=>([...c=`f=`+f].map(d=>d.charCodeAt()[t=`toString`](16)).join‌​` `+` `.repeat(46)).match(/.{48}/g).map((s,i)=>`00${i[t](16)}0: `+s+c.substr(i*16,16)).join`\n`

용법

f()

인수없이 함수를 호출하면됩니다.

산출

0000: 66 3d 5f 3d 3e 28 5b 2e 2e 2e 63 3d 60 66 3d 60 f=_=>([...c=`f=`
0010: 2b 66 5d 2e 6d 61 70 28 63 3d 3e 63 2e 63 68 61 +f].map(c=>c.cha
0020: 72 43 6f 64 65 41 74 28 29 5b 74 3d 60 74 6f 53 rCodeAt()[t=`toS
0030: 74 72 69 6e 67 60 5d 28 31 36 29 29 2e 6a 6f 69 tring`](16)).joi
0040: 6e 60 20 60 2b 60 20 60 2e 72 65 70 65 61 74 28 n` `+` `.repeat(
0050: 34 36 29 29 2e 6d 61 74 63 68 28 2f 2e 7b 34 38 46)).match(/.{48
0060: 7d 2f 67 29 2e 6d 61 70 28 28 73 2c 69 29 3d 3e }/g).map((s,i)=>
0070: 60 30 30 24 7b 69 5b 74 5d 28 31 36 29 7d 30 3a `00${i[t](16)}0:
0080: 20 60 2b 73 2b 63 2e 73 75 62 73 74 72 28 69 2a  `+s+c.substr(i*
0090: 31 36 2c 31 36 29 29 2e 6a 6f 69 6e 60 5c 6e 60 16,16)).join`\n`                                     

1
( 'f ='+ f가 표준 quine 규칙 하에서 허용되는지 확실하지 않지만 161 바이트 인 경우 제공합니다 f=_=>([...c=`f=`+f].map(c=>c.charCodeAt().toString(16)).join` `+` `.repeat(46)).match(/.{48}/g).map((s,i)=>`00`+i.toString(16)+`0 `+s+c.substr(i*16,16)).join`\n`.
Neil

영리한 접근. 나는 몇 가지 질문을 읽었으며, 사람들이 편리한 언어 기능을 남용하기 때문에 일반적으로 부정 행위로 간주된다고 생각하는 것 같습니다. 개선 된 코드와 함께 내 대답에 추가하겠습니다.
Luke

나는 그것이 허용된다고 Dennis는 함수 소스 검사를 사용하는 것이 좋다고 또 다른 quine 도전에 대해 말했다.
FlipTack

첫 번째 에서 두 번째 .toString로 변경하여 3 바이트를 저장하십시오. 을 변경 하기 위해 다른 하나를 저장합니다. [t=toString][t]<backtick>\n<backtick><backtick><newline><backtick>
user2428118

문자열 메소드를 변경하면 함수 이름이 문자열이어야하므로 1 바이트 만 저장합니다. 줄 바꿈의 a경우 16 진수 덤프가 발생하며 앞에 0이 필요하며 해당 검사를 추가하면 바이트 수가 증가합니다.
Luke

2

루비, 128112 바이트

eval b='7.times{|y|$><<"%04x:"%y*=16;c=("eval b="+(a=39.chr)+b+a)[y,16];c.chars{|x|$><<" %x"%x.ord};puts"  "+c}'

줄 바꿈없이.

16 바이트 경계에 맞추는 아이디어에 감사드립니다.

산출

0000: 65 76 61 6c 20 62 3d 27 37 2e 74 69 6d 65 73 7b  eval b='7.times{
0010: 7c 79 7c 24 3e 3c 3c 22 25 30 34 78 3a 22 25 79  |y|$><<"%04x:"%y
0020: 2a 3d 31 36 3b 63 3d 28 22 65 76 61 6c 20 62 3d  *=16;c=("eval b=
0030: 22 2b 28 61 3d 33 39 2e 63 68 72 29 2b 62 2b 61  "+(a=39.chr)+b+a
0040: 29 5b 79 2c 31 36 5d 3b 63 2e 63 68 61 72 73 7b  )[y,16];c.chars{
0050: 7c 78 7c 24 3e 3c 3c 22 20 25 78 22 25 78 2e 6f  |x|$><<" %x"%x.o
0060: 72 64 7d 3b 70 75 74 73 22 20 20 22 2b 63 7d 27  rd};puts"  "+c}'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.