pengantar
Nine Mens's Morris (juga disebut Mills) adalah permainan papan untuk dua pemain yang dimainkan di papan berikut (gambar diambil dari halaman Wikipedia yang terhubung):
Setiap pemain memiliki 9 pemain, berwarna hitam dan putih. Aturan konkret tidak penting untuk tantangan ini, tetapi periksa halaman Wikipedia jika Anda tertarik.
Tantangan
Mengingat grid sebagai input, yang merupakan boardstate tertentu, output count pabrik keseluruhan m
dengan 0<=m<=8
.
Tiga pria dengan warna yang sama membentuk penggilingan ketika mereka berada di barisan lurus titik-titik yang terhubung. b2
to f2
bukan pabrik karena laki-laki memiliki warna yang berbeda. Juga d2
untuk d5
tidak akan membentuk pabrik sejak tiga poin harus terhubung.
Papan pada gambar di atas mengandung dua pabrik misalnya. Satu dari f2
ke f6
dan satu dari e3
ke e5
.
Memasukkan
Papan direpresentasikan sebagai kisi 2D dengan 24 titik yang terhubung seperti yang ditunjukkan pada contoh gambar di atas. Contoh ini menggunakan huruf dari a-g
untuk kolom dan angka dari 1-7
untuk baris, tetapi Anda dapat memilih format input yang wajar selama memetakan 24 koordinat unik ke salah satu negara berikut:
- Kosong
- Diambil oleh hitam
- Diambil putih
Repersentasi beton terserah Anda, Anda tidak terbatas pada "b" atau "w" untuk warna.
Selain itu, input Anda mungkin tidak mengandung informasi tambahan.
Catatan tambahan
- Anda tidak harus memetakan poin berdasarkan jenis nilai apa pun. Jika Anda ingin mengambil input sebagai array 2D, itu bagus juga. Tetapi perlu diingat bahwa tidak semua poin di sana digunakan dan Anda harus mempertimbangkan koneksi di antara mereka.
- Input mungkin kosong, dalam hal ini Anda harus menghasilkan nol (papan kosong -> tidak ada pabrik).
- Karena setiap pemain memiliki 9 pemain, input tidak akan pernah mengandung lebih dari 18 poin yang diambil.
- Anda dapat meninggalkan poin emtpy di input dan oleh karena itu hanya input poin yang diambil.
- Input dapat dipesan dengan cara apa pun. Anda tidak dapat mengandalkan pesanan tertentu.
- Anda dapat mengasumsikan bahwa input akan selalu valid. Ini berarti bahwa tidak akan ada lebih dari 9 pria dari setiap warna dan bahwa setiap titik akan unik.
Aturan
- Jelaskan format input mana yang Anda gunakan dalam solusi Anda. Memberikan contoh program Anda sangat dianjurkan.
- Fungsi atau program lengkap diizinkan.
- Aturan default untuk input / output.
- Celah standar berlaku.
- Ini adalah kode-golf , sehingga byte-count terendah akan menang. Tiebreak adalah pengiriman sebelumnya.
Uji kasus
Format input di sini adalah daftar tupel dengan koordinat seperti pada contoh di atas sebagai elemen pertama dan keadaan elemen titik kedua. Titik yang diambil dengan warna putih ditandai sebagai "w" dan titik yang diambil dengan warna hitam sebagai "b". Semua poin lainnya ditinggalkan dan kosong.
[("a4", "w"), ("b2", "b"), ("b4", "b"), ("c4", "b"), ("d1", "w") , ("d2", "w"), ("e3", "w"), ("e4", "w"), ("e5", "w"), ("f2", "b") , ("f4", "b"), ("f6", "b"), ("g4", "w")] -> 2 [("a1", "b"), ("a4", "b"), ("a7", "b"), ("b4", "b"), ("c4", "b") , ("d3", "w"), ("d2", "w"), ("d1", "w")] -> 3 [] -> 0 [("b4", "b"), ("a4", b "), (" c4 ", w")] -> 0 [("b4", "b"), ("a4", b "), (" c4 ", b")] -> 1 [("a1", "b"), ("a4", "b"), ("a7", "b"), ("b2", "b"), ("b4", "b") , ("b6", "b"), ("c3", "b"), ("c4", "b"), ("c5", "b"), ("e3", "w") , ("e4", "w"), ("e5", "w"), ("f2", "w"), ("f4", "w"), ("f6", "w") , ("g1", "w"), ("g4", "w"), ("g7", "w")] -> 8
Selamat Coding!
sumber
d3
dand5
tidak terhubung. Aturan mengatakan:Three men of the same color form a mill when they are in a straight row of connected points.
. Saya menambahkan beberapa contoh di bagian ini untuk menjelaskannya, terima kasih atas komentarnya!Jawaban:
APL (Dyalog Classic) ,
2625 byte-1 terima kasih kepada FrownyFrog
Cobalah online!
Argumennya adalah array 3x3x3
1
(hitam),¯1
(putih), dan0
(kosong). Dimensi pertama sepanjang kedalaman bersarang kotak konsentris. Dua dimensi lainnya berada di sepanjang sumbu vertikal dan horizontal.Kami memiliki gilingan setiap kali penjumlahan di sepanjang sumbu menghasilkan
3
atau¯3
, kecuali kita harus membuang keempat sudut saat menjumlahkan sepanjang sumbu pertama.{}
adalah fungsi dengan argumen implisit⍵
↓⍵
adalah perpecahan - dalam kasus kami ternyata sebuah kubus 3x3x3 dalam matriks 3x3 dari bersarang panjang-3 vektor⍵⍪↓⍵
mengambil kubus asli dan menempelkan matriks 3x3 dari 3-vektor di bawahnya, jadi kami mendapatkan array skalar dan vektor 4x3x3 campuran+/
menjumlahkan sepanjang sumbu terakhir; ini memiliki efek gabungan dari menjumlahkan kubus asli di sepanjang sumbu terakhir (+/⍵
) dan menjumlahkannya di sepanjang sumbu tengah karena pemisahan yang kami lakukan (+/↓⍵
)Sekarang kita harus mengurus case khusus untuk sumbu pertama.
+⌿⍵
menjumlahkan sepanjang sumbu pertama, mengembalikan matriks 3x34 2⍴
tapi kita tidak harus menghitung sudut, jadi kita membentuk kembali ke matriks 4x2 seperti ini:sekarang kami hanya tertarik pada kolom terakhir (
BDFH
), jadi kami menggunakan idiom⊢/
,
bergabungBDFH
dengan matriks yang kami peroleh sebelumnya untuk sumbu 2 & 3 (BDFH
dan matriks keduanya memiliki dimensi utama 4)∊
meratakan semua yang kami peroleh sejauh ini menjadi satu vektor|
mengambil nilai absolut{ }∩≢
memfilter hanya bertiga - panjang (≢) input selalu 3≢
menghitungnyasumber
≢{|∊(+/⍵⍪↓⍵),⊢/4 2⍴+⌿⍵}∩≢
lebih pendek :)JavaScript (ES6),
276228125117105 byte(di atas berisi beberapa karakter ascii yang tidak dapat dicetak yang tidak akan muncul di sini, jadi inilah versi tanpa
btoa
yang dapat disalin dan dijalankan)Memecah string referensi menjadi kembar tiga surat yang cocok dengan kunci grup pabrik. Input dalam bentuk objek, di mana tombol adalah huruf
a-x
, mulai dari kiri bawah dan berakhir di kanan atas, bergerak dari kiri ke kanan terlebih dahulu. Nilai1
untuk putih,-1
hitam, dan0
kosong.Contoh
Contoh-contoh ini diambil dari contoh OP, dikonversi ke objek kunci-huruf dan nilai-angka. Yang pertama adalah dari contoh gambar, sedangkan yang lain dari contoh set.
sumber
atob
.btoa
. Juga menemukan beberapa perbaikan lain yang membuatnya semakin turun.Mathematica,
217131 BytesMeskipun saya yakin ini tidak terlalu kompetitif, inilah entri untuk Anda.
Contoh input:
Mengizinkan nama koordinat karakter tunggal dengan mudah menghilangkan 51 karakter, menjadikan ini solusi 166 byte. Memberi nama pemain 1 dan 2 daripada "w" dan "b" golf dari 17 karakter lebih lanjut.
Jadi kita dapatkan
sumber
1
dan2
. contoh yang digunakanw
danb
, tapi saya cukup yakin kita tidak dibatasi untuk itu.APL (Dyalog Unicode) , 50 byte
"Solusi Objek"
Meskipun lebih panjang (29 karakter) daripada solusi @ ngn , ia menggunakan pendekatan yang sama sekali berbeda: Input memiliki struktur keseluruhan yang sama dengan solusi itu, tetapi semua slot direpresentasikan sebagai objek. Slot kosong (termasuk kolom tengah yang tidak ada) harus berupa objek kosong. sementara semua pria kulit hitam harus menjadi referensi ke objek "pria kulit hitam", dan semua pria kulit putih harus menjadi referensi ke objek "pria kulit putih". Semua objek secara opsional memiliki D isplay F orm s yang bagus untuk dibaca, dan kolom tengah secara opsional dapat dibuat tidak terlihat.
Cobalah online!
+/
jumlah dari1=(
...)
yang ada di≢¨(
...)
penghitungan,
yang diratakan (diratakan)∪/
set unik di seluruh,
digabungkan ke∪⌿⍤2
set unik ke bawah,(
...)
disatukan ke⊢/
kolom paling kanan4 2⍴
itu, dibentuk kembali menjadi empat baris dan dua kolom,∪⌿
set kolom unikSebuah atas operator, seperti yang disediakan dengan AGL (
ä
), akan membawa panjang ke 27 karakter .sumber