Quine

Chương trình Quine hay Quine là chương trình xuất ra mã nguồn của chính nó khi được thực thi. Ví dụ, Quine không được "bước ra ngoài chính nó" bằng cách in ra nội dung của tệp chứa nó hoặc sử dụng khả năng xem xét nội tâm để in ra bản trình bày của chính nó. Thay vào đó, nó phải tính toán mã nguồn của chính mình.


Cách cổ điển để tạo một chương trình như vậy diễn ra theo hai bước:

  1. Khởi tạo một biến chuỗi có phần giữ chỗ để nội suy.
  2. In chuỗi và nội suy nó vào chính nó .

Bí quyết là lấy dây vừa phải. Cách thực hiện việc này thay đổi tùy theo ngôn ngữ và tùy thuộc vào cách khai báo biến, nhu cầu về dấu chấm phẩy và dòng mới, yêu cầu dấu ngoặc kép, v.v. Việc sử dụng dấu ngoặc kép rất thú vị; Người ta phải tìm cách chỉ ra rằng nên in dấu ngoặc kép mà không thực sự sử dụng dấu ngoặc kép.

Đánh

Giống như hầu hết mọi thứ trong Bash, chương trình này sử dụng một điều thú vị. Mặc dù dấu ngoặc đơn là dấu ngoặc kép mạnh mẽ và không mở rộng bất cứ điều gì, nhưng được diễn giải printf ký tự thoát bát phân là ký tự có điểm mã được chỉ định:

s='s=%s;printf "$s" "$s"';printf "$s" "$s"

Trăn

Trong Python, trình xác định định dạng trả về %r trích dẫn đơn tự động. Dễ dàng nhất nếu mã kết thúc bằng ký tự dòng mới:

s='s=%r;print(s%%s)';print(s%s)

Nếu bạn muốn mã không bị ngắt dòng, bạn phải viết như sau:

s='s=%r;print(s%%s,sep="")';print(s%s,sep="")

JavaScript

Các câu lệnh JavaScript sau đây chạy trong node.js. bạn sử dụng console.log, luôn nối thêm một dòng mới, vì vậy cần có một dòng mới ở cuối mỗi tập lệnh:

s="s=%j;console.log(s,s)";console.log(s,s)

Chương trình sau đây cũng rất thú vị: nó không in toàn bộ cách biểu diễn của nó mà dựa vào thực tế là các hàm có một cách biểu diễn nhất định:

(function a(){console.log('('+a+')()')})()

Ví dụ tiếp theo gần như là gian lận vì nó eval đã sử dụng:

code='var q=unescape("%27");console.log("code="+q+code+q+";eval(code)")';eval(code)

Rỉ sét

Rust cung cấp một cách để đặt đối số trong dấu ngoặc kép trong macro in được định dạng của nó. Tuy nhiên, macro này yêu cầu đối số đầu tiên của macro in phải là một chuỗi ký tự! Do đó tốt nhất nên sử dụng mã định danh đối số vị trí:

fn main(){print!("fn main(){{print!({0:?},{0:?})}}","fn main(){{print!({0:?},{0:?})}}")}

PHP

Chương trình PHP này hoạt động bằng cách lưu trữ mã nguồn dưới dạng một chuỗi và sau đó sử dụng chuỗi đó printf đầu ra. các 39 là viết tắt của ký tự ASCII ', để xử lý chính xác các dấu ngoặc kép trong chuỗi:

<?php
$code = '<?php
$code = %c%s%c;
printf($code, 39, $code, 39);
';
printf($code, 39, $code, 39);

HQ9+

Cuối cùng nhưng không kém phần quan trọng là HQ9+, được phát triển bởi Cliff Biffle:

Q
Trở lại