Pemeriksa quine meta

10

Tantangan ini, jika Anda menerimanya, adalah menulis tiga fungsi atau program A, B, dan C:

  • A adalah quine yang menampilkan semua A, B dan C (yang juga merupakan seluruh konten kode dalam kiriman Anda).
  • B mengambil parameter F dan memeriksa apakah itu quine (menghasilkan FBC), atau melakukan sesuatu yang berbeda.
  • C mengambil parameter G dan memeriksa apakah G mungkin bekerja seperti B (memeriksa apakah F menghasilkan FGC). Tidak mungkin untuk memutuskan apakah suatu fungsi adalah pemeriksa quine, jadi mari kita lakukan sesuatu yang lebih sederhana:
    • Ini harus mengembalikan kebenaran jika G valid untuk B.
    • Itu harus mengembalikan falsey jika G mengembalikan falsey untuk semua quines yang valid, atau G mengembalikan truey untuk semua non-quines yang valid.
    • Itu dapat mengembalikan apa pun, crash atau tidak berakhir, dll, jika itu adalah salah satu dari kasus lain.

Perhatikan bahwa B mungkin. A dan F tidak memiliki input apa pun, jadi Anda bisa menjalankannya dan memeriksa hasilnya.

Aturan

  • Harus ada cara untuk mengetahui bagian mana yang A, B dan C dari output A. Misalnya: masing-masing memiliki satu baris, atau mereka dikenali sebagai tiga fungsi dalam interpreter.
  • Setiap fungsi harus dijalankan dengan hanya definisi itu sendiri, bukan kode lengkap Anda.
  • Anda dapat menggunakan fungsi / program atau kode sumbernya, atau sepasang keduanya sebagai input B (atau G) dan C.
  • Anda bisa mendefinisikan kembali truthy / falsey ke subset dari nilai-nilai itu. Anda juga dapat secara konsisten meminta F untuk mengembalikan beberapa jenis yang Anda pilih, seperti string tunggal.
  • Anda dapat meminta A, B, F dan G, jika mereka dipanggil dengan parameter yang valid, secara konsisten tidak memiliki beberapa jenis input lain atau efek samping yang Anda pilih, seperti mengakses variabel global, atau membaca stdin, dll.
  • Anda juga dapat mengasumsikan F dan G, jika mereka dipanggil dengan parameter yang valid, selalu berakhir.
  • F harus bekerja dalam kondisi yang sama dengan A. Jadi tidak dapat bergantung pada B atau C atau keberadaan variabel lain, kecuali variabel itu didefinisikan pada bagiannya sendiri dalam outputnya.
  • Tidak ada fungsi atau program yang dapat membaca kode sumbernya sendiri.
  • Ini adalah kode-golf, kode terpendek (yang merupakan output dari A) dalam byte yang menang.
jimmy23013
sumber
B masih tidak mungkin secara umum karena F mungkin tidak berakhir, juga dalam praktik dalam banyak bahasa karena memerlukan kombinasi kemampuan seperti pengalihan sementara stdout dan fungsi-ke-string atau exec. Yang terbaik yang bisa Anda harapkan mungkin adalah solusi setengah bekerja dalam LISP.
Peter Taylor
Bagaimana Anda memeriksa G dengan semua quines dan non-quines? Saat ini saya sedang mengerjakan solusi Mathematica.
LegionMammal978
@PeterTaylor "Anda juga dapat mengasumsikan F dan G, jika mereka dipanggil dengan parameter yang valid, selalu berakhir." Dan "output" dapat berarti kembali, belum tentu mencetak ke stdout.
jimmy23013
@ LegionMammal978 Tidak mungkin untuk memeriksa semua quines dan non-quines. Tetapi tugas C adalah sesuatu yang lebih sederhana, di mana Anda hanya perlu memeriksa satu quine dan satu non-quine.
jimmy23013
1
@PyRulez Saya pikir ini adalah semangat dari tantangan ini, jadi saya akan mengizinkannya. Tetapi fungsi tidak dapat mengakses kode sumbernya sendiri.
jimmy23013

Jawaban:

1

CJam, 254 byte

Contoh jawaban, bukan golf.

{{['{\"_~}{{[1$'{@\"_~}"{{["_~}"2$+'{@"_~}"]s`"{{['{\\"\+"]s}_~}"+~1$~{L}@~!&}_~}_``1>W<"\"]s\~=}_~}"@]s}_~}{{[1$'{@"_~}{{[\"_~}\"2$+'{@\"_~}\"]s`\"{{['{\\\\\"\+\"]s}_~}\"+~1$~{L}@~!&}_~}"]s\~=}_~}{{["_~}"2$+'{@"_~}"]s`"{{['{\\"\+"]s}_~}"+~1$~{L}@~!&}_~}

3 fungsi tersebut adalah:

{{['{\"_~}{{[1$'{@\"_~}"{{["_~}"2$+'{@"_~}"]s`"{{['{\\"\+"]s}_~}"+~1$~{L}@~!&}_~}_``1>W<"\"]s\~=}_~}"@]s}_~}
{{[1$'{@"_~}{{[\"_~}\"2$+'{@\"_~}\"]s`\"{{['{\\\\\"\+\"]s}_~}\"+~1$~{L}@~!&}_~}"]s\~=}_~}
{{["_~}"2$+'{@"_~}"]s`"{{['{\\"\+"]s}_~}"+~1$~{L}@~!&}_~}

A dan F tidak mengambil parameter dan mengembalikan string. B, G dan C mengambil blok CJam sebagai parameter dan mengembalikan 1 untuk truey, atau 0 untuk falsey.

jimmy23013
sumber