Đôi khe Quine


11

Mục tiêu:

Mã hai chương trình trong đó mỗi chương trình xuất ra cả hai mã nguồn được đặt xen kẽ cho mỗi ký tự như khóa kéo, Quine hai khe. Đầu ra từ Quine Double-slit đang bắt đầu với ký tự đầu tiên từ mã nguồn của chương trình đầu tiên. Nếu mã nguồn của một trong các chương trình có độ dài ngắn hơn các chương trình kia, thì phần còn lại của đầu ra phải được điền với phần còn lại của mã nguồn dài hơn.

Quy tắc:

  1. Bạn có thể sử dụng bất kỳ ngôn ngữ lập trình nào cho cả hai chương trình, không cần thiết phải có cùng ngôn ngữ lập trình cho cả hai.
  2. Các chương trình của bạn không nên lấy bất kỳ đầu vào nào từ một tệp, tên tệp, mạng, chương trình khác hoặc bất cứ thứ gì khác.

Tiêu chí bắt buộc:

  • Có một lưu ý, ở đâu đó trong đầu ra, chữ QUINEin hoa phải tồn tại, không bị gián đoạn.
  • Bạn cần nói rõ hai ngôn ngữ lập trình bạn đang sử dụng. Nếu bạn đang sử dụng cùng một ngôn ngữ lập trình cho cả hai, thì bạn chỉ cần nêu một ngôn ngữ lập trình.
  • Cả hai chương trình sẽ có thể thực thi hoặc được diễn giải tương ứng độc lập với chương trình khác.

Thí dụ:

Có ví dụ mã nguồn của chương trình một :

"QIE"

Có ví dụ mã nguồn của chương trình hai :

"UN"

Sau đó, đầu ra Quine Double-Slit hợp lệ từ cả hai chương trình phải là:

""QUINE""

Đây là mã golf, ít byte nhất khi tính tổng độ dài của cả hai mã nguồn và rõ ràng cũng là độ dài của mỗi đầu ra chương trình, sẽ thắng!


Mỗi chương trình cá nhân không phải là một quine cũng được, đúng không? Và mỗi chương trình phải chứa ít nhất một ký tự?
mbomb007

@ mbomb007 Đúng vậy. Mỗi chương trình riêng lẻ nên xuất cả hai ký tự mã nguồn như khóa kéo từ đầu đến cuối. Chà, tôi đoán bạn sẽ cần ít nhất 1 byte bằng ngôn ngữ lập trình để xuất QUINE? Đầu ra từ cả hai chương trình phải giống hệt nhau.
Plarsen

Tôi không chắc chắn tôi hiểu phần còn lại của đầu ra phải được điền với phần còn lại của mã nguồn dài hơn một cách chính xác. Làm thế nào sẽ AXYZđược xen kẽ? AXYZ?
Dennis

@Dennis Giống như .+hoặc zhoạt động
Trình tối ưu hóa

@Dennis Đúng. Những gì còn lại từ mã nguồn dài hơn khi hết byte ngắn hơn phải được thêm vào đầu ra từ cả hai chương trình.
Plarsen

Câu trả lời:


9

CJam, 49 47 byte

{`:_"__~~e#QUINE"}_~

{`:_"__~~e#QUINE"}_~e#QUINE

cả in

