Ini adalah tantangan kode-golf di mana Anda perlu menyusun program yang bertindak seperti quine atau quine yang memodifikasi dirinya sendiri untuk menggambarkan pembelajaran mesin.
Latar Belakang
Ada program kecerdasan buatan dasar yang disebut 'permainan trenggiling' yang dijelaskan di sini . Ide dasarnya adalah program saat dijalankan pertama kali bertanya:
OKE, tolong pikirkan sesuatu
Apakah itu trenggiling?
Anda kemudian dapat menjawab:
iya nih
Dalam hal ini dikatakan:
Baik. Itu sangat mudah.
Atau jika tidak tertulis:
Oh Nah Anda menang kemudian - Apa yang Anda pikirkan?
Yang bisa Anda katakan:
anjing
Yang dikatakannya
Tolong beri saya pertanyaan tentang seekor anjing, jadi saya bisa membedakan antara anjing dan trenggiling
Anda mungkin membalas
Apakah itu memakan semut?
Kemudian akan bertanya:
Apa jawaban untuk seekor anjing?
Yang akan Anda katakan
tidak
Dan itu akan berkata
Terima kasih
Lain kali itu berjalan, itu akan mengajukan pertanyaan di atas, dan akan membangun pohon biner dari pertanyaan seperti itu.
Tantangan
Cukup latar belakangnya. Tantangan ini adalah menulis program trenggiling yang memodifikasi sendiri. Aturannya adalah sebagai berikut:
Output program (seperti dijelaskan di atas) seharusnya
STDERR
. Respons terakhir akan selalu "Bagus. Itu sangat mudah." atau "Terima kasih". Setelah ini, harus menampilkan versi program saat ini, atau versi baru dari program yang memasukkan pertanyaanSTDOUT
. Tidak ada jawaban yang ditulis dalam bahasa yang tidak mendukung penulisanSTDOUT
danSTDERR
atau pembacaan dari yangSTDIN
valid.Dengan kata lain di bawah UNIX Anda dapat menjalankan program seperti ini:
contoh:
$ mylanguage myprogram > myprogram.1
[dialog goes here]
$ mylanguage myprogram1 > myprogram.2
[dialog goes here]
- Program harus menggunakan persis prompt yang ditentukan (karena memendekkan prompt tidak menunjukkan keahlian). Prompt adalah (tanpa tanda kutip, dan di mana% s diganti) sebagai berikut:
daftar:
"OK, please think of something"
"Is it %s?"
"Good. That was soooo easy."
"Oh. Well you win then -- What were you thinking of?"
"Please give me a question about %s, so I can tell the difference between %s and %s"
"What is the answer for %s?"
"Thanks"
Ketika mengharapkan jawaban ya / tidak, program Anda harus menerima
y
atauyes
dalam hal apa pun untuk 'ya', dann
atauno
dalam hal apa pun untuk 'tidak'. Apa yang Anda lakukan dengan input yang tidak sesuai adalah terserah Anda. Sebagai contoh, Anda mungkin memutuskan untuk mengambil jawaban yang dimulai dengany
atauY
sebagai 'ya', dan apa pun yang tidak.Anda dapat mengasumsikan bahwa nama-nama barang yang disediakan dan pertanyaan hanya terdiri dari huruf ASCII, angka, spasi, tanda hubung, tanda tanya, koma, titik penuh, titik dua, dan titik koma, yaitu cocok dengan regex berikut
^[-?,.;: a-zA-Z]+$
. Jika Anda dapat mengatasi lebih dari itu (terutama karakter kutipan dalam bahasa yang Anda pilih), Anda akan menjadi sombong, tetapi tidak mendapatkan poin tambahan.Program Anda mungkin tidak membaca atau menulis file apapun (termasuk
STDIN
,STDOUT
, danSTDERR
), atau dari jaringan; khusus itu tidak dapat membaca atau menulis kode sendiri dari disk. Keadaannya harus disimpan dalam kode program itu sendiri.Ketika program dijalankan dan menebak jawabannya dengan benar, ia harus melakukan persis seperti quine, yaitu harus menulis
STDOUT
persis kode sendiri, tidak berubah.Ketika program dijalankan dan menebak jawaban salah, ia harus menyandikan pertanyaan dan jawaban baru yang disediakan dalam kode sendiri dan menuliskannya
STDOUT
dalam kode sendiri, sehingga mampu membedakan antara tebakan aslinya dan objek baru yang disediakan, dalam Selain membedakan antara semua objek yang diberikan sebelumnya.Anda harus dapat mengatasi beberapa kali menjalankan perangkat lunak sehingga dapat mempelajari banyak objek. Lihat di sini untuk contoh beberapa proses.
Uji coba diberikan di tautan di kepala (jelas hanya mencakup dialog
STDIN
danSTDERR
).Celah standar tidak termasuk.
Jawaban:
Gangguan umum,
631576Sesi contoh
Beri nama skrip
pango1.lisp
dan jalankan sebagai berikut (menggunakan SBCL):Babak lain, menambahkan beruang:
Menambahkan sloth (kami menguji kasus di mana jawabannya adalah "tidak"):
Menguji file terakhir:
Komentar
"Thanks"
, ini dia.(y or n)
, yang karena saya menggunakany-or-n-p
fungsi yang ada . Saya dapat memperbarui jawaban untuk menghapus output ini jika diperlukan.*QUERY-IO*
aliran dua arah yang didedikasikan untuk interaksi pengguna, yang saya gunakan di sini. Output standar dan interaksi pengguna tidak berantakan, yang mengikuti IMHO semangat pertanyaan.SAVE-LISP-AND-DIE
akan menjadi pendekatan yang lebih baik dalam praktik.Output yang dihasilkan
Berikut ini skrip yang dihasilkan terakhir:
Penjelasan
Pohon keputusan dapat berupa:
"a pangolin"
, yang mewakili daun.(question if-true if-false)
mana ada pertanyaan ya / tidakquestion
tertutup , sebagai string, dan dan adalah dua kemungkinan sub-sub yang terkait dengan pertanyaan tersebut.if-true
if-false
The
U
fungsi berjalan dan mengembalikan pohon mungkin diubah. Setiap pertanyaan ditanyakan secara bergantian, mulai dari root hingga mencapai daun, saat berinteraksi dengan pengguna.Nilai yang dikembalikan untuk node perantara
(Q Y N)
adalah(Q (U Y) N)
(resp.(Q Y (U N))
) Jika jawaban atas pertanyaanQ
adalah ya (resp. Tidak ).Nilai yang dikembalikan untuk daun adalah baik daun itu sendiri, jika program menebak jawaban dengan benar, atau pohon yang disempurnakan di mana daun digantikan oleh pertanyaan dan dua hasil yang mungkin, sesuai dengan nilai yang diambil dari pengguna.
Bagian ini agak mudah. Untuk mencetak kode sumber, kami menggunakan variabel pembaca untuk membuat kode referensi-sendiri.
Dengan menyetelTrik ketika menggunakan*PRINT-CIRCLE*
ke true, kami menghindari rekursi tak terbatas selama pencetakan cantik.WRITE
dengan:print-circle T
adalah bahwa fungsi tersebut mungkin juga mengembalikan nilai ke REPL, tergantung pada apakah menulis adalah bentuk terakhir, dan jika REPL tidak menangani struktur lingkaran, seperti itu didefinisikan oleh nilai standar standar*PRINT-CIRCLE*
, akan ada rekursi tak terbatas. Kita hanya perlu memastikan struktur lingkaran tidak dikembalikan ke REPL, itu sebabnya ada NIL di posisi terakhir LET. Pendekatan ini sangat mengurangi masalah.sumber
(y or n)
diperlukan, tetapi saya tergoda untuk mengizinkannya karena ini merupakan peningkatan.Python 2.7.6,
820728 byte(Mungkin bekerja pada versi yang berbeda tapi saya tidak yakin)
Yah, itu tidak sesingkat jawaban Common Lisp, tapi di sini ada beberapa kode!
sumber
Python 3, 544 byte
Cobalah secara Online!
Pertanyaan / jawaban / tanggapan disimpan dalam sebuah array, di mana jika array menyimpan tiga item (misalnya
['Does it eat ants',['a pangolin'],['a dog']]
) maka ia mendapat jawaban atas pertanyaan dan mengulangi hanya dengan konten item kedua atau ketiga, tergantung pada jawabannya. Ketika sampai ke array dengan hanya satu item, ia mengajukan pertanyaan, dan karena memiliki seluruh kode sumbernya sebagai string, ia dapat menggunakan metode split-join untuk menyisipkan ekstensi ke array untuk menambah cabang baru .Saya awalnya menulis ini tanpa menyadari persyaratan quine, jadi membaca ulang pertanyaan dan harus menemukan cara agar saya bisa mengeksekusi kode dan menggunakannya sebagai string adalah sulit, tetapi saya akhirnya menemukan ide format quine yang dapat diupgrade yang bagus:
sumber
Python 3 , 497 byte
Mirip dengan jawaban Harmless untuk representasi pohon. Secara rekursif mengajukan pertanyaan berikutnya, sambil masuk lebih dalam ke dalam daftar, sampai hanya ada satu jawaban.
Versi tidak digabungkan (tanpa quining)
sumber