Viết một quine thứ ba


17

Thử thách này là một phần mở rộng của ' Golf a quine lẫn nhau '.

Sử dụng ba ngôn ngữ bạn chọn, tạo chương trình Ouroboros thứ ba .

Nghĩa là, trong ngôn ngữ A, hãy viết chương trình pA tạo ra chương trình pB bằng ngôn ngữ B. Chương trình pB sẽ xuất chương trình pC bằng ngôn ngữ C, từ đó tạo ra chương trình gốc pA bằng ngôn ngữ A.

Không có hai ngôn ngữ trong A, B và C có thể giống nhau hoặc tập hợp con hoặc siêu bộ của nhau. Không có pA, pB hoặc pC có thể giống hệt nhau.

Ví dụ, chương trình Haskell xuất ra chương trình Perl, chương trình java xuất ra chương trình Haskell ban đầu sẽ hợp lệ.

Mặt khác, chương trình C # 4 tạo ra chương trình C # 3 tạo ra chương trình C # 2 không hợp lệ. Ngay cả một kết hợp Perl -> Ruby -> Bash sẽ không hợp lệ nếu, giả sử, chương trình Perl và chương trình Ruby giống hệt nhau.

Đây là mã golf, vì vậy chương trình pA ngắn nhất sẽ thắng.


Câu trả lời:


21

Python -> Perl -> Ruby, 48 ký tự

Thích ứng với câu trả lời trước của tôi . Đang chạy

s='print q<puts %%q{s=%r;print s%%s}>';print s%s

với Python tạo đoạn mã Perl này

print q<puts %q{s='print q<puts %%q{s=%r;print s%%s}>';print s%s}>

tạo mã Ruby sau

puts %q{s='print q<puts %%q{s=%r;print s%%s}>';print s%s}

sau đó in đoạn mã Python gốc:

diff -s <(ruby <(perl <(python thirdorderquine.py))) thirdorderquine.py 
Files /dev/fd/63 and thirdorderquine.py are identical

13

Perl -> PHP -> HTML + JavaScript, 105 ký tự

Tôi muốn làm cho chuỗi ngôn ngữ bằng cách nào đó có ý nghĩa, vì vậy tôi đã hình dung rằng tôi sẽ viết một tập lệnh PHP tạo ra một trang HTML có chứa JavaScript. Đối với ngôn ngữ thứ ba tôi chọn Perl, chỉ vì tôi thích Perl. :)

Một số người có thể xem xét bốn ngôn ngữ này, nhưng tôi thực sự không coi HTML là tách biệt với JavaScript ở đây - đó là ngôn ngữ đánh dấu, không phải ngôn ngữ lập trình. Dù sao, đây là ba phiên bản:

Perl (105 ký tự):

printf+(q(<script>alert(unescape("<?=urlencode(<<<E%sprintf+(q(%s),$/)x2,$/%sE%s)?>"))</script>),$/)x2,$/

PHP (165 ký tự):

<script>alert(unescape("<?=urlencode(<<<E
printf+(q(<script>alert(unescape("<?=urlencode(<<<E%sprintf+(q(%s),$/)x2,$/%sE%s)?>"))</script>),$/)x2,$/
E
)?>"))</script>

HTML + JavaScript (235 ký tự):

<script>alert(unescape("printf%2B%28q%28%3Cscript%3Ealert%28unescape%28%22%3C%3F%3Durlencode%28%3C%3C%3CE%25sprintf%2B%28q%28%25s%29%2C%24%2F%29x2%2C%24%2F%25sE%25s%29%3F%3E%22%29%29%3C%2Fscript%3E%29%2C%24%2F%29x2%2C%24%2F"))</script>

(Ps. Vâng, tôi biết rằng tôi có thể biến PHP thành một bước gần như không có, ví dụ như chỉ tạo mã HTML + JS trong Perl và nối thêm <?phpvào nó, nhưng điều đó cảm thấy quá giống như gian lận. Trong giải pháp này, mã thực sự là mã được xử lý bằng PHP thay vì chỉ được sao chép nguyên văn.)


3

Tải trọng → sed → Perl, 23 byte

Có lẽ có thể làm cho điều này xuống thấp hơn với sự lựa chọn ngôn ngữ tốt hơn. Không thể giải thích được vì quy tắc "chương trình sed có thể lấy một dòng trống làm đối số" hoãn cuộc thi.

Chương trình Underload:

((iprint+q)Sa(:^)*aS):^

tạo chương trình sed:

iprint+q(((iprint+q)Sa(:^)*aS):^)

tạo ra chương trình Perl:

in + q (((in + q) Sa (: ^) * aS): ^)


(lưu ý: có hai dòng mới ở đây), tạo lại chương trình Underload gốc:

((iprint+q)Sa(:^)*aS):^

Mục đích chính ở đây là tìm các ngôn ngữ trong đó các chuỗi có thể lồng nhau (nghĩa là bạn chỉ có thể trích dẫn một chuỗi bằng cách đặt nó trong các dấu phân cách, thay vì phải thoát nó); Underload có (), Perl có q(), và trong sed, một chuỗi tiếp tục cho đến khoảng trắng (hoàn toàn có thể lồng nhau nếu không có khoảng trắng trong chương trình). Có lẽ có một ngôn ngữ esolang hoặc golf ngoài kia với một hướng dẫn "in phần còn lại của dòng hiện tại, không theo hướng dẫn mới", sẽ rất lý tưởng ở đây, nhưng tôi đã không dành nhiều thời gian để tìm kiếm một; bạn có thể lưu 8 byte trừ đi độ dài của lệnh trong trường hợp đó. (Jelly gần như hoạt động nhưng hướng dẫn của nó không tự trích dẫn. Bên cạnh đó, nó hoãn lại thử thách.)

Bạn có thể giảm xuống còn 22 byte như thế này:

((csay + q) Sa (: ^) * aS): ^

(với một dòng mới, như một tệp văn bản thông thường, thay vì số 0 bạn thường có trong golf). Tuy nhiên, điều này đòi hỏi một trình thông dịch Underload phù hợp với việc coi dòng mới là không có. Hãy thử trực tuyến! Nhưng tôi nghĩ nó sẽ hoãn thử thách.

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.