ตัวแปร Quine เข้ารหัสลับ


22

สร้างโปรแกรมที่พิมพ์ผลรวม MD5 ของแหล่งที่มาในรูปแบบ:

MD5 sum of my source is: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

ไม่มีการโกง - คุณไม่สามารถอ่านไฟล์ต้นฉบับและคำนวณผลรวมได้ โปรแกรมจะต้องไม่อ่านข้อมูลภายนอกใด ๆ

แน่นอนคุณสามารถใช้ห้องสมุด MD5 ที่มีให้สำหรับภาษาของคุณ


1
หากใครบางคนจัดการกับการชนกันของ MD5 (เช่น h = f (h) โดยที่ f คือ "เกลือ" หยาบสำหรับชั่วโมงที่มีรหัสขยะทั้งหมดที่จำเป็นในการพิมพ์) ฉันคิดว่าพวกเขาควรได้รับอนุญาตให้ทำเช่นนั้น
Nick T

1
@NickT นั่นคงเป็นเรื่องยากมาก แต่ฉันอาจเพิ่ม
PyRulez

คำตอบ:


13

Python 157 149

r='r=%r;import md5;print "MD5 sum of my source is: "+md5.new(r%%r).hexdigest()';import md5;print "MD5 sum of my source is: "+md5.new(r%r).hexdigest()

เอาท์พุท:

MD5 sum of my source is: bb74dfc895c13ab991c4336e75865426

การยืนยันที่ideone


ฉันได้รับ md5sum ที่แตกต่างกันสำหรับไฟล์ต้นฉบับ
skeevey

@slackwear คุณจะได้อะไร
แมตต์

โอ้คุณได้แก้ไขมันอีกครั้ง ตอนนี้ฉันได้24ba0a79636297dab8803f571d4e3b44 md.pyใช้ md5sum ใน linux
skeevey

1
@slackwear ถ้าฉันจะเพิ่มขึ้นบรรทัดใหม่ ( \n) 24ba0a79636297dab8803f571d4e3b44ในตอนท้ายของโปรแกรมของฉันที่ฉันได้รับกัญชาที่คุณโพสต์: ฉันค่อนข้างแน่ใจว่าคุณมีการขึ้นบรรทัดใหม่ (ฉันเชื่อว่าผู้แก้ไขบางคนจะทำสิ่งนี้โดยอัตโนมัติ)
Matt

2
คุณถูก. ฉันไม่รู้เป็นกลุ่มจะซ่อน LFs ตามมา
skeevey

12

Python 2, 91 ไบต์

s="import md5;print'MD5 sum of my source is: '+md5.new('s=%r;exec s'%s).hexdigest()";exec s

ใช้ Python Quine Variant ซึ่งไม่จำเป็นต้องทำซ้ำทุกอย่างสองครั้ง การทดสอบบนideone


1
นี่ควรเป็นคำตอบที่ได้รับการยอมรับ
micsthepick

1

Perl + Digest :: MD5, 89 ไบต์

$_=q(use Digest::MD5 md5_hex;say"MD5 sum of my source is: ",md5_hex"\$_=q($_);eval");eval

ไม่มีลิงก์ TIO เนื่องจากไม่ได้ติดตั้ง Digest :: MD5 ใน TIO โปรดทราบว่าต้องมีการตั้งค่าระดับความสอดคล้องของภาษาเป็น 5.10 หรือสูงกว่า ( -M5.010ซึ่งไม่ได้มีบทลงโทษแบบไบต์ตามกฎ PPCG

คำอธิบาย

นี่เป็นอีกความท้าทาย "พิมพ์ฟังก์ชั่นของซอร์สโค้ด" ซึ่งหมายความว่าจะสามารถแก้ไขได้เล็กน้อยผ่านตัวสร้าง quine สากล

ตัวสร้าง quine สากล

$_=q(…"\$_=q($_);eval");eval

เราใช้ q()สัญกรณ์สตริง (ซึ่งรัง) เพื่อเริ่ม$_ต้นตัวแปร "เริ่มต้น" ที่ Perl ใช้สำหรับการขัดแย้งที่ขาดหายไป จากนั้นเราevalมีข้อโต้แย้งที่ขาดหายไปเพื่อให้สตริงภายในq()ได้รับการประเมิน

สตริงภายในq()คือคำอธิบายวิธีสร้างโปรแกรมทั้งหมด เราระบุส่วนที่เหลือของโปรแกรมอย่างแท้จริงจากนั้นใช้ unescaped $_เพื่อแทนที่สตริงทั้งหมดสำหรับด้านใน

เทคนิคจึงสร้างสตริงที่มีเนื้อหาเหมือนกันกับแหล่งที่มาของโปรแกรมทั้งหมด เราสามารถพิมพ์มันเพื่อผลิตควินิน เรายังสามารถทำสิ่งอื่น ๆ ได้ก่อนอื่นการสร้างตัวสร้างควินสากล

ส่วนที่เหลือของโปรแกรม

use Digest::MD5 md5_hex;say"MD5 sum of my source is: ",md5_hex

ง่ายมาก: นำเข้า MD5 builtin จากนั้นพิมพ์สตริงคงที่ที่ระบุในคำถาม (มันไม่คุ้มค่ากับการบีบอัดฉันเชื่อว่าใน Perl ตัวขยายการบีบอัดจะใช้พื้นที่มากกว่าการระบุสตริงตามตัวอักษร) และใช้ MD5 builtin บน สตริงที่เราได้รับผ่านตัวสร้าง quine สากล


0

Node.js REPL (เวอร์ชั่น 0.9.3) 96 94 ไบต์

การใช้ Node.js รุ่นล่าสุดที่มีอยู่เมื่อมีการโพสต์ความท้าทายนี้ ฉันติดตามเอกสาร 9 พฤศจิกายน 2555สำหรับโมดูล crypto ของ Node.js แล้วและมันสนับสนุนฟังก์ชั่นทั้งหมดที่ฉันใช้ที่นี่ในตอนกลางวัน

function x(s){return require("crypto").createHash("md5").update(s+";x(x)").digest("hex")};x(x)

หากคุณไม่รู้สึกอยากติดตั้ง Node.js รุ่นโบราณเพื่อทดสอบโค้ดนี้โปรดมั่นใจได้ว่ามันยังใช้งานได้ในเวอร์ชันล่าสุด

Node.js REPL (เวอร์ชั่น 7.0.0), 81 ไบต์

และนี่คือรุ่นที่ใช้ฟังก์ชั่นลูกศรของ ES6

x=s=>require("crypto").createHash("md5").update(`x=${s};x(x)`).digest("hex");x(x)

แก้ไข : ขอบคุณAnders Kaseorg ที่ชี้ให้เห็นข้อผิดพลาดในรุ่น Node.js 0.9.3 ของฉันการแก้ไขซึ่งบันทึกสองไบต์


แม้ว่าฟังก์ชั่นทั้งหมดที่คุณใช้อาจได้รับการสนับสนุนโดย Node.js 0.9.3 ไวยากรณ์ตัวอักษรเทมเพลต ES6 `${s};x(x)`ไม่ใช่
Anders Kaseorg

@AndersKaseorg คงที่ขอบคุณ กลับกลายเป็นว่าไม่ได้ใช้เทมเพลตที่แท้จริงแล้วจะบันทึกบางไบต์ใน Node.js เวอร์ชัน 0.9.3
user2428118
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.