quine-ish tic-tac-toe

19

Tulis program dalam bahasa pilihan Anda yang memainkan permainan tic-tac-toe di papan 3 * 3 melawan pemain manusia. Namun, setiap langkah harus merupakan program yang berbeda , dihasilkan dari iterasi sebelumnya.

Bagaimana dan dalam bentuk apa Anda mengevaluasi input manusia, terserah Anda, tetapi harus dibaca dari input standar. Demikian pula, Anda bebas untuk memilih metode bagaimana Anda akan menentukan pemain mana yang mulai (misalnya, Anda bertanya terlebih dahulu, atau Anda mengizinkan manusia untuk memasukkan langkah yang tidak valid untuk memberi sinyal bahwa komputer mulai, atau ide lain).

Memvalidasi gerakan tidak perlu, Anda dapat menganggap lawan manusia yang bermain cukup.

Pada dasarnya, Anda memiliki program yang sesuai dengan keadaan dewan. Status dicetak dengan cara apa pun yang dapat dikenali, tetapi setidaknya tingkat rincian berikut diharapkan:

X..
00X
x..

Setelah pemain manusia memasuki gerakannya, program Anda harus membuat iterasi berikutnya sebagai file sumber dalam bahasa yang sama (baik untuk output standar atau ke file) dan berakhir. Anda tidak diperbolehkan menyimpan informasi di tempat lain di luar file sumber itu. (tidak perlu bagi program Anda untuk membangun dan menjalankan program yang dihasilkan, itu bisa dilakukan oleh pengguna - namun, itu tidak dilarang). Ketika program yang dihasilkan dibangun dan dijalankan, ia akan berperilaku sama, menampilkan status, menunggu input pengguna, dll.

Di akhir permainan, Anda harus mencetak hasilnya (apakah Anda menang atau seri) dengan cara apa pun yang dapat diidentifikasikan secara jelas.

Dengan permainan yang sempurna maksud saya program tidak boleh kalah, dan jika ada kemungkinan untuk memaksakan kemenangan, itu harus menang.

Kode terpendek menang , pemenang dipilih setidaknya 10 hari setelah entri pertama yang valid.

Anda mendapatkan pengurangan skor 10% jika program Anda dapat menangani bangunan dan meluncurkan iterasi berikutnya. (Saya tahu, kemungkinan besar itu tidak sepadan) Tentu saja, program itu sendiri harus dihentikan pada saat iterasi berikutnya menerima perpindahan dari pengguna.

Jika Anda menggunakan beberapa trik aneh yang tidak biasa, silakan kirim penjelasan singkat dengan kode Anda.

vsz
sumber
2
Tantangan yang bagus, tapi saya pikir saya akan memilih keluar.
John Dvorak
"Setiap langkah harus menjadi program yang berbeda". Maksud Anda, "setiap permainan harus dimulai dan dikelola oleh program baru yang berbeda dan asli"?
DavidC
1
@ Davidvidarraher: Tidak. Setiap gerakan, bukan hanya setiap pertandingan. Lihat keterangan di bawah contoh papan. Ketika komputer harus bergerak (sehingga kondisi papan berubah), program Anda harus membuat file sumber, yang ketika dibangun dan dijalankan, akan menjadi status berikutnya. Program asli kemudian keluar. Program yang baru dibuat, ketika bergerak, akan berperilaku sama: ia membuat file sumber, yang ketika dibangun dan dijalankan, akan menjadi status berikutnya, dan seterusnya. Karena tidak ada penyimpanan informasi yang diperbolehkan kecuali dalam file sumber yang dihasilkan, itu seperti quine dengan perbedaan antara iterasi.
vsz

Jawaban:

13

Perl, 933 karakter

$m=<<'';$_='         ';
sub h{/^(?:...)*(\d)\1\1/|/^.?.?(\d)..\1..\1/|/(\d)...\1...\1/|/^..(\d).\1.\1/&&$1}
sub r{substr($_,$p-1,1)=pop}sub p{my$w=pop;my@b=(0,h==$w||h&&-1);if(!$b[1]&&/ /){$b[1]=-9;
while(/ /g){local($_,$p)=($_,pos);r$w;$r=-(p($w^1))[1];@b=($p,$r)if$r>$b[1]}}@b}
if(($w=h||!/ /)||!@ARGV){$w--&&print+(nobody,X,O)[$w]," wins\n";s/(...)/$1\n/g;
tr/ 23/.XO/;print}else{$w=3;$w^=1for/\d/g;($p=pop)?r($w^1)&&!h&&(($p)=p$w)&&r$w:s/ /2/;
print"\$m=<<'';\$_='$_';\n$m\n$m"}

sub h{/^(?:...)*(\d)\1\1/|/^.?.?(\d)..\1..\1/|/(\d)...\1...\1/|/^..(\d).\1.\1/&&$1}
sub r{substr($_,$p-1,1)=pop}sub p{my$w=pop;my@b=(0,h==$w||h&&-1);if(!$b[1]&&/ /){$b[1]=-9;
while(/ /g){local($_,$p)=($_,pos);r$w;$r=-(p($w^1))[1];@b=($p,$r)if$r>$b[1]}}@b}
if(($w=h||!/ /)||!@ARGV){$w--&&print+(nobody,X,O)[$w]," wins\n";s/(...)/$1\n/g;
tr/ 23/.XO/;print}else{$w=3;$w^=1for/\d/g;($p=pop)?r($w^1)&&!h&&(($p)=p$w)&&r$w:s/ /2/;
print"\$m=<<'';\$_='$_';\n$m\n$m"}

Harap perhatikan bahwa baris kosong di tengah skrip sebenarnya harus ada di sana. (Garis putus di akhir garis panjang tidak diperlukan, selain untuk keterbacaan, dan tidak termasuk dalam jumlah karakter.)

Penggunaan: Ketika program dijalankan tanpa argumen, ini akan menampilkan kondisi permainan saat ini. Karena pada awalnya papan kosong, output akan menjadi:

...
...
...

Jalankan program dengan argumen antara 1 dan 9 untuk mengklaim kuadrat itu sebagai langkah Anda. Program akan bergerak sendiri dan kemudian mengeluarkan skrip pengganti dengan status baru. Jadi, misalnya:

$ perl ./qttt 5 > ./qttt-2
$ perl ./qttt-2
O..
.X.
...

Pada belokan pertama saja, Anda dapat memberikan gerakan 0untuk menunjukkan bahwa komputer harus melakukan langkah pertama. Perhatikan bahwa pemain pertama akan selalu seperti itu X.

Saat game berakhir, output display akan menyertakan catatan untuk efek itu:

$ perl ./qttt-4 6 > ./qttt-5
$ perl ./qttt-5
O wins
OXX
OOX
X.O

Program ini bekerja dengan melakukan pencarian minimax standar dari pohon permainan. (Tic-tac-toe adalah permainan yang cukup kecil yang dapat dihasilkan oleh pohon permainan penuh pada setiap proses.) Pengecualian untuk ini adalah ketika komputer bergerak pertama - dalam hal ini gerakan awal ke sudut kiri atas sulit dilakukan. berkode.

Perhatikan bahwa program ini bekerja dengan cara quine yang tepat - tidak ada script mengakses file sumbernya sendiri untuk menghasilkan output.

kotak roti
sumber
1
Itu indah! Saya tidak menyadari bahwa saya sedang menatap sebuah dokumen besar di sini untuk waktu yang lama, kemudian melakukan pengambilan ganda.
Jesse Smith