Dalam permainan catur, ada bidak yang disebut ratu yang dapat menyerang bidak lain yang ada di baris, kolom atau diagonal yang sama. Dalam catur biasanya ada dua sisi, hitam dan putih, dengan masing-masing bagian milik salah satu tim. Potongan mungkin tidak menyerang potongan milik tim yang sama.
Tujuan Anda adalah untuk mengetahui tentara yang hidup berdampingan secara damai terbesar untuk sebuah papan persegi. Itu adalah jumlah ratu hitam dan putih terbesar yang dapat ditampung di papan sehingga tidak ada dua ratu yang dapat saling menyerang dan jumlah ratu hitam sama dengan jumlah ratu putih.
Anda akan menerima sebagai input panjang sisi papan persegi, dan harus menampilkan jumlah ukuran pasukan hidup berdampingan yang damai terbesar yang dapat ditampung di papan itu.
Ini adalah kode-golf sehingga aturan standar untuk tag berlaku.
Kasus uji ini mencakup semua jawaban yang diketahui. Solusi Anda harus merupakan jawaban umum yang, mengingat daya komputasi dan waktu yang cukup, dapat menghitung solusi untuk nilai input apa pun.
1: 0 2: 0 3: 1 4: 2 5: 4 6: 5 7: 7 8: 9 9:12 10:14 11:17 12:21 13: 24
Jawaban:
C, 476 byte, DFS mengulangi ratu putih, O (2 n 2 )
518 byte, DFS dengan pemangkasan, O (2 n )
577 byte, DFS iterasi ratu putih dan hitam, O (?)
Pada dasarnya, kode ini mengulangi kemungkinan ratu putih dan memeriksa apakah ratu hitam dapat ditempatkan kemudian.
Tabel referensi kecepatan (dalam detik):
sumber
Clingo , 90 byte
Demo
sumber
Python 2 |
325284217 byteCobalah online!
Sunting: Diganti tupel dengan bilangan bulat di g dan suntingan sepele lainnya.
Sunting2: Bytes ke 217 berkat musicman523 dan CalculatorFeline !
Bagaimana itu bekerja
Program ini mengulangi semua kemungkinan posisi
n
ratu dan menyaring titik-titik non-damai dig
disebabkan karena posisi ratu. Jika poin yang tersisa lebih besar darin
itu berarti ada kemungkinan bagin
pasukan ratu untuk tetap damai. Jika untuk nilai selanjutnyan
, tidak ada situasi damai ditemukan, maka program keluar dengan kode keluar:,n-1
yang merupakan jawabannya. Singkatnya, itu adalah kekerasanProgram ini dapat dibuat lebih cepat dengan mengubah dua baris terakhir menjadi
sumber
from module import*
untuk mengimpor semuanya dari modul dan menyimpan byte.Haskell ,
169 156 153152 byteMenentukan suatu fungsi
g
, mungkin lebih lanjut golf. Cobalah online! Pada TIO, ketika dikompilasi dengan-O2
, ini membutuhkan waktu sekitar 36 detik untuk n = 4 dan waktu habis pada n = 5 . Kompleksitas waktu harus O (n 2 4 n 2 ) .Penjelasan
Kami beralih pada nilai yang mungkin untuk jumlah ratu ( q ). Untuk setiap q , kami membuat semua pasangan himpunan ukuran- q dari [1..n] 2 , satu set ratu hitam ( b ) dan satu ratu putih ( w ). Kemudian, setiap elemen b diperiksa terhadap setiap elemen w untuk melihat apakah mereka berbagi baris, kolom, diagonal atau anti-diagonal. Ini juga menangani dua bagian berbagi koordinat yang sama. Nilai q terbesar yang mengakui konfigurasi yang damai adalah nilai akhir.
Dua baris pertama dari program menentukan fungsi
!
, yang menghitung panjang-k
akhir daftarx
. Implementasinya adalah dengan rekursi dasar: baik memilih elemen pertama yang akan di set atau tidak dan berulang ke ekor, mengurangik
jika perlu. Kemudian daftar kosong atau tercapai, periksa ituk==0
.Fungsi bantu kedua
&
mengambil nomorq
(jumlah ratu di kedua sisi) dan daftarl
(koordinat x papan, juga digunakan sebagai koordinat y), dan mengembalikan nilai Boolean yang menunjukkan jika ada konfigurasi yang damai. Pertama-tama kita menghitungp
, daftar panjang-q
dari daftar nilai[x,y,x-y,x+y]
, di manax
dany
berkisarl
. Mereka mewakili baris, kolom, diagonal dan anti-diagonal dari sebuah persegi(x,y)
di papan tulis.Selanjutnya kita mendapatkan hasil
q&l
. Kami menggambar dua urutanb
danw
darip
, pasangkan 4-daftar itu bersama-sama dalam semua cara yang mungkin, dan periksa bahwa mereka selalu berbeda di keempat koordinat. Jika beberapa pilihanb
danw
menghasilkan hasil yang benar, kami kembaliTrue
.Baris terakhir adalah fungsi utama. Mengingat
n
, itu hanya menemukan nilai terbesar yang mungkin dariq
yangq&[1..n]
benar.sumber