Hex ถ่ายโอนข้อมูลซอร์สโค้ดของคุณ


15

เมื่อการตีกอล์ฟมีบางครั้งที่คุณต้องการ Hex Dump ของรหัสของคุณซึ่งโดยปกติจะเป็นเพราะคุณใช้อักขระที่ไม่สามารถพิมพ์ได้ ดังนั้นทำไมไม่สร้างโปรแกรมที่ Hex Dumps?

ความท้าทาย

ความท้าทายนี้มีไว้เพื่อไม่ให้อินพุตเอาต์พุตเอาต์พุต Hex Dump ของซอร์สโค้ดของคุณในรูปแบบต่อไปนี้:

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 ไบต์ของรหัสที่มาของคุณ

ส่วนแรกคือที่อยู่หน่วยความจำ มันระบุที่แถวปัจจุบันเริ่มต้นในรหัสของคุณ เขียนเป็นตัวเลขฐานสิบหก 2 ไบต์ตามด้วย a :แล้วเว้นวรรค

ที่สองคือการถ่ายโอนข้อมูล Hex ตัวเอง นี่คือ 16 ไบต์ของรหัสที่มาของคุณเขียนในรูปแบบเลขฐานสิบหกคั่นด้วยช่องว่าง นี่ควรเป็นการนำเสนอแบบไบต์ที่ถูกต้องโดยใช้การเข้ารหัสของรหัสของคุณ

สุดท้ายหลังจากช่องว่างสองช่องว่างก็คือรหัสนั่นเอง นี่เป็นเพียง 16 ตัวอักษรของรหัสของคุณด้วยตัวอักษรที่พิมพ์ไม่ได้.

หมายเหตุ

  • นี้เป็นท้าทายดังนั้นมาตรฐานควินกฎใช้
  • และนี่คือท้าทายเกินไปดังนั้นมาตรฐานช่องโหว่ใช้
  • ดังที่แสดงในตัวอย่างที่สองห้ามเขียนไบต์หลัง EOF ให้ใช้ช่องว่างแทน
  • ช่องว่างต่อท้ายเป็นเรื่องปกติ
  • Inbuilts to Hex dump หากคุณมีรูปแบบเฉพาะในรูปแบบนี้จะไม่ถูกแบน แต่จะขมวดคิ้ว
  • อักขระที่ไม่สามารถพิมพ์ได้หมายถึงอักขระใด ๆ ที่แสดงเป็นไบต์เดียวเท่านั้นไม่สามารถแสดงเป็นรูปแบบเว้นระยะเดียว สำหรับ UTF-8 ที่นี้หมายถึง,0-31 128-255สำหรับJelly Codepageเนื่องจากอักขระทั้งหมดสามารถแสดงเป็นสัญลักษณ์เว้นระยะห่างเดียวจึงไม่มีอักขระที่พิมพ์ไม่ได้

ที่เกี่ยวข้อง / ซ้ำ? codegolf.stackexchange.com/q/11985/47022
Herb Wolfe

โดยส่วนตัวแล้วฉันรู้สึกว่านี่เป็นควินินที่นำไปใช้ทำให้มันแตกต่างกันพอสมควร แต่ฉันยินดีที่จะเห็นความคิดของชุมชน
ATaco

1
ดังนั้นสำหรับบันทึกคุณไม่สามารถอ่านชื่อไฟล์ของคุณและxxdมันได้หรือไม่
Rɪᴋᴇʀ

4
ไม่แน่นอนกฎ Quine มาตรฐานไม่อนุญาตให้
ทำได้

1
โดยส่วนตัวแล้วฉันจะทิ้งไว้ให้ได้คำตอบ ไม่รวมภาษาเพราะสิ่งนี้ไม่จำเป็นอย่างยิ่งในความคิดของฉัน หากคุณยืนยันความกว้างคงที่ให้ใช้สิ่งที่ควรจะเพียงพอสำหรับภาษาส่วนใหญ่ โปรแกรมอรรถประโยชน์ hexdump ส่วนใหญ่ใช้เลขฐานสิบหก 7 หลัก
Dennis

