Tulis quine urutan ketiga

17

Tantangan ini merupakan perpanjangan dari ' Golf a mutual quine '.

Menggunakan tiga bahasa pilihan Anda, buat program Ouroboros urutan ketiga .

Yaitu, dalam bahasa A, tulis program pA yang mengeluarkan program pB dalam bahasa B. Program pB harus menampilkan program pC dalam bahasa C, yang pada gilirannya menghasilkan program asli pA dalam bahasa A.

Tidak ada dua bahasa di A, B, dan C yang bisa sama atau himpunan bagian atau superset satu sama lain. Tidak ada pA, pB atau pC yang identik.

Misalnya, program Haskell menghasilkan program Perl yang menghasilkan program java yang menghasilkan program Haskell asli akan valid.

Di sisi lain, program C # 4 yang menghasilkan program C # 3 yang menghasilkan program C # 2 tidak valid. Bahkan Perl -> Ruby -> Kombinasi Bash tidak valid jika, katakanlah, program Perl dan program Ruby sama.

Ini kode golf, jadi pA program terpendek menang.

Peter Olson
sumber

Jawaban:

21

Python -> Perl -> Ruby, 48 karakter

Adaptasi jawaban saya sebelumnya . Lari

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

dengan Python menghasilkan cuplikan Perl ini

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

yang menghasilkan kode Ruby berikut

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

yang kemudian mencetak cuplikan Python asli:

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

Perl -> PHP -> HTML + JavaScript, 105 karakter

Saya ingin membuat rantai bahasa entah bagaimana bermakna, jadi saya pikir saya akan menulis skrip PHP yang menghasilkan halaman HTML yang berisi JavaScript. Untuk bahasa ketiga saya memilih Perl, hanya karena saya suka Perl. :)

Beberapa orang mungkin menganggap ini empat bahasa, tapi saya tidak benar-benar menghitung HTML sebagai terpisah dari JavaScript di sini - ini adalah bahasa markup, bukan bahasa pemrograman. Bagaimanapun, ini adalah tiga versi:

Perl (105 karakter):

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

PHP (165 karakter):

<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 karakter):

<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>

(Mz. Ya, saya tahu saya bisa membuat langkah PHP hampir-hampir tidak ada, misalnya hanya menghasilkan kode HTML + JS di Perl dan menambahkannya <?php, tetapi rasanya terlalu banyak seperti curang. Dalam solusi ini, kodenya sebenarnya diproses dalam PHP alih-alih hanya disalin kata demi kata.)

Ilmari Karonen
sumber
3

Underload → sed → Perl, 23 byte

Mungkin ini bisa lebih rendah dengan pilihan bahasa yang lebih baik. Bisa dibilang tidak bersaing karena aturan "program sed dapat mengambil baris kosong sebagai argumen" postdates kontes.

Program Underload:

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

menghasilkan program sed:

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

yang menghasilkan program Perl:

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


(catatan: ada dua trailing newlines di sini), yang menghasilkan program Underload asli lagi:

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

Tujuan utama di sini adalah untuk menemukan bahasa di mana string dapat bersarang (mis. Anda bisa mengutip sebuah string dengan melampirkannya dalam pembatas, daripada harus menghindarinya); Underload memiliki (), Perl memiliki q(), dan sed string terus sampai spasi putih (yang secara implisit nestable jika tidak ada spasi putih dalam program). Mungkin ada bahasa esolang atau golf di luar sana dengan instruksi "cetak sisa baris saat ini, tidak diikuti oleh baris baru", yang akan ideal di sini, tapi saya belum menghabiskan banyak waktu untuk mencari satu; Anda bisa menghemat 8 byte dikurangi panjang instruksi dalam kasus itu. (Jelly hampir berfungsi tetapi instruksinya tidak mengutip dirinya sendiri. Selain itu, postdates tantangannya.)

Anda dapat mengurangi ini menjadi 22 byte seperti ini:

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

(dengan satu trailing newline, seperti file teks biasa, daripada nol yang biasa Anda dapatkan di golf). Namun, ini membutuhkan penerjemah Underload yang tidak masalah dengan memperlakukan baris baru sebagai larangan. Coba online! Ya, tapi saya pikir itu tantangan pascatanggal.


sumber