CJam, ( 58 56 54 48 46 x 2) * 48% = 44,16
{`"_~"+{_,94\m2/S*a_+\*
N/23f/Wf%N*}_`'"#)!*}_~
mà in
{`"_~"+{_,94\m2/S*a_+\*
N/23f/Wf%N*}_`'"#)!*}_~
Các ký tự không phải khoảng trắng trong mỗi dòng vẫn giữ nguyên giữa hai dòng tương hỗ.
Nhưng bây giờ là phần thực sự ngọt ngào:
{`"_~"+{_,94\m2/S*a_+\*{`"_~"+{_,94\m2/S*a_+\*
N/23f/Wf%N*}_`'"#)!*}_~N/23f/Wf%N*}_`'"#)!*}_~
là một quine! :)
Kiểm tra nó ở đây.
Làm thế nào nó hoạt động
Tôi khuyên bạn nên đọc phần giải thích về bài nộp khác của tôi trước, vì nó giải thích những điều cơ bản của việc khai thác ở CJam nói chung.
Đây là một chút phức tạp hơn. Đối với quine lẫn nhau, như trong trường hợp khác, tôi sửa đổi biểu diễn chuỗi của khối bằng cách thêm khoảng trắng trước hoặc sau mỗi dòng và hoán đổi 0 bằng 2, để chương trình kết quả đặt khoảng trắng ở đầu đối diện.
Lưu ý rằng các không gian không ảnh hưởng đến các hạn chế lẫn nhau. Trong phần đầu tiên, chúng nằm trong một khối, không thực sự được sử dụng và trong phần thứ hai, chúng nằm xung quanh toàn bộ mã.
Để có được một câu hỏi thường xuyên khi kết hợp cả hai, chúng ta cần tìm cách tránh thực hiện tất cả các sửa đổi đó. Lưu ý rằng cấu trúc của khoảng trắng và mã có nghĩa là bằng cách kết hợp cả hai, chúng ta chèn toàn bộ một quine vào cái kia. Vì vậy, nếu chúng ta đặt toàn bộ mã sửa đổi trong một khối, chúng ta có thể chạy khối đó tùy thuộc vào nội dung thực tế của nó.
Vì vậy, bây giờ tôi đã có khối này ... cho các quines lẫn nhau, nó chỉ chứa mã tôi thực sự muốn chạy. Đối với quine kết hợp, nó cũng chứa toàn bộ quine một lần nữa, ở một vị trí ngẫu nhiên, không có ý nghĩa gì cả ... nhưng vì nó là một khối, nên nó không tự động chạy. Vì vậy, chúng tôi có thể xác định xem có nên sửa đổi chuỗi dựa trên nội dung của khối đó hay không. Đó là những gì _`'"#)!
dành cho. Nó sao chép khối, chuyển đổi nó thành một chuỗi, tìm kiếm ký tự "
(trong các quine lẫn nhau, chỉ xuất hiện bên ngoài khối) - tìm kiếm trả về -1
nếu không tìm thấy ký tự và một số nguyên dương -, làm tăng kết quả và phủ nhận nó một cách hợp lý. Vì vậy, nếu một "
đã được tìm thấy năng suất này 0
nếu không nó mang lại1
. Bây giờ chúng ta chỉ cần làm*
, thực thi khối một lần, nếu kết quả là 1 và hoàn toàn không.
Cuối cùng, đây là cách mã sửa đổi hoạt động:
_,94\m2/S*a_+\*N/23f/Wf%N*
_, "Duplicate the quine string and get its length.";
94\m "Subtract from 94.";
2/ "Divide by two.";
S* "Create a string with that many spaces. This will be
an empty string for the first mutual quine, and contain
23 spaces for the second mutual quine.";
a_+ "Create an array that contains this string twice.";
\* "Join the two copies together with the quine string.";
N/ "Split into lines.";
23f/ "Split each line into halves (23 bytes each).";
Wf% "Reverse the two halves of each line.";
N* "Join with a newline.";
Yêu cầu tiền thưởng, (12 x 10) * 48% = 57,6
Hóa ra mã này có thể được chia thành nhiều dòng rất dễ dàng với một số sửa đổi. Chúng tôi thêm 2 ký tự, để có 48 ký tự liên tiếp, sau đó chúng tôi có thể phân chia thuận tiện cho 8, để chúng tôi có 8 dòng với 6 ký tự mã và 6 khoảng trắng. Để làm điều đó, chúng ta cũng cần thay đổi một vài số và sắp xếp lại một hoặc hai toán tử để chúng không bị tách ra trên cả hai dòng. Điều đó mang lại cho chúng tôi một phiên bản hoạt động với kích thước 12 x 8 ... một yêu cầu. Vì vậy, chúng tôi chỉ cần thêm hai dòng không làm gì cả (đẩy 1, bật 1, đẩy 1, bật 1 ...), do đó, hãy đến 12 x 10 :
{`"_~"
+{129X
$,m2/S
*a_+\*
N/6f/1
;1;1;1
;1;1;1
;Wf%N*
}_`'"#
)!*}_~
Như cái trước, cái này tạo ra
{`"_~"
+{129X
$,m2/S
*a_+\*
N/6f/1
;1;1;1
;1;1;1
;Wf%N*
}_`'"#
)!*}_~
(Lưu ý bên: không cần phải xen kẽ trái và phải trên các đường trung gian, chỉ có vị trí của dòng đầu tiên và cuối cùng là quan trọng. Có thể chọn tùy ý trái và phải cho tất cả các dòng khác.)
Và thông qua sự trùng hợp hoàn toàn, quine đầy đủ cũng vẫn hoạt động:
{`"_~"{`"_~"
+{129X+{129X
$,m2/S$,m2/S
*a_+\**a_+\*
N/6f/1N/6f/1
;1;1;1;1;1;1
;1;1;1;1;1;1
;Wf%N*;Wf%N*
}_`'"#}_`'"#
)!*}_~)!*}_~
(Tôi nói sự trùng hợp, bởi vì phần quan tâm đến việc không thực thi mã bên trong bây giờ bị xen kẽ một cách kỳ lạ với các câu hỏi khác, nhưng nó vẫn hoạt động tốt.)
Điều đó đang được nói, tôi có thể chỉ cần thêm 44 dòng 1;
vào bản gốc của mình để đáp ứng yêu cầu tiền thưởng, nhưng 12 x 10
trông gọn gàng hơn nhiều. ;)
Chỉnh sửa: Haha, khi tôi nói "sự trùng hợp thuần túy", tôi không thể chú ý nhiều hơn. Tôi đã xem xét cách thức hoạt động cuối cùng thực sự hoạt động, và nó hoàn toàn vô lý. Có ba khối lồng nhau (4 khối thực sự, nhưng trong cùng là không liên quan). Phần quan trọng duy nhất trong cùng của 3 khối đó là nó chứa một "
(và không phải là khối mà nó đã làm trong bản đệ trình ban đầu, nhưng phần '"
cuối được sử dụng để kiểm tra cùng ký tự này). Vì vậy, cấu trúc cơ bản của quine là:
{`"_~"{`"_~"+{___'"___}_`'"#)!*}_~)!*}_~
Hãy mổ xẻ rằng:
{`"_~" }_~ "The standard CJam quine.";
{`"_~"+ }_~ "Another CJam quine. Provided it doesn't do
anything in the rest of that block, this
will leave this inner block as a string on
the stack.";
) "Slice the last character off the string.";
! "Negate... this yields 0.";
* "Repeat the string zero times.";
Vì vậy, điều này thực sự làm một số phép thuật vui nhộn, nhưng vì khối bên trong để lại một chuỗi duy nhất trên ngăn xếp, )!*
tình cờ biến nó thành một chuỗi trống. Điều kiện duy nhất là các công cụ trong khối bên trong sau +
đó không làm gì khác với ngăn xếp, vì vậy hãy xem xét điều đó:
{___'"___} "Push a block which happens to contain
quotes.";
_`'"#)!* "This is from the original code and just
removes the block if it does contain
quotes.";