Ba quines lẫn nhau


23

Nhiệm vụ

Trong thử thách này, nhiệm vụ của bạn là viết ba chương trình tạo thành một loại hệ thống giống nhau. Hãy gọi các chương trình A, BC. Nếu một trong các chương trình được cung cấp nguồn của chương trình khác làm đầu vào, thì nó sẽ xuất nguồn của chương trình thứ ba. Ví dụ, nếu Ađược đưa ra Blàm đầu vào, nó xuất ra C. Nếu các chương trình được cung cấp nguồn riêng của họ như là đầu vào, họ có trách nhiệm đầu ra ba chuỗi "three", "mutual""quines"(không có dấu ngoặc kép). Trong mọi trường hợp, họ có thể xuất thêm một dòng mới. Đối với bất kỳ đầu vào nào khác, các chương trình có thể làm bất cứ điều gì, kể cả sự cố.

Thí dụ

Ví dụ, giả sử rằng các mã nguồn A, BCaSdf, ghJkzxcV. Sau đó, các chương trình nên hành xử như sau.

Source Input  Output
--------------------
aSdf   aSdf   three
aSdf   ghJk   zxcV
aSdf   zxcV   ghJk
ghJk   aSdf   zxcV
ghJk   ghJk   mutual
ghJk   zxcV   aSdf
zxcV   aSdf   ghJk
zxcV   ghJk   aSdf
zxcV   zxcV   quines

Quy tắc và tính điểm

Các giải pháp A, BCcó thể là chức năng hoặc các chương trình đầy đủ, nhưng họ phải hoàn toàn độc lập: không có mã được chia sẻ được cho phép. Các quy tắc chuẩnquy tắc chuẩn được áp dụng, vì vậy các chương trình không thể truy cập mã nguồn của riêng họ theo bất kỳ cách nào.

Điểm số của bạn là số lượng byte kết hợp của A, BC, điểm số thấp hơn là tốt hơn.


Chính xác nghĩa là "không được phép chia sẻ mã"? Họ không thể có những phần tương tự? (Điều này sẽ khiến việc trả lời trong Java trở nên khó khăn, vì hầu hết các chương trình đều có một public static void mainphần ở đâu đó.) Hoặc chỉ là bạn không thể viết một hàm được gọi bởi cả ba?
Paŭlo Ebermann

@ PaŭloEbermann Có nghĩa là cái sau: mỗi chương trình nên có chức năng riêng.
Zgarb

Câu trả lời:


16

CJam, 165 147 114 108 99 byte

2 _ri^_q+@"quinesmutualthree"6/=?
1 _ri^_q+@"quinesmutualthree"6/=?
3 _ri^_q+@"quinesmutualthree"6/=?

Cảm ơn @ MartinBüttner cho một đề xuất giúp tiết kiệm 48 byte!

Hãy thử trực tuyến trong trình thông dịch CJam .

xác minh

$ cat A
2 _ri^_q+@"quinesmutualthree"6/=?
$ cat B
1 _ri^_q+@"quinesmutualthree"6/=?
$ cat C
3 _ri^_q+@"quinesmutualthree"6/=?
$ 

$ cjam A < A
three
$ cjam A < B
3 _ri^_q+@"quinesmutualthree"6/=?
$ cjam A < C
1 _ri^_q+@"quinesmutualthree"6/=?
$ 

$ cjam B < A
3 _ri^_q+@"quinesmutualthree"6/=?
$ cjam B < B
mutual
$ cjam B < C
2 _ri^_q+@"quinesmutualthree"6/=?
$ 

$ cjam C < A
1 _ri^_q+@"quinesmutualthree"6/=?
$ cjam C < B
2 _ri^_q+@"quinesmutualthree"6/=?
$ cjam C < C
quines

Ý kiến

Tập {0, 1, 2, 3} là một nhóm trong hoạt động ^ (nhị phân độc quyền OR), trong đó mỗi phần tử là nghịch đảo của chính nó.

Nếu cả ba chương trình giống hệt nhau ngoại trừ ký tự đầu tiên (một phần tử của {0, 1, 2, 3} ), chúng ta có thể phân biệt và in chúng dễ dàng:

  • Chúng tôi bắt đầu bằng cách XOR chữ số ở đầu mã nguồn và đầu vào.

  • Nếu kết quả là 0 , nguồn và đầu vào khớp.

    Vì vậy, chúng tôi in một trong ba từ, được chọn bởi chữ số phổ biến này.

  • Nếu kết quả không phải là 0 , thì đó là phần tử của {1, 2, 3} không nằm trong nguồn cũng như trong đầu vào.

    Vì vậy, chúng tôi in nó, tiếp theo là phần còn lại của đầu vào.

Làm thế nào nó hoạt động

2                                  e# Push the number N on the stack.
  _                                e# Push a copy.
    r                              e# Read a token from STDIN, i.e., the input up
                                   e# to and excluding the next whitespace char.
     i                             e# Cast to integer.
      ^                            e# XOR it with the copy of N. Result: X
       _                           e# Push a copy of the result.
        q+                         e# Append the rest of the input.
          @                        e# Rotate N on top of the stack.
           "quinesmutualthree"6/   e# Push ["quines" "mutual" "three"].
                                =  e# Select the word at index N.
                                 ? e# If X is non-zero, select the modified input;
                                   e# otherwise, select the word.

2
Ồ, tôi đã đọc câu hỏi và nghĩ rằng "không ai sẽ đưa ra câu trả lời cho điều đó." Sau đó tôi nhìn xuống và thấy một câu trả lời từ Dennis (ai khác?) +1!
Cấp sông St
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.