Golf cho bạn một đôi Quine cho tốt hơn!


18

Chào buổi tối quý ông và quý bà.

Tối nay - chúng tôi có một thử thách mã. Một cuộc thi sẽ được xác định không phải bằng số điểm (a la Asteroid) mà đơn giản là liệu bạn có thể hoàn thành nó hay không (a la Zelda). Và để so sánh, số lượng byte (uh ... nhưng bạn đã nói ...).

Thách thức của bạn là soạn ra một quine duy nhất biên dịch bằng cả WhiteSpace và bất kỳ ngôn ngữ nào khác bạn chọn. Cả hai quine phải có đầu ra hoàn toàn giống nhau (mà như một quine hoàn toàn giống với mã nguồn). Quine của bạn phải dài hơn 3 byte.

Điểm của bạn là kích thước của mã nguồn tính theo byte.

Cho rằng thách thức này liên quan đến WhiteSpace, vui lòng thoát câu trả lời của bạn để chúng rõ ràng - tốt nhất là theo kiểu C. Điểm của bạn là nguồn ban đầu tính bằng byte - không phải là phiên bản thoát.

Chúc may mắn.


1
Một kết xuất hex xxd sẽ làm gì?
Ilmari Karonen

Đúng. Tôi sẽ chấp nhận nó.
lochok

Câu trả lời:


19

Khoảng trắng và Perl, 992 975 ký tự

Chào buổi tối quý ông và quý bà.

Để bắt đầu, đây là bài nộp của tôi được mã hóa trong base64, mà tôi cảm thấy là cách tốt nhất để truyền đạt một chương trình Whitespace lớn. (Bạn thực sự không muốn sử dụng một mã hóa để lại bất kỳ khoảng trắng nào, vì vậy không có điểm nào trong việc chọn thứ gì đó "dễ đọc" hơn.)

c2F5PDwgeDI7c2F5PDwwLDAgIApzYXk8PCB4MjtzYXk8PDAsMCAgCgoJCQogICAJCSAgCSAgCSAJ
CSAgCSAgCQkgCSAJIAkJCQkJICAJCSAJCQkgCQkJCQkgCSAJIAkJIAkgCSAgIAkJCQkJICAgCQkg
IAkgCQkgCSAJCSAJICAgIAkJCQkgCSAgCSAJCSAJICAgIAkgCQkgICAJICAgICAgCQkJIAkJCQkJ
IAkJCSAJCQkJICAgICAJCQkgCSAgICAgIAkJCQkJICAgICAgCQkgICAJCSAgICAJCQkJCQkJCSAg
CSAJIAkgICAJCQkgICAJCQkJCSAgCQkJCSAJICAgIAkgCQkJCQkgCSAgICAgCSAgCSAJICAgICAg
CSAgICAJICAgICAJCSAgIAkJCSAJIAkJCQkJCSAJCSAJIAkgICAgICAgCQkgIAkgICAgICAgICAg
IAkJICAgCSAJCQkgCSAgICAgCQkJCQkJIAkgICAgCQkJCSAJCQkJICAJCQkgICAJCQkgCSAgCSAg
IAkJCQkgIAkJIAkJCSAgIAkJCSAJCQkgCQkJICAJCSAJICAJIAkJCSAJIAkgCQkgICAgIAkgCSAJ
ICAJICAJIAkJICAgICAJIAkgICAgCQkJCSAgCSAJCSAJIAkJIAkgIAkgCSAJCSAJCSAJCSAJCQkg
CQkJICAgIAkJCSAgCSAgCQogICAJICAgICAJCQkJCSAJCSAJIAkgCSAJICAJCQkgICAJICAgCSAg
ICAJCSAJICAgICAgICAgCSAgIAkJCQkgCQkgICAgCQkgCSAJICAJCQkgCQkJCSAJCQkgICAJICAg
IAkgCSAJCQkgIAkJCQkgCSAJCSAJIAkgCQkJCSAJICAJIAkJIAkgICAJCiAKICAKICAgIAogCSAg
CQoKICAJCiAKICAgIAkJCQkgCSAKCSAJCQkKICAgICAJCQkJIAkgCgkgCSAgCiAgIAkJCgkgIAoK
CQkJCiAKCgoJIAkKICAgCSAgIAkgIAoKIAkKIAkgIAkKCiAJIAogICAJIAoKIAkKCiAJIAoKIAkK
CQogCSAgIAkgCgogCQoKCgoKICAgCiAgIAogCiAKIAkKCiAJCgogICAgCiAKIAoJIAogCiAgICAJ
IAoJIAkJIAoJICAgCSAKCSAJIAogCSAgCgogIAogCiAgICAJCQoJIAkJICAJCSAJCQkKCSAgCiAg
CQkJICAgCgkgCQkgICAJICAgICAKCSAgIAkKICAgICAJCQoJIAkgIAogICAJCQoJICAKCgkJCiAK
CgoJCjAK

