ソースコードを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進ダンプは3つの部分からなる行に分割され、各行はソースコードの16バイトを表します。

最初の部分はメモリアドレスです。コード内の現在の行の開始位置を指定します。2バイトの16進数として記述され:、その後に、次にスペースが続きます。

2番目は、Hex Dump自体です。これは、スペースで区切られた16進形式で記述された16バイトのソースコードです。これは、コードのエンコーディングを使用した正確なバイト表現でなければなりません。

最後に、2つのスペースのギャップの後、コード自体です。これはコードの16文字であり、印刷できない文字は次のように記述されます。.

ノート

  • これはある挑戦なので、標準クワインルール適用されます。
  • これも挑戦なので、標準の抜け穴が適用されます。
  • 2番目の例に示すように、EOFの後にバイトを書き込まず、代わりに空白を使用します。
  • 末尾の空白は問題ありません。
  • 組み込みのHexダンプは、たまたまこの特定の形式である場合、禁止されていませんが、眉をひそめています。
  • 印刷不可能な文字とは、単一のバイトとしてのみ表される任意の文字を指し、単一の間隔のグリフとして表すことはできません。UTF-8の場合、これは0-31、を意味し128-255ます。ためゼリーコードページのすべての文字を単一の離間グリフとして表すことができるように、何の非印刷可能な文字が存在しません。


個人的には、これは応用された馬で十分に違うと思うが、コミュニティの考えを喜んで見たい。
アタコ

1
記録のために、あなたはあなたのファイル名とxxdそれを読むことができませんか?
Rɪᴋᴇʀ

4
もちろん、標準のQuineルールではそれが許可されていません
-ATaco

1
個人的には、答えにお任せします。私の意見では、このために言語を除外することは絶対に不要です。固定幅に固執する場合は、ほとんどの言語に十分なものを使用してください。ほとんどのhexdumpユーティリティは、7桁の16進数を使用します。
デニス

回答:


3

V、39バイト

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

オンラインでお試しください!

通常、Vはlatin1エンコードを使用します。これは36バイト(TIOの言うところ)ですが、この送信では39バイトのUTF-8を使用しています。

これは、私が書いたV-quineテンプレートの単なる修正です。


0a出力の最後の改行を削除すべきではありませんか?
クリチキシリトス

@kritixilithosああ、私はそれを忘れていました。最後に改行を追加する方が簡単です。
DJMcMayhem

8

Perl、81バイト

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

シバンを1つとして数えます。コードの長さを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、出力を正しい形状にトリムするために使用できます。

ユニバーサルクインコンストラクターは$_=q("\$_=q($_);eval");eval、メモリ内に独自のソースコードのコピーを作成し、任意の操作を実行するように変更できます。この場合、私が使用open "|"し、printパイプに外部プログラムに入力、xxdhexdumping作業の大部分を行い、cut必要な形式に変更します。


3

JavaScriptの(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が標準のクインルールで許可されているかどうかはわかりませんが、もしそれが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

賢いアプローチ。私はいくつかの質問を読みましたが、私は便利な言語機能を乱用しているので、一般的に不正行為だと考えられているようです。あなたの改善されたコードとともに、それを私の答えに追加します。
ルーク

デニスは別の馬の挑戦で、関数ソース検査を使用するのは問題ないと述べ、いくつかの「ゴルフの馬」の回答がこれを使用していることを知っています。
FlipTack

最初の.toStringto [t=toString]と2番目のto [t]を変更して、3バイト節約します。を変更し<backtick>\n<backtick><backtick><newline><backtick>、別のものを保存します。
user2428118

文字列メソッドを変更するには、関数名が文字列である必要があります。そのため、1バイトしか保存されません。改行に関してaは、16進ダンプが発生し、先頭に0を追加する必要があり、そのチェックを追加するとバイト数が増えるだけです。
ルーク

2

ルビー、128 112バイト

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}'

末尾の改行なし。

primoに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.