Đột biến cứng


14

Nhiệm vụ của bạn là tạo ra một chương trình in ra nguồn của chính nó.

"Này, chúng tôi đã có thử thách này và hàng tấn biến thể của nó! Tại sao bạn lại tạo ra một thử thách khác?" bạn có thể hỏi, nhưng cái này sẽ là một trong những cái khó nhất (hy vọng, dù sao đi nữa).

Quine của bạn phải là "đột biến cứng", có nghĩa là quine, ngay cả khi bất kỳ một trong các ký tự của nó được sao chép tại chỗ, phải xuất mã nguồn của chương trình gốc.

Ví dụ: nếu bạn có một quine (ví dụ sau không được viết bằng bất kỳ ngôn ngữ nào, thì đó chỉ là mã giả):

abcd

Các chương trình này phải xuất tất cả abcd:

aabcd
abbcd
abccd
abcdd

(Trong mỗi chương trình, a, b, cdđang từng nhân đôi tại chỗ, có nghĩa là nhân vật trùng lặp được đặt trực tiếp sau khi các nhân vật ban đầu.)

Quy tắc:

  • Quy tắc quine tiêu chuẩn áp dụng.
  • Một ký tự nhiều byte được tính là một ký tự và ký tự đó không được "chia" thành các byte tương ứng khi được nhân đôi.

Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ thắng!


Điều này có tính không? 000trong CJam cả hai đầu ra 0.
geokavel

Không, 0không phải là một câu hỏi thích hợp.
Dennis

2
Tôi nghĩ nó sẽ thú vị như chơi bowling mã
Ông Xcoder

Là vấn đề của đột biến mã có thể giải quyết được nói chung? trừ khi đột biến xảy ra với một ký tự bên trong chuỗi được trích dẫn, nó thường sẽ làm hỏng chương trình.
hasen

Có phải tiêu đề hơi sai lệch? "Đột biến" đề nghị thay đổi một nhân vật, không lặp lại nó
Luis Mendo

Câu trả lời:


18

> <> , 56 byte

^
.
+
8
f
0
o
a
o
~
:
?
~
:
?
:
-
*
4
8
:
^
^
}
*
3
d
'

Hãy thử trực tuyến! hoặc xác minh tất cả các đột biến .

Chương trình gốc hoạt động như thế nào (lỗi thời)

Trình thông dịch bắt đầu trong ô (0, 0) . ^đặt hướng lên trên , để con trỏ lệnh (IP) bao quanh ô (0, 20) .

'kích hoạt chế độ chuỗi: cho đến khi 'gặp lần tiếp theo , tất cả các ký tự dưới IP được đẩy trên ngăn xếp. Điều tương tự 'được tìm thấy một lần nữa sau khi quấn quanh, vì vậy chúng tôi đẩy

d3*}^^:84*=?~oao0f.^

IP hạ cánh tại (0, 19) , vẫn tiếp tục đi lên. Thực hiện d3*}đẩy 13 = 0xd , sau đó 3 , nhân cả hai giá trị ( 39 / trích dẫn đơn ), sau đó xoay ngăn xếp sang phải. Điều này rời khỏi ngăn xếp như sau.

'd3*}^^:84*=?~oao0f.^

Hai hướng dẫn tiếp theo ( ^) không làm gì vào thời điểm này.

:84*=nhân đôi đỉnh của ngăn xếp, đẩy 84 , nhân chúng ( 32 / dấu cách ), sau đó kiểm tra ký tự trùng lặp để tìm sự bằng nhau với không gian . Đối với chương trình không thay đổi, điều này sẽ luôn đẩy 0 .

?bỏ qua hướng dẫn tiếp theo nếu đỉnh của ngăn xếp bị sai lệch. Đối với chương trình ban đầu, nó luôn luôn như vậy, vì vậy ~luôn luôn bị bỏ qua.

oaobật và in phần trên cùng của ngăn xếp, đẩy 10 / linefeed , sau đó bật và in linefeed .

Cuối cùng 0f.nhảy đến ô (0, 15) (điểm cuối ^), bắt đầu lại với ký tự tiếp theo trên ngăn xếp.

Khi ngăn xếp trống, toàn bộ mã nguồn đã được in. :sẽ thất bại và chương trình thoát.

Làm thế nào các chương trình đột biến hoạt động (lỗi thời)

Sao chép bất kỳ ký tự không phải dòng nào sẽ chỉ mở rộng chương trình theo chiều ngang. Vì chương trình được thực thi theo chiều dọc, các hướng dẫn bổ sung này sẽ không bao giờ được thực thi.

Sao chép bất kỳ nguồn cấp dữ liệu nào trước dòng dưới cùng ^sẽ chuyển các ô (0, 14)(0, 15) thành (0, 15)(0, 16) . 0f.Bây giờ sẽ nhảy đến ô trước điểm cuối ^, cũng là một ^, vì vậy chương trình không bị ảnh hưởng bởi sự thay đổi.

Cuối cùng, bất kỳ ký tự linefeed trùng lặp cũng sẽ thay đổi chuỗi. Dòng ngắn được độn với không gian, do đó, một 32 / không gian sẽ được chèn vào vị trí của linefeed. 84*=sẽ đẩy 1 cho không gian, vì vậy ?đừng bỏ qua hướng dẫn tiếp theo. Trong trường hợp này, ~bật và loại bỏ không gian , vì vậy phần sau osẽ in ký tự bên trên không gian thay thế.


Bạn có thể sao chép bất kỳ dòng mới nào và nó vẫn sẽ hoạt động.
Dennis

3
Ồ, tôi đã không đọc bài viết đúng cách: P (Chết tiệt Dennis, tại sao bạn rất tốt)
clismique


@ jimmy23013 Nên sửa.
Dennis
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.