Đây là một đoạn trích làm nổi bật tất cả các phần có thể nhìn thấy của nguồn. được sử dụng để chỉ ra một tab và để chỉ ra một dòng mới.

say<< x2;say<<0,0  ↲
say<< x2;say<<0,0  ↲
↲
⇥⇥↲
   ⇥⇥  ⇥ [... etcetera ... skipping rest of a really long line ...]↲
   ⇥⇥⇥ ⇥⇥[... etcetera ... shorter but still quite a long line ...]↲
 ↲
  ↲
    ↲
 ⇥  ⇥↲
[... etcetera ... whole lotta whitespace in here ...]
⇥⇥↲
 ↲
↲
↲
⇥↲
0↲

Perl là sự lựa chọn tự nhiên cho ngôn ngữ thứ hai trong thử thách này, là một trong những ngôn ngữ có mục đích chung tốt nhất để viết các câu hỏi nhỏ gọn. Quine Perl ngắn nhất của tôi là 19 byte:

say<< x2
say<< x2
 

- và bạn có thể thấy nó là hạt giống cho nửa Perl của quine đôi. So sánh, khoảng trắng khoảng trắng tốt nhất của tôi là 541 byte. (Mặc dù những cái ngắn hơn tồn tại - 445 byte là thứ tốt nhất tôi từng thấy.)

Từ quan điểm của trình thông dịch Perl, dòng đầu tiên của tệp nguồn của quine kép chứa hai câu lệnh tạo nên toàn bộ chương trình, vì các nội dung còn lại là hai chuỗi được trích dẫn. Chuỗi đầu tiên là dòng lặp lại của Perl và được phân định bởi dòng thứ ba trống. Chuỗi thứ hai là tất cả các khoảng trắng và chạy từ dòng thứ tư của nguồn đến 0dấu phân cách ở dưới cùng của tệp.

Khi được coi là một chương trình Whitespace, bốn dòng đầu tiên chứa ba hướng dẫn phần lớn là vô dụng. (Tác dụng của chúng là đẩy hai giá trị 0 lên ngăn xếp, sau đó loại bỏ giá trị thứ hai.) Chúng được đưa vào để vượt qua các dòng mới mà chương trình Perl yêu cầu - chương trình thực bắt đầu sau đó. Thay vì trích dẫn nguồn không thể đọc thêm được nữa, đây là phần diễn giải các hướng dẫn tạo nên chương trình Whitespace, theo định dạng giống như lắp ráp:

# Representation of "say<< ;say<<0,0  \n" in base 122 as ASCII chars.
PERLCODE = 44892457841068708924520433691075560592081

# Represention of the whitespace program, following the "push PERLCODE"
# instruction, in base 3 (see comments on wsout).
WSCODE = 9823454421986355730445143846606456399449033186160554878002671428613111806443504867738858766142050504887335990409088441824104338753030405625930185

# Set up the stack and the heap. The first three instructions are not
# particularly useful; they're just there to skip past the newlines in
# the Perl code. (Though the initial zero on the stack does get used
# at the very end.)

        push    0
        push    0
        jneg    wsout

        push    WSCODE
        push    PERLCODE
        dup
        dup
        push    0
        copy    1

# Output the first four lines of the file.

perl:   dup
        mod     122
        putchar
        div     122
        dup
        jnzero  perl
        pop
        jzero   perl
        push    68              # represents "jneg wsout"
        call    wsout

# Output the rest of the file.

        copy    1
        call    pushout
        push    2
        call    wsout
        call    pushout
        call    wsout
        putnum
        push    2
        call    wsout
        exit

