Tiga quines mutual

23

Tugas

Dalam tantangan ini, tugas Anda adalah menulis tiga program yang membentuk semacam sistem quine-like. Mari kita panggil programnya A, Bdan C. Jika salah satu program diberi sumber program lain sebagai input, itu akan menampilkan sumber program ketiga. Sebagai contoh, jika Adiberikan Bsebagai input, itu output C. Jika program yang diberikan sumber mereka sendiri sebagai masukan, mereka akan output tiga senar "three", "mutual"dan "quines"(tanpa tanda kutip). Dalam semua kasus, mereka dapat menampilkan satu baris tambahan tambahan. Untuk input lainnya, program dapat melakukan apa saja, termasuk crash.

Contoh

Misalnya, bahwa kode sumber A, Bdan Cyang aSdf, ghJkdan zxcV. Maka program harus berperilaku sebagai berikut.

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

Aturan dan penilaian

Solusi A, Bdan Cdapat berupa fungsi atau program lengkap, tetapi harus sepenuhnya independen: tidak ada kode bersama yang diizinkan. Celah standar dan aturan Quine berlaku, sehingga program tidak dapat mengakses kode sumber mereka sendiri dengan cara apapun.

Skor Anda adalah jumlah byte gabungan A, Bdan Cskor yang lebih rendah menjadi lebih baik.

Zgarb
sumber
Apa sebenarnya artinya "tidak ada kode bersama yang diizinkan"? Tidak bisakah mereka memiliki bagian yang serupa? (Ini akan membuat menjawab di Jawa sulit, karena sebagian besar program memiliki public static void mainbagian di suatu tempat.) Atau hanya Anda tidak dapat menulis fungsi yang disebut oleh ketiganya?
Paŭlo Ebermann
@ PaŭloEbermann Ini berarti yang terakhir: masing-masing dari 3 program harus fungsional sendiri.
Zgarb

Jawaban:

16

CJam, 165 147 114 108 99 byte

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

Terima kasih kepada @ MartinBüttner untuk saran yang membantu menghemat 48 byte!

Cobalah online di juru bahasa CJam .

Verifikasi

$ 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

Ide

Set {0, 1, 2, 3} adalah grup di bawah operasi ^ (eksklusif biner OR), di mana setiap elemen adalah kebalikannya sendiri.

Jika ketiga program identik kecuali untuk karakter pertama (elemen dari {0, 1, 2, 3} ), kita dapat membedakan dan mencetaknya dengan mudah:

  • Kita mulai dengan XORing digit di awal kode sumber dan input.

  • Jika hasilnya dalam 0 , sumber dan input cocok.

    Jadi, kami mencetak satu dari tiga kata, yang dipilih oleh digit umum ini.

  • Jika hasilnya bukan 0 , itu adalah elemen {1, 2, 3} yang tidak ada di sumber maupun di input.

    Jadi, kami mencetaknya, diikuti oleh sisa input.

Bagaimana itu bekerja

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.
Dennis
sumber
2
Wow, saya membaca pertanyaan dan berpikir "tidak ada yang akan datang dengan jawaban untuk itu." Lalu saya melihat ke bawah dan melihat jawaban dari Dennis (siapa lagi?) +1!
Level River St