Biến thể quine mật mã


22

Tạo một chương trình in tổng MD5 của nguồn dưới dạng:

MD5 sum of my source is: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Không gian lận - bạn không thể chỉ đọc tệp nguồn và tính tổng của nó. Chương trình không được đọc bất kỳ thông tin bên ngoài.

Tất nhiên bạn có thể sử dụng thư viện MD5 có sẵn cho ngôn ngữ của mình.


1
Nếu ai đó quản lý để va chạm MD5 (tức là h = f (h), trong đó f là "muối" thô cho h với tất cả rác mã cần thiết để in), tôi nghĩ họ nên được phép làm điều đó.
Nick T

1
@NickT Điều đó sẽ vô cùng khó khăn, tôi có thể thêm vào.
PyRulez

Câu trả lời:


13

Con trăn 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()

Đầu ra:

MD5 sum of my source is: bb74dfc895c13ab991c4336e75865426

Xác minh tại ideone


Tôi đang nhận được một md5sum khác nhau cho tệp nguồn.
hoài nghi

@slackwear bạn đang nhận được gì?
Matt

oh bạn đã chỉnh sửa nó một lần nữa. Ngay bây giờ tôi được 24ba0a79636297dab8803f571d4e3b44 md.pysử dụng md5sum trong Linux
skeevey

1
@slackwear nếu tôi thêm một dòng mới ( \n) vào cuối chương trình, tôi nhận được hàm băm mà bạn đã đăng : 24ba0a79636297dab8803f571d4e3b44. Tôi khá chắc chắn rằng bạn có thêm một dòng mới. (Tôi tin rằng một số biên tập viên sẽ tự động làm điều này)
Matt

2
Bạn nói đúng. Tôi đã không biết rằng vim sẽ che giấu các dấu vết của
LFs

12

Python 2, 91 byte

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

Sử dụng biến thể quine Python không yêu cầu lặp lại mọi thứ hai lần. Đã thử nghiệm trên ideone .


1
đây phải là câu trả lời được chấp nhận
micsthepick

1

Perl + Digest :: MD5, 89 byte

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

Không có liên kết TIO vì Digest :: MD5 không được cài đặt trên TIO. Lưu ý rằng điều này đòi hỏi mức độ tuân thủ ngôn ngữ phải được đặt thành 5.10 hoặc cao hơn ( -M5.010; điều này không mang theo hình phạt byte theo quy tắc PPCG.

Giải trình

Đây là một thách thức "in một chức năng của mã nguồn", có nghĩa là nó có thể được giải quyết một cách tầm thường thông qua một hàm tạo quine phổ quát.

Xây dựng quine phổ quát

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

Chúng tôi sử dụng q()ký hiệu chuỗi (tổ nào) để khởi tạo $_, biến "mặc định" mà Perl sử dụng cho các đối số bị thiếu. Sau đó, chúng tôi evalvới một đối số bị thiếu, để chuỗi bên trong q()được đánh giá.

Chuỗi bên trong q()là một mô tả về cách tạo toàn bộ chương trình; chúng tôi chỉ định phần còn lại của chương trình theo nghĩa đen, sau đó sử dụng một $_chuỗi không thay thế để thay thế toàn bộ chuỗi bên trong.

Kỹ thuật này do đó tạo ra một chuỗi có nội dung giống hệt với nguồn của toàn bộ chương trình; chúng ta có thể in nó để tạo ra một quine. Tuy nhiên, chúng ta cũng có thể làm những việc khác trước, tạo ra một hàm tạo quine phổ quát.

Phần còn lại của chương trình

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

Rất đơn giản: nhập một nội dung MD5, sau đó in chuỗi cố định được chỉ định trong câu hỏi (không đáng để nén nó, tôi tin rằng trong Perl, bộ giải nén sẽ chiếm nhiều không gian hơn là chỉ nêu chuỗi theo nghĩa đen) và sử dụng MD5 dựng sẵn chuỗi chúng tôi nhận được thông qua các hàm tạo quine phổ quát.


0

REPL của Node.js (phiên bản 0.9.3), 96 94 byte

Sử dụng phiên bản cuối cùng của Node.js tồn tại khi thử thách này được đăng. Tôi đã theo dõi tài liệu ngày 9 tháng 11 năm 2012 cho mô-đun mật mã của Node.js và nó đã hỗ trợ tất cả các chức năng mà tôi đã sử dụng ở đây trong ngày.

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

Nếu bạn không muốn cài đặt phiên bản cổ của Node.js chỉ để kiểm tra mã này, hãy yên tâm rằng nó cũng hoạt động trong phiên bản mới nhất.

Node.js REPL (phiên bản 7.0.0), 81 byte

Và đây là một phiên bản sử dụng các chức năng mũi tên của ES6.

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

Chỉnh sửa : cảm ơn Anders Kaseorg đã chỉ ra một lỗi trong phiên bản Node.js 0.9.3 của tôi, sửa lỗi đã lưu hai byte.


Mặc dù tất cả các hàm bạn đã sử dụng có thể đã được Node.js 0.9.3 hỗ trợ, cú pháp bằng chữ của mẫu ES6 `${s};x(x)`thì không.
Anders Kaseorg

@AndersKaseorg Đã sửa, cảm ơn. Hóa ra việc không sử dụng một mẫu bằng chữ thực sự tiết kiệm một số byte trong phiên bản Node.js 0.9.3.
dùng2428118
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.