# pushout: Output a Whitespace push instruction, using the number on
# the top of the stack as the instruction's argument. (Recursion is
# used to output the bits MSB-first.)

pushout:
        push    0
        dup
        call    wsout
        call    wsout
bits:   dup
        jzero   bitend
        dup
        mod     2
        swap
        div     2
        call    bits
bitend: call    wsout
        ret

# wsout: Output a sequence of whitespace characters as represented by
# the number on the top of the stack. The number is read in base 3,
# LSB-first, with 0 = SPC, 1 = TAB, 2 = NL. Calling wsout with a value
# of zero will output a single space.

wsout:
        dup
        mod     3
        mul     -23             # some ugly math that transforms
        mod     -24             # (0, 1, 2) into (32, 9, 10)
        add     32
        putchar
        div     3
        dup
        jnzero  wsout
        pop
        ret

Những con số khổng lồ ở trên cùng là những gì chúng tôi người dùng Whitespace phải sử dụng thay cho các chuỗi thực tế. Đừng cố gắng chạy cái này trên một trình thông dịch Whitespace không có hỗ trợ bignum thích hợp.

Cuối cùng, đây là chương trình một lần nữa, nhưng lần này với lối thoát kiểu C, vì nó được yêu cầu cụ thể:

say<< x2;say<<0,0  \nsay<< x2;say<<0,0  \n\n\t\t\n   \t\t  \t  \t \t\t  \t  \t\t \t \t \t\t\t\t\t  \t\t \t\t\t \t\t\t\t\t \t \t \t\t \t \t   \t\t\t\t\t   \t\t  \t \t\t \t \t\t \t    \t\t\t\t \t  \t \t\t \t    \t \t\t   \t      \t\t\t \t\t\t\t\t \t\t\t \t\t\t\t     \t\t\t \t      \t\t\t\t\t      \t\t   \t\t    \t\t\t\t\t\t\t\t  \t \t \t   \t\t\t   \t\t\t\t\t  \t\t\t\t \t    \t \t\t\t\t\t \t     \t  \t \t      \t    \t     \t\t   \t\t\t \t \t\t\t\t\t\t \t\t \t \t       \t\t  \t           \t\t   \t \t\t\t \t     \t\t\t\t\t\t \t    \t\t\t\t \t\t\t\t  \t\t\t   \t\t\t \t  \t   \t\t\t\t  \t\t \t\t\t   \t\t\t \t\t\t \t\t\t  \t\t \t  \t \t\t\t \t \t \t\t     \t \t \t  \t  \t \t\t     \t \t    \t\t\t\t  \t \t\t \t \t\t \t  \t \t \t\t \t\t \t\t \t\t\t \t\t\t    \t\t\t  \t  \t\n   \t     \t\t\t\t\t \t\t \t \t \t \t  \t\t\t   \t   \t    \t\t \t         \t   \t\t\t\t \t\t    \t\t \t \t  \t\t\t \t\t\t\t \t\t\t   \t    \t \t \t\t\t  \t\t\t\t \t \t\t \t \t \t\t\t\t \t  \t \t\t \t   \t\n \n  \n    \n \t  \t\n\n  \t\n \n    \t\t\t\t \t \n\t \t\t\t\n     \t\t\t\t \t \n\t \t  \n   \t\t\n\t  \n\n\t\t\t\n \n\n\n\t \t\n   \t   \t  \n\n \t\n \t  \t\n\n \t \n   \t \n\n \t\n\n \t \n\n \t\n\t\n \t   \t \n\n \t\n\n\n\n\n   \n   \n \n \n \t\n\n \t\n\n    \n \n \n\t \n \n    \t \n\t \t\t \n\t   \t \n\t \t \n \t  \n\n  \n \n    \t\t\n\t \t\t  \t\t \t\t\t\n\t  \n  \t\t\t   \n\t \t\t   \t     \n\t   \t\n     \t\t\n\t \t  \n   \t\t\n\t  \n\n\t\t\n \n\n\n\t\n0\n

2
Ồ Tôi nghĩ brainfuck sẽ là giải pháp đầu tiên.
gian hàng

1
Tôi đã nghĩ về nó, nhưng vấn đề là các quines Brainfuck thậm chí còn dài hơn các quines Whitespace. Giữa hai người họ, kết quả sẽ rất lớn.
hộp bánh mì
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.