Hex Kaynak Kodunuzu Döküm


15

Kod golf yaparken, genellikle yazdırılamayan karakterler kullandığınız için kodunuzun Hex Dökümü'ne ihtiyaç duyduğunuz zamanlar olacaktır. Öyleyse, neden Hex Dumps'ın kendisi olan bir program yapmıyorsunuz?

Meydan okuma

Bu sorun, herhangi bir giriş yapılmadığında, kaynak kodunuzun Hex Dökümü'nü aşağıdaki formatta çıktılamaktır:

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

Veya, örneğin, programınız 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)

Ayrıntılı Bilgiler

Onaltılık döküm, her biri kaynak kodunuzun 16 baytını temsil eden üç bölümden oluşan satırlara bölünür.

İlk bölüm bellek adresidir. Geçerli satırın kodunuzda nerede başladığını belirtir. 2 Bayt Onaltılık sayı olarak yazılır, ardından a :, sonra boşluk bırakılır.

İkincisi, Hex Dump'ın kendisidir. Bu, Kaynak Kodunuzun boşluklarla ayrılmış Onaltılık biçimde yazılmış 16 bayttır. Bu, kodunuzun kodlamasını kullanarak doğru bir bayt temsili olmalıdır.

Son olarak, iki boşluktan sonra, kodun kendisidir. Bu, kodunuzun yalnızca 16 karakteridir ve Yazdırılamayan karakterler.

notlar

  • Bu ise bir yüzden, meydan Standart Quine Kuralları geçerlidir.
  • Bu da mücadelesi, bu yüzden Standart Loopholes geçerlidir.
  • İkinci örnekte gösterildiği gibi, EOF'dan sonra bayt yazmayın, bunun yerine boşluk kullanın.
  • Sondaki boşluk gayet iyi.
  • Bu özel formatta bir tane varsa, Hex dökümünde bulunanlar yasaklanmaz, ancak kaşlarını çatar.
  • Yazdırılamayan karakterler, yalnızca tek bir bayt olarak temsil edilen ve tek aralıklı glif olarak gösterilemeyen herhangi bir karakteri belirtir. UTF-8, bu yollarla için 0-31, 128-255. İçin Jelly CODEPAGE tüm karakterler tek aralıklı glyph olarak temsil edilebilir gibi, hiçbir Sigara yazdırılabilir karakterler vardır.


Şahsen bunun uygulanan bir kine onu yeterince farklı kıldığını hissediyorum, ama topluluğun düşüncelerini görmek istiyorum.
ATaco

1
Kayıt için, dosya adınızı ve xxdonu okuyamazsınız ?
Rɪᴋᴇʀ

4
Tabii ki hayır, standart Quine kuralları buna izin vermiyor
ATaco

1
Şahsen, cevaba bırakırım. Bu yüzden bir dili dışlamak bence kesinlikle gereksiz. Sabit bir genişlikte ısrar ediyorsanız, çoğu dil için yeterli olacak bir şey kullanın. Çoğu hexdump yardımcı programı 7 hex-basamak kullanır.
Dennis

Yanıtlar:


3

V , 39 bayt

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

Çevrimiçi deneyin!

Normalde V'nin latin1 kodlamasını kullandığını, burada bunun 36 bayt olduğunu (TIO'nun söylediği gibi), ancak bu gönderimin 39 bayt olduğu UTF-8'i kullandığını unutmayın.

Bu hemen hemen yazdığım V-quine şablonunun bir modifikasyonu .


0aÇıktının sonundaki satırsonu kaldırılmamalı mı?
Kritixi Lithos

@kritixilithos Ah, bunu unuttum. Sonuna bir satırsonu eklemek daha kolaydır.
James

8

Perl, 81 bayt

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

Mesele bir olarak sayılıyor. Kod uzunluğunun 16'nın katları olması biçimlendirmede biraz tasarruf sağlar. Kullanılması evalAtanacak $_kendisinden ödünç için ais523 .

Çıktı:

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

Çevrimiçi deneyin!


5

Perl + xxd + kesim, 61 bayt

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

Çevrimiçi deneyin!

Bu Perl + da hexdumping yapmak xxdve cutyapmak için evrensel bir kine kurucusudur. Söz konusu programların hiçbirinde, söz konusu formatta bir hexdump yapacak yerleşik yoktur; ancak, xxd -g1çok yakın gelir ve bu nedenle cutçıktıyı doğru şekle getirmek için kullanmak mümkündür .

Evrensel quine yapıcısı, $_=q("\$_=q($_);eval");evalbellekte kendi kaynak kodunun bir kopyasını oluşturur ve üzerinde rasgele işlemler gerçekleştirmek için değiştirilebilir. Bu durumda, kullandığım open "|"ve printboruya dış programlarına giriş, xxdhexdumping işin toplu yapar ve cutgerekli biçime değiştirir.


3

JavaScript (ES6) 229 219 162 bayt

@Neil'e çok bayt kaydettiği için teşekkürler

Not

Oldukça az insan, bir işlevin kaynak koduna benim yaptığım şekilde erişmenin hile olduğunu düşünüyor, ancak @Dennis'e göre, iyi. Bu yüzden cevabımı burada bırakacağım.

kod

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`

kullanım

f()

İşlevi bağımsız değişken olmadan çağırın.

Çıktı

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
(standart fine kuralları altında 'f =' + f'ye izin verildiğinden emin değilim, ancak 161 bayt içinse sana veriyorum 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

Akıllı yaklaşım. Bazı soruları okudum ve görünüşe göre insanlar genellikle aldatmayı düşündü çünkü uygun bir dil özelliğini kötüye kullanıyorum. Bunu, geliştirilmiş kodunuzla birlikte cevabıma ekleyeceğim.
Luke

Ben izin verilir düşünüyorum, Dennis başka bir quine meydan okuma fonksiyon denetimi kullanmanın iyi olduğunu söyledi ve birkaç "Golf bir quine" cevaplar bunu kullanın biliyorum.
FlipTack

İlk olarak değiştirin .toStringetmek [t=toString]için ve ikinci [t]3 bayt kaydedin. Başka birini kaydetmek <backtick>\n<backtick>için öğesini değiştirin <backtick><newline><backtick>.
user2428118

Dize yönteminin değiştirilmesi, işlev adının bir dize olmasını gerektirir, bu nedenle yalnızca bir bayt kaydeder. Yeni satıra gelince, a0 eklenmesi gereken altıgen dökümü ile sonuçlanır ve bu kontrolün eklenmesi yalnızca bayt sayısını artıracaktır.
Luke

2

Yakut, 128112 bayt

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

Sondaki satırsonu olmadan.

16 bayt sınırına uyum fikri için primo'ya teşekkürler.

Çıktı

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