{{``""__~~""++::__""ee##QQUUIINNEE""}}__~~e#QUINE

Dùng thử trực tuyến: chương trình 1 , chương trình 2 , bằng chứng về tính hợp lệ

Chúng hoạt động như thế nào

{                }   e# Push a code block.
                  _~ e# Execute a copy.
 `                   e# Convert the code block into a string.
  :_                 e# Duplicate each character of the resulting string.
    "__~~e#QUINE"    e# Push this string.

Chương trình 1 kết thúc tại đây và có một chuỗi đại diện cho toàn bộ mã nguồn của nó (mỗi ký tự được lặp lại hai lần) cũng như chuỗi e # QUINE trên ngăn xếp.

Chương trình 2 phân tích thêm e#QUINE, đó là một nhận xét.

Trong cả hai trường hợp, CJam tự động in hai chuỗi, dẫn đến đầu ra nói trên.


4

Nghiêm túc, 46 56 42 byte

QUNX;RZtdXεj.ƒ£REIQ

Bãi rác Hex:

51554e583b525a746458ee6a2e7f9f9c524549510a

Chương trình thứ hai là chương trình chính xác này đảo ngược. Nó không chứa một ký tự vô hình, nhưng số byte là chính xác. Cả hai chương trình đều xuất chuỗi palindromic này:


QQUINEXR;£RƒZ⌂t.djXεεXjd.t⌂ZƒR£;RXENIUQQ

(Vì một số lý do, nó sẽ hiển thị ký tự vô hình khi nó xuất nó trong thiết bị đầu cuối của tôi. Tôi thực sự không hiểu rằng byte 7F đó.)

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

Q                     Push the source to the stack
 U                    Nop
  NX                  Push and pop lyrics to 99 bottles of beer
    ;R                Make a copy of the source reversed.
      Z               Zip them together.
       t              Completely flatten the list.
        dX            Delete the trailing newline
          εj          Join it into a string.
            .         Print it with a trailing newline.
             ⌂        (This is that 7F byte that won't show up. It halts.)

Phần còn lại của chương trình không được thực hiện.

Rồi hướng khác:

\n                   Nop
  Q                  Push the source code.
   IE                Nops
     R               Reverse source code to get source of first program
      £              Eval it into a function
       ƒ             Call it.

Tại thời điểm này, chúng tôi hiện đang chạy chương trình đầu tiên ở trên, vì vậy việc thực thi tiếp tục như được mô tả ở đó.

Tôi đang khai thác rất nhiều thực tế là một số lệnh không làm gì với chuỗi hoặc ngăn xếp trống ở đây. Tôi cũng khai thác hành vi bất ngờ tkhi chỉ có một mục trên ngăn xếp. Đừng mong đợi chương trình này hoạt động trong các phiên bản tương lai của Nghiêm túc.

Khi phiên bản trực tuyến của trình thông dịch Nghiêm túc tiếp tục bị hỏng, bạn sẽ phải tải xuống trình thông dịch và chạy nó trên máy của chính bạn để kiểm tra.


@Dennis bạn đã kiểm tra nó trên máy tính của bạn? Đó có thể là một tạo tác của môi trường xây dựng của riêng tôi.
quintopia

@Dennis nvm bạn nói đúng. Tất cả các phương thức đầu ra của Nghiêm túc thêm một nguồn cấp dữ liệu. Tôi có thể sửa nó với chi phí 8 byte. Có vẻ như phương pháp của bạn sẽ ngắn hơn (thật đáng buồn vì phương pháp này mát hơn IMO).
quintopia

1

GolfScript, 46 byte

{`{.}%"..~~QUINE"}.~

{`{.}%"..~~QUINE"}.~QUINE

cả in

{{``{{..}}%%""....~~~~QQUUIINNEE""}}..~~QUINE

Dùng thử trực tuyến: chương trình 1 , chương trình 2 , bằng chứng về tính hợp lệ

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

{`{.}%"..~~QUINE"}.~

{                }    # Push a code block.
                  .~  # Execute a copy.
 `                    # Convert the code block into a string.
  {.}%                # Duplicate each character of the resulting string.
      "..~~QUINE"     # Push that string.

Mã nguồn của chương trình 2 phân tích bổ sung QUINE\n, là hai mã thông báo không xác định.


1

Perl, 61 + 60 = 121 byte

Chương trình 1:

$x=q<print"\$x=q<$x>;eval\$x#"=~s/./$&$&/gr,QUINE>;eval$x#QIE

Chương trình 2:

$x=q<print"\$x=q<$x>;eval\$x#"=~s/./$&$&/gr,QUINE>;eval$x#UN

Tôi nghĩ rằng tôi sẽ thực hiện điều này bằng một ngôn ngữ không chơi gôn. Về cơ bản, đây chỉ là một hàm tạo quine phổ biến trong Perl được sửa đổi để nhân đôi mọi ký tự trước khi in nó và nối QUINEvào cuối. Sau đó, chúng ta chỉ cần dán một nhận xét ở cuối mã để bù cho văn bản đã thêm.

(Tôi đã viết điều này mà không thực sự nhìn vào các câu trả lời khác. Hóa ra có thể lưu một byte bằng cách đặt toàn bộ nhận xét trong một chương trình, nhưng tôi không chắc liệu mình có nên sao chép thuật toán một cách trắng trợn như vậy không.)

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.