Mari kita bermain golf kode!
Diberikan status papan tic-tac-toe (Contoh :)
|x|x|o|
|x|o|x|
|o|o|x|
Tentukan apakah game adalah win
a lose
atau cat
. Kode Anda harus menampilkan salah satu dari opsi ini yang diberi status. Permainan di atas harus di-outputlose
Untuk lebih jelasnya: kemenangan didefinisikan sebagai setiap 3 x
detik berturut-turut (diagonal, horizontal, vertikal). kerugian adalah 3 o
detik berturut-turut, sedangkan cat
permainan tidak ada berturut-turut.
Untuk membuat hal-hal menarik, Anda harus menentukan struktur input Anda untuk keadaan - yang kemudian harus Anda jelaskan. Misalnya xxoxoxoox
adalah keadaan yang valid seperti yang terlihat di atas di mana setiap karakter dibaca dari kiri ke kanan, atas ke bawah. [['x','x','o'],['x','o','x'],['o','o','x']]
adalah game dalam array multidimensi membaca dengan cara yang sama. Sedangkan 0x1a9
hex untuk 110101001
mungkin bekerja sebagai kompresi yang cocok di mana 1
dapat dimanipulasi untuk x
dan 0
dapat dimanipulasi untuk o
.
Tapi itu hanya beberapa ide, saya yakin Anda mungkin memiliki banyak ide sendiri.
Aturan dasar:
- Program Anda harus dapat menerima keadaan apa pun yang layak.
- Bentuk input harus dapat mewakili keadaan apa pun.
- "Negara yang menang harus ditentukan dari papan"
- Asumsikan papan lengkap
Win
sebelumnyalose
misalnya dalam kasus 'xxxoooxxx'
Hitungan karakter terendah menang
(win|lose|cat) [xo]{9}
mana kata pertama menunjukkan apakah permainan itu menang, kalah, atau kucing (?) Untuk pemain x. Mampu mewakili negara apa pun.Jawaban:
Ruby 2.0, 85 karakter
Berikut ini adalah solusi berbasis bitmask sederhana di Ruby:
Papan direpresentasikan sebagai angka hex, terdiri dari sembilan bit yang sesuai dengan sembilan kotak. 1 adalah
X
, 0 adalahO
. Ini seperti0x1a9
contoh dalam pertanyaan, meskipun0x
opsional!Mungkin ada cara yang lebih baik untuk melakukan bitmask daripada hanya melakukan hardcoding pada daftar besar. Saya akan dengan senang hati menerima saran.
Lihat itu berjalan di Ideone di sini .
sumber
273
dua kali. Dan saya sangat menyukaimax
ide itu!Mathematica, 84 karakter
Masukkan format:
{{1, 1, 0}, {1, 0, 1}, {0, 0, 1}}
sumber
Tr@a
adalah jejak bidang (jumlah atas diagonal),Tr@Reverse@a
adalah jejak bidang membalik (beberapa lebih anti-diagonal),Tr/@a
yangTr
diterapkan untuk setiap baris, yang memberi Anda jumlah yang lebih setiap baris,Total@a
memberikan Anda jumlah yang lebih setiap kolom. Jadi pada dasarnya, Anda memiliki semua 8 baris yang perlu Anda periksa. KemudianWhich
hal itu diterapkan pada itu (pada dasarnyaif/elseif/else
pernyataan), di mana#
merupakan daftar 8 nilai.if
ada3
kamu menang,else if
ada0
kamu kalah,else if 1>0
(benar)cat
.Bash:
283262258Menampilkan antarmuka yang relatif ramah.
Untuk mengeksekusi
bash tictactoe.sh O X O X O X X O X
Catatan: daftar 9 posisi adalah representasi matriks standar. Tidak masalah jika papan direpresentasikan sebagai kolom utama atau baris utama, baca dari kiri ke kanan atau atas ke bawah - permainan noughts dan persilangan (atau tic toe jika Anda bersikeras) simetris, jadi urutan input harus tidak relevan untuk hasil dalam setiap implementasi yang benar, selama input linear.
Sunting: Berkat hjk untuk saran sintaks fungsi yang lebih pendek.
sumber
t() { ... }
bukanfunction t
? Dapat menyimpan beberapa karakter di sana. :)<<<
untuk menyimpan empat karakter lainnya.Befunge 93 - 375
Mengambil string biner sebagai input.
Membaca string. Bruteforce menulisnya (strip paling vertikal paling kanan) sebagai matriks di antara
menambahkan kisi (idk). Menentukan jumlah kolom, baris, dan dua diagnosis. Bandingkan nilai-nilai itu dengan 3 ("menang") atau 0 ("kalah"), jika semua nilai sama dengan 1 atau 2 maka gambarlah ("kucing").
sumber
GolfScript, 27 karakter
Format input adalah string yang terdiri dari delapan digit oktal, masing-masing (secara berlebihan) menyandikan tiga kotak papan berturut-turut:
Untuk menyandikan urutan (baris / kolom / diagonal) dari tiga kotak sebagai digit oktal, ganti setiap
x
dalam urutan dengan 1 dan setiapo
dengan 0, dan menafsirkan urutan yang dihasilkan dari satu dan nol sebagai angka biner antara 0 dan 7 inklusif.Format masukan ini cukup berlebihan (semua posisi papan dikodekan setidaknya dua kali, dengan posisi tengah dikodekan empat kali), tetapi tidak jelas mewakili negara kemungkinan papan tic-tac-toe terisi penuh, dan tidak langsung menyandikan pemenang menjadi input.
Input dapat, secara opsional, mengandung spasi atau pembatas lain di antara digit. Faktanya, semua program benar - benar peduli tentang apakah string input berisi digit
7
atau tidak0
.Misalnya, papan contoh:
dapat diwakili oleh input:
Untuk kenyamanan, inilah program GolfScript untuk mengubah tata letak papan seni ASCII, seperti yang ditunjukkan pada tantangan di atas, menjadi string input yang cocok untuk program ini:
Konverter ini mengabaikan karakter apa pun selain
x
dano
, dalam kedua kasus, dalam inputnya. Ini menghasilkan string satu digit (lengkap dengan pembatas ruang seperti yang ditunjukkan di atas) yang cocok untuk dimasukkan ke dalam program penentuan menang di atas, sehingga gabungan dari kedua program ini dapat digunakan untuk menentukan pemenang langsung dari dewan seni ASCII.Juga, inilah konverter terbalik, hanya untuk menunjukkan bahwa input memang benar-benar mewakili papan:
Ps. Inilah demo online dari solusi ini.
sumber
Python 2 - 214 byte
Saya yakin ada perbaikan yang harus dilakukan.
Untuk berlari:
yang mewakili dewan ini:
Keluar dengan
NameError
pengecualian dalam setiap kasus kecualicat
.sumber
<<<
! +1 hanya untuk itu../whatever <<< 'blah blah blah'
adalah samaecho -n 'blah blah blah' | ./whatever
tetapi tanpa memiliki keseluruhan proses terpisah untukecho
.echo
inbash
sebenarnya adalah builtin, jadi jangan garpu proses baruHaskell, 146 karakter
BAIK :). Representasi saya atas papan adalah salah satu dari 126 karakter itu
Inilah solusinya dalam 146 karakter:
Dan inilah cara kerjanya, sebagai skrip haskell:
sumber
JavaScript, 420 karakter
Dalam versi ini,
s
berisi bilangan bulat yang mewakili kondisi papan permainan. Ini adalah bit array nilai di mana dua bit mewakili setiap kotak di papan:10
- X11
- O00
- Kotak kosongSolusi ini menggunakan manipulasi bit untuk menguji masing-masing dari delapan kemungkinan konfigurasi "tiga berturut-turut" (itu menguji mereka masing-masing dua kali, sekali untuk X dan sekali untuk O).
Saya menyajikan ini dengan minifikasi minor dari situs web Tic-Tac-Toe tempat ini
detectWin
fungsi ini digunakan sebagai bagian dari permainan nyata Tic-Tac-Toe.sumber
Ruby, 84 karakter
Sederhana, solusi berbasis RegExp. Format input adalah string biner 9 digit, misalnya
110101001
untuk papan contoh yang diberikan dalam pertanyaan.Ruby, 78 karakter
Masukkan format:
xxo_xox_oox
sumber
Haskell, 169
Format input: "X" hanya diwakili oleh
x
, "O" hanya oleho
. Dalam setiap baris, karakter simultan tanpa spasi, dll. Baris dipisahkan oleh baris baru.Hasilkan semua baris / kolom / diagonal yang mungkin, kemudian filter
[("ooo","lose"),("xxx","win")]
berdasarkan keberadaannya di papan tulis, lalu pilih kata kedua dalam tuple, jadi kita tahu pemain mana yang menang. Kami menambahkan"cat"
sehingga kami dapat mengambil elemen terakhir dari daftar sebagai pemenang kami. Jika kedua pemain menang,"win"
akan menjadi yang terakhir (daftar pemahaman menjaga ketertiban). Karena"cat"
selalu pertama, jika pemenang ada, itu akan dipilih, tetapi jika tidak, elemen terakhir masih ada sebagai prepending"cat"
jaminan nonemptyness.EDIT: Mencukur 3 karakter dengan mengubah pemahaman daftar terakhir menjadi
map
.sumber
C, 150 kira-kira
Ini tengah malam di sini dan saya belum melakukan pengujian apa pun , tetapi saya tetap akan memposting konsep itu. Saya akan kembali lagi besok.
Pengguna memasukkan dua angka oktal (Saya ingin menggunakan biner tetapi sejauh yang saya tahu C hanya mendukung oktal):
a
mewakili kotak tengah, 1 untuk X, 0 untuk Ob
adalah angka sembilan digit yang mewakili kuadrat perimeter, melingkari papan mulai dari satu sudut dan berakhir di sudut yang sama (dengan pengulangan sudut itu saja), 1 untuk X, 0 untuk O.Ada dua cara yang mungkin untuk menang:
kotak tengah adalah X (
a
= 1) dan dua kotak yang berlawanan juga X (b&b*4096
bukan nol)tiga kotak perimeter yang berdekatan adalah X (
b/8 & b & b*8
bukan nol). Ini hanya kemenangan yang valid jika kotak tengah adalah kotak tepi, bukan kotak sudut, oleh karena itu perlu untuk menerapkan topengm
juga, untuk menghindari kasus kotak sudut.Kehilangan terdeteksi menggunakan variabel c, yang merupakan kebalikan dari b.
sumber
m
dalam deteksi "kehilangan" -c/8&c&c*8
. Saya telah mem-golf-ulang kode Anda (tanpa menguji operasinya) sebagai berikut:int a,b;t(v){return a&&v&v<<12||v/8&v&v*8&0x208208;}main(){scanf("%o%o",a,b);printf("%s",t(b)?"win":t(b^0x1249249)?"lose":"cat");}
(130 karakter). Tes yang diulang cukup lama untuk diekstraksi menjadi fungsi test()
; ini menghilangkan kebutuhan untukc
danm
; konstanta dikonversi ke hex untuk menyimpan masing-masing satu char.printf
tidak perlu string format - cukup berikan string hasil sebagai format - atauputs
, karena pertanyaannya tidak meminta baris baru setelah output! (menyimpan 7 karakter selanjutnya).Pesta,
107103Menghasilkan dan menjalankan skrip sed.
Format I / O:
oxo-oox-xoo
outputlose
(gunakan a-
untuk memisahkan baris). Masukan pada stdin. Membutuhkan GNU sed untukc
perintah.Saya telah menafsirkan aturan 5 sebagai "jika mungkin menang dan kalah, pilih menang".
Kode Utama
Ini jawaban yang sebenarnya.
Tidak ada yang benar-benar menarik. Itu mendefinisikan
$b
sebagai/cwin
untuk menyimpan karakter, kemudian mendefinisikan bagian win condition dari skrip, kemudian digunakansed y/x/o/\;s$b/close/
untuk mengkonversix
keo
dancwin
keclose
(sehingga menghasilkan kondisi yang hilang). Kemudian mengirimkan dua hal danccat
(yang akan ditampilkancat
jika tidak ada kondisi win / loss cocok) untuk sed.Kode yang Dihasilkan
Ini adalah skrip sed yang dihasilkan dan dijalankan oleh skrip Bash.
Di regex,
.
cTEXT
regex cocok dengan karakter apa pun dan setelah mereka mencetak TEKS dan keluar jika regex cocok.Ini dapat dijalankan sebagai skrip sed mandiri. Panjangnya 125 karakter, Anda dapat menghitungnya sebagai solusi lain.
sumber
Python 3, 45
Input masuk
i
, yang merupakan daftar angka yang mewakili setiap baris, kolom, dan diagonal papan permainan, misalnya:diwakili oleh
[6, 2, 1, 4, 6, 1, 7, 4]
.Kode :
('cat','lose','win')[2 if 7 in i else 0 in i]
sumber
Dart - 119
(Lihat dartlang.org ).
Versi asli menggunakan RegExp: 151 karakter.
Input pada baris perintah adalah 11 karakter, misalnya, "xxx | ooo | xxx". Setiap karakter non-xo dapat digunakan sebagai pembatas.
Ruang putih dan baris baru yang terkemuka harus dihilangkan sebelum menghitung karakter, tapi saya memotong spasi putih di mana mungkin. Saya berharap ada cara yang lebih kecil untuk membuat substring.
Versi bit-base yang resusif: 119 karakter. Input harus berupa angka 9-bit dengan 1s mewakili 'x' dan 0s mewakili 'o'.
sumber
CJam,
39 3836 karakterIni adalah kode konversi dasar untuk
yang panjangnya 52 karakter.
Input hanyalah representasi string dari papan mulai dari kiri atas, akan baris demi baris. Sebagai contoh:
yang menghasilkan
win
output. Atauyang menghasilkan a
cat
output, dll.Kode hanya melakukan tiga hal berikut:
q3/_
- Pisahkan string menjadi bagian-bagian 3, yaitu per baris_z
- Salin larik per baris dan transpos ke larik per kolom.__Wf%s4%
- Balikkan setiap baris dan dapatkan diagonal kiri ke kanan. Ini adalah diagonal sekunder papan.\s4%
- Dapatkan diagonal utama papan]`
- Bungkus semuanya dalam array dan rangkai array.Sekarang kita memiliki semua kelompok yang memungkinkan 3 dari papan. Kami cukup memeriksa keberadaan "ooo" dan "xxx" untuk menentukan hasilnya.
Cobalah online di sini
sumber
GNU sed, 25 byte
Jika input adalah representasi berlebihan dari papan dengan tampilan terpisah untuk kolom, baris dan diagonal, seperti yang digunakan dalam jawaban lain juga, maka sed sangat cocok untuk memeriksa keadaan akhir permainan dengan byte paling sedikit.
Format input:
xxx ooo xxx xox xox xox xox xox
(status board diambil dari pertanyaan OP)Jika format input non-redundan (
xxx ooo xxx
), maka kode sed di atas hanya berfungsi jika didahului oleh baris di bawah ini, membuat panjang program 96 byte (denganr
flag yang diperlukan dihitung).sumber
Bash: 208 karakter
Untuk mengeksekusi
bash tictactoe.sh 0 1 0 1 0 1 1 0 1
Terinspirasi oleh jawaban ini .
sumber
VB.net
Dengan contoh, berikan dikodekan sebagai pola bit berikut
Sekarang kita dapat menentukan hasil (atau pemenang) dengan melakukan hal berikut.
sumber
J - 97 byte
Ya, pendekatan paling sederhana yang tersedia. Input diambil sebagai
111222333
, di mana angka mewakili baris. Baca dari kiri ke kanan. Pemain adalahx
dan musuho
. Kotak kosong bisa berupa apa saja kecualix
atauo
.Contoh: (NB. Adalah komentar)
Kode tanpa penjelasan penjelasan
sumber
Python 2, 120 byte
Atau Python, 115 byte dari shell Python (2 atau 3):
Variabel board diatur ke format biner yang dijelaskan dalam pertanyaan:
1
untuk X,0
untuk O, kiri-ke-kanan, atas-ke-bawah. Dalam hal ini,101001110
mewakiliYang mengarah ke keluaran:
Cat
sumber
Python (
7362 karakter)Input adalah empat string huruf kecil yang mewakili empat tampilan berbeda dari papan yang sama, semua disatukan menjadi string tunggal: dengan baris, demi kolom, diagonal kanan, diagonal kiri.
MEMPERBARUI
Terima kasih kepada theare untuk menunjukkan ini dengan contoh yang bagus! Setiap tampilan papan, bersama dengan setiap segmen (baris atau kolom) dalam papan harus dipisahkan oleh karakter yang bukan merupakan "x" atau "o" sehingga struktur papan dipertahankan bahkan setelah penggabungan. Batas di sekitar setiap tampilan papan akan berupa tanda kurung siku ("[" dan "]"), dan pemisah antara baris / kolom akan menjadi karakter pipa "|".
Ini membuat algoritma sederhana - cukup cari "xxx" atau "ooo" untuk menang atau kalah, masing-masing. Kalau tidak, itu dasi (kucing).
Misalnya papan tulis (membaca kiri-ke-kanan, atas-ke-bawah) ...
X | X | X X | O | X O | X | O
... direpresentasikan sebagai "[xxx | xox | oxo]" (dengan baris) + "[xxo | xox | xxo]" (dengan kolom) + "[xoo]" (diag kanan) + [xoo] "(kiri diag) = "[xxx | xox | oxo] [xxo | xox | xxo] [xoo] [xoo]".
Pernyataan Python ini mencetak hasil gim yang diberikan variabel s sebagai input:
sumber
OXX XOO XOX
(seharusnya kucing)?Haskell (69 karakter)
Ini mengambil input yang sama seperti yang dijelaskan oleh jawaban ini . Lebih khusus lagi, input adalah 8 nilai oktal, menggambarkan nilai biner dari setiap baris, kolom, dan diagonal. Kode membuat setiap instance dari 7 "menang", setiap instance dari 0 "kalah", dan menghapus segala sesuatu yang lain. Kemudian ia menambahkan "cat" di akhir dan mengambil 4 karakter pertama dari hasilnya.
Akan ada 4 kemungkinan jawaban: "kalah", "kucing", "menang" diikuti oleh 'l', dan "win" diikuti oleh 'c', yang aturannya tidak melarang :)
Contoh penggunaan:
sumber
J: 83
Penggunaan: cukup tambahkan string x dan o dan saksikan karya sulapnya. misalnya. 'xxxoooxxx'.
Kata kerja dalam
(+/@:(*./"1)@;@(;((<0 1)&|:&.>@(;|.)(,<)|:)))
pada dasarnya kotak bersama-sama matriks biner asli, dengan transpos kotak bersama-sama dengan 2 diagonal. Hasil-hasil ini dihancurkan bersama; jumlah baris diambil untuk menentukan kemenangan, dan kemudian dijumlahkan. selanjutnya saya akan memanggil kata kerja iniInner
.Untuk menemukan pemenang, perbedaan skor antara matriks biner normal dan terbalik diambil oleh hook
(-&Inner -.)
.Sisa kode hanya membuat output, dan memilih yang benar.
sumber
JavaScript,
133, 114 karakterInput
i
adalah string sederhana dengan pembatas untuk baris, yaitu100|001|100
Sunting: memperbarui metode saya untuk mengganti 1s di regex dengan nol untuk memeriksa kasus kerugian.
sumber
=
dan tanda kutip di sekitar regex literal. Juga,1...
satu karakter lebih pendek dari1.{3}
.r.test(i)
juga satu karakter lebih pendek darii.match(r)
.J - 56 (26?) Char
Input diberikan matriks 3x3 sembilan karakter, karena J dapat mendukungnya sebagai tipe data, LOL.
Contoh:
Jika kita diizinkan pengkodean Golfscript dari digit oktal secara berlebihan mewakili keadaan setiap baris, kolom, dan diagonal, maka itu hanya 26 karakter:
sumber
T-SQL (2012), 110
select max(iif(@&m=0,'lose',iif(@&m=m,'win','cat')))from(VALUES(292),(146),(73),(448),(56),(7),(273),(84))z(m)
Input adalah nomor hex. Ini cukup banyak terjemahan dari solusi ruby ke T-SQL yang cukup bagus dan rapi.
sumber
Javascript 1.6, 71 karakter
Saya mengasumsikan input sebagai array
game
yang berisi setiap baris, setiap kolom dan setiap diag sebagai string 3 char. Mirip dengan jawaban bob , tetapi datang dalam array, bukan sebagai string yang disatukan.EDIT @ nyuszika7h 's komentar (67 chars)
sumber
~game.indexOf("xxx")
sebagai gantigame.indexOf("xxx")>=0
, sama untuk yang lainnya.Java 7, 260 byte
Kasus yang tidak disatukan & uji:
Coba di sini.
Keluaran:
sumber
APL (NARS), 69 karakter, 138 byte
Input harus berupa satu matriks 3x3 atau satu array linier dari 9 elemen yang dapat berupa 1 (untuk X) dan 0 (untuk O), hasilnya akan menjadi "kucing" jika tidak ada yang menang, "kalah" jika O menang, "menang "Jika X menang. Tidak ada pemeriksaan untuk satu papan tidak valid atau input adalah satu array memiliki kurang dari 9 elemen atau lebih atau periksa setiap elemen <2.
Sebagai komentar: itu akan mengkonversi input dalam matriks 3x3, dan membangun satu array bernama "x" di mana elemen adalah jumlah setiap kolom baris dan diagonal.
Beberapa contoh tes lihat menunjukkan dari yang lain:
sumber