คำตอบ:


3

V , 39 ไบต์

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

ลองออนไลน์!

โปรดทราบว่าปกติ V ใช้การเข้ารหัส latin1 โดยที่นี่คือ 36 ไบต์ (ซึ่งเป็นสิ่งที่ TIO พูด) แต่การส่งนี้ใช้ UTF-8 โดยที่ 39 ไบต์

นี่เป็นเพียงการดัดแปลงเทมเพลต V-quine ที่ฉันเขียน


ไม่ควรขึ้นบรรทัดใหม่0aในตอนท้ายของผลลัพธ์หรือไม่
Kritixi Lithos

@kritixilithos อ่าฉันลืมไปแล้ว ง่ายกว่าการเพิ่มบรรทัดใหม่จนถึงท้าย
DJMcMayhem

8

Perl, 81 ไบต์

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

นับ Shebang เป็นหนึ่งเดียว การมีความยาวโค้ดเป็นทวีคูณของ 16 จะช่วยประหยัดการฟอร์แมตเล็กน้อย ใช้evalในการมอบหมาย$_ให้กับตัวเองที่ยืมมาจากais523

เอาท์พุท:

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 + การเรียกxxdและcutทำ hexdumping ไม่มีโปรแกรมใดในคำถามที่มีบิวด์อินเพื่อทำ hexdump ในรูปแบบของคำถาม อย่างไรก็ตามเข้าxxd -g1มาใกล้มากและดังนั้นจึงเป็นไปได้ที่จะใช้cutในการตัดแต่งเอาต์พุตให้เป็นรูปร่างที่ถูกต้อง

ตัวสร้าง quine สากลคือ$_=q("\$_=q($_);eval");evalซึ่งสร้างสำเนาของซอร์สโค้ดของตัวเองในหน่วยความจำและสามารถแก้ไขได้เพื่อดำเนินการโดยพลการบนมัน ในกรณีนี้ฉันใช้open "|"และไพพ์printอินพุตไปยังโปรแกรมภายนอกxxdซึ่งทำงานเป็นจำนวนมากของ hexdumping และ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`.
นีล

แนวทางที่ฉลาด ฉันอ่านคำถามและดูเหมือนว่าคนทั่วไปคิดว่ามันเป็นการโกงเพราะฉันใช้คุณสมบัติทางภาษาที่ไม่เหมาะสม ฉันจะเพิ่มนั้นพร้อมกับรหัสปรับปรุงของคุณเพื่อคำตอบของฉัน
ลุค

ฉันคิดว่ามันได้รับอนุญาตเดนนิสกล่าวกับความท้าทายอีกประการหนึ่งว่าการใช้การตรวจสอบแหล่งที่มาของฟังก์ชั่นนั้นใช้ได้และฉันรู้ว่าคำตอบ "Golf a quine" หลายคำใช้สิ่งนี้
FlipTack

เปลี่ยนค่าแรก.toStringเป็น[t=toString]และวินาที[t]เป็นบันทึก 3 ไบต์ เปลี่ยน<backtick>\n<backtick>ไป<backtick><newline><backtick>เป็นบันทึกอีกอันหนึ่ง
user2428118

การเปลี่ยนเป็นวิธีสตริงต้องใช้ชื่อฟังก์ชันเป็นสตริงดังนั้นจึงบันทึกได้เพียงหนึ่งไบต์เท่านั้น สำหรับการขึ้นบรรทัดใหม่มันจะส่งผลให้เกิดaการดัมพ์แบบเลขฐานสิบหกซึ่งจำเป็นต้องมีการเติมเต็ม 0 และการเพิ่มการตรวจสอบนั้นจะเพิ่มจำนวน bytecount เท่านั้น
ลูกา

2

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