Chương trình Quine lặp đi lặp lại


8

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?


Bạn có thể vui lòng cung cấp thêm thông tin về chương trình Quine là gì không? (Ngoài ra, vui lòng đọc Câu hỏi thường gặpcách đặt câu hỏi hay nếu bạn chưa đọc.)
Kaveh

@Kaveh: Tôi đã thêm lại thẻ logic. Quines bắt nguồn từ logic và nghiên cứu về tự tham khảo, tự áp dụng, vv, vì vậy nó có vẻ như apropos.
Per Vognsen

Một nguồn tài nguyên tuyệt vời về quines
Sylvain Peyronnet

3
Btw, tôi không nghĩ rằng cần phải viết mã của một chương trình như vậy, sự tồn tại dễ dàng theo định lý điểm cố định của Kleene .
Kaveh

1
@Kaveh: Có, tôi nghi ngờ rằng thuật ngữ "Chương trình Quine" đã được đặt ra bởi Hofstadter trong GEB (anh ấy chắc chắn đã đặt ra động từ "to aritmoquine" ). Nhưng tôi không chắc chắn 100%. Tôi chân thành khuyên mọi người nên đọc GEB (ít nhất, mọi người quan tâm đến Logic và / hoặc Trí tuệ nhân tạo). IMHO, nó là một kiệt tác.
Giorgio Camerani

Câu trả lời:


9

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.


Hoàn thành rất tốt!
arnab

9


(ΦTôi)φ(k)keφ(k)= =Φe(k)fΦf(k)= =Φe(k)= =φ(k)kSΦf(S)= =ΦSΦSS


3

Đâ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); }
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.