Một Quine là một chương trình máy tính mà tạo ra một bản sao của mã nguồn riêng của mình như đầu ra duy nhất của nó. Có chương trình Quine nào có thể tự in ra n lần, với n được chỉ định một số cách trong chương trình không?
Một Quine là một chương trình máy tính mà tạo ra một bản sao của mã nguồn riêng của mình như đầu ra duy nhất của nó. Có chương trình Quine nào có thể tự in ra n lần, với n được chỉ định một số cách trong chương trình không?
Câu trả lời:
Câu hỏi thú vị! Là một cơ sở, tôi sẽ sử dụng câu hỏi Haskell này mà tôi đã tìm thấy trên Wikipedia:
main=putStr(p++show(p))where p="main=putStr(p++show(p))where p="
Bạn có thể làm cho nó in ra hai bản sao của chính nó bằng cách thay thế các lần xuất hiện của chương trình p ++ (p) bằng chương trình p ++ (p) ++ p ++ (p). Nếu bạn thấy tại sao, mô hình để đạt được sự lặp lại thay đổi nên rõ ràng.
Tôi sẽ sử dụng hàm sau để tính toán lần lặp thứ n của f trên x:
iterateN n f x = (iterate f x) !! n
Tôi sẽ cho rằng nó có sẵn như là một chức năng thư viện. Bạn có thể dễ dàng nhúng định nghĩa của nó trực tiếp vào quine, nhưng điều đó sẽ làm lộn xộn bài thuyết trình mà không có lý do chính đáng. Bây giờ phần còn lại là đơn giản:
main=putStr(iterateN 42(++(p++show(p)))[])
where p="main=putStr(iterateN 42(++(p++show(p)))[])where p="
Ngắt dòng được chèn để hỗ trợ khả năng đọc; loại bỏ nó nếu bạn muốn tự sao chép chính xác.
Đây là một bản khác, dựa trên phiên bản printf trên wikipedia:
main() { int i=5; char *s="main() { int i=5; char *s=%c%s%c; while (i--)
printf(s,34,s,34); }"; while (i--) printf(s,34,s,34); }`
Mặc dù nó ngắn, nhưng nó thực sự không đẹp lắm, vì nó thiếu sự bao gồm cho printf, cũng như bộ đếm phải được chỉ định hai lần. Một phiên bản dài hơn một chút chữa được cả hai vấn đề:
#include <stdio.h>
#define k 5
main() { int i=k; char *s="#include <stdio.h> %c#define k %d%cmain() { int i=k;
char *s=%c%s%c; while (i--) printf(s,10,k,10,34,s,34); }";
while (i--) printf(s,10,k,10,34,s,34); }