Jika Anda tidak tahu apa arti ratu dalam catur, itu tidak masalah; itu hanya nama :)
Input Anda akan berupa kuadrat lebar dan tinggi acak yang berisi sejumlah ratu. Papan input akan terlihat seperti ini (papan ini memiliki lebar dan tinggi 8):
...Q....
......Q.
..Q.....
.......Q
.Q......
....Q...
Q.......
.....Q..
Ada 8 ratu di papan ini. Jika ada, katakanlah, 7, atau 1, atau 10 di sini, dewan tidak akan valid.
Di sini kita gunakan .
untuk ruang kosong, dan Q
untuk ratu. Anda dapat, sebagai alternatif, menggunakan karakter non-spasi putih yang Anda inginkan.
Input ini dapat diverifikasi sebagai valid, dan Anda harus mencetak (atau mengembalikan) nilai yang sebenarnya (jika tidak valid, Anda harus mencetak (atau mengembalikan) nilai palsu). Ini valid karena tidak ada ratu di baris yang sama, kolom, diagonal atau anti-diagonal seperti yang lain .
Contoh (jangan tampilkan benda dalam tanda kurung):
...Q....
......Q.
..Q.....
.......Q
.Q......
....Q...
Q.......
.....Q..
1
...Q.
Q....
.Q...
....Q
..Q..
0
Q.
Q.
0
..Q
...
.Q.
0 (this is 0 because there are only 2 queens on a 3x3 board)
..Q.
Q...
...Q
.Q..
1
Q
1 (this is valid, because the board is only 1x1, so there's no queen that can take another)
Biarkan saya tekankan bahwa input hanya valid, jika tidak ada ratu di baris, kolom, diagonal atau anti-diagonal yang sama dengan yang lain .
Aturan
- Anda tidak akan pernah menerima input kosong
- Jika input mengandung lebih sedikit ratu daripada akar kuadrat dari area papan, itu tidak valid.
- Perhatikan tidak ada solusi yang valid untuk papan 2x2 atau 3x3, tetapi ada solusi untuk setiap papan ukuran persegi lainnya, di mana lebar dan tinggi adalah bilangan alami.
- Input mungkin dalam format apa pun yang masuk akal, sesuai aturan PPCG
- Input akan selalu berupa sqaure
- Saya menggunakan 1 dan 0 dalam contoh, tetapi Anda dapat menggunakan nilai yang benar atau salah (seperti
Why yes, sir, that is indeed the case
danWhy no, sir, that is not the case
)
Karena ini adalah kode-golf , kode terpendek menang!
{(x, y, v)}
denganv
di[., Q]
menjadi format input yang valid?(0, 0, Q), (0, 1, .), (1, 0, Q), (1, 1, .)
akan menjadi kasus uji ketiga.Jawaban:
Siput , 14 byte
Cobalah online!
Tidak ada yang seperti bahasa pencocokan pola 2D untuk masalah keputusan 2D. :)
Penjelasan
Pada
&
baris pertama adalah opsi mode pencocokan yang membutuhkan pola pada baris kedua untuk mencocokkan dari setiap posisi yang mungkin dalam input. Jika demikian, program akan mencetak1
, jika tidak maka akan dicetak0
.Adapun pola itu sendiri, perhatikan bahwa ada yang tersirat
)
di akhir.Mengapa ini bekerja paling mudah untuk dilihat dengan mulai dari lookahead negatif: dengan memastikan bahwa tidak ada
Q
dalam garis lurus dari yang lain yangQ
telah kami temukan, kami memastikan bahwa tidak ada lebih dari N ratu (jika tidak, akan ada menjadi dua dalam satu baris, dan tidak mungkin menemukan ratu ini tanpa menemukan yang lain). Kemudian bagian pertama, memastikan bahwa ada ratu yang dapat dijangkau dalam arah ortogonal dari posisi mana pun, memastikan bahwa ada ratu N yang tepat . Jika ada yang hilang, akan ada baris dan kolom tanpa ratu. Mulai dari persimpangan ini, tidak mungkin menemukan ratu hanya dengan pergi ke arah ortogonal.sumber
Jelly , 17 atau 15 byte
Cobalah online!
Penggunaan
‘
untuk seorang ratu dan¹
untuk ruang kosong. (Ini sebagian besar merupakan konsekuensi dari larangan mengambil input sebagai array, karena memaksa input menjadi string; mengubah string ke integer adalah sulit di Jelly, dengan metode termudah sedang dievaluasi, dan ternyata bukan 1 dan 0, menggunakan "tambah 1" (‘
) dan "tambah 0" (¹
) memungkinkan untuk menghilangkan beberapa jumlah dan instruksi peta, karena kita dapat menghitung ratu dalam daftar dengan mengevaluasinya.) Nilai-nilai kebenaran dan falsey adalah normal Jelly1
dan0
.EDIT: Pertanyaannya sudah diubah sejak saya menulis jawaban ini untuk memungkinkan mengambil input sebagai matriks. Ini memungkinkan untuk menjatuhkan yang terdepan
Ỵµ
, menghemat 2 byte. Mungkin juga memungkinkan mengubah format input menjadi sesuatu yang lebih normal, menggunakanS
penjumlahan daripadaV
untuk mengevaluasi, tapi saya tidak berpikir bahwa menyimpan byte dan saya semacam format funky ini.Penjelasan
Jadi ide dasarnya adalah kita memastikan bahwa paling banyak ada satu ratu pada setiap antidiagonal, diagonal, dan kolom; dan tepat satu ratu di setiap baris. Kondisi-kondisi ini cukup bersama sehingga membutuhkan paling banyak satu ratu pada masing-masing dari empat jenis garis, dan sejumlah ratu sama dengan panjang sisi papan.
Kebetulan, Jelly mungkin bisa melakukan dengan built-in untuk antidiagonals, tetapi AFAICT tampaknya tidak memilikinya, jadi saya perlu puas dengan memantulkan papan dan kemudian mengambil diagonal.
Catatan lain yang menarik adalah bahwa perubahan
=1Ṃ
keE
(semua sama) memberikan umum n -queens checker, yang juga akan menerima n × n papan di mana setiap baris, kolom, diagonal, dan antidiagonal mengandung tidak lebih dari k ratu, dan papan berisi persis kn queens. Membatasi k sama dengan 1 sebenarnya menghabiskan dua byte.sumber
Oktaf,
5770675152 byteDisimpan 1 byte menggunakan
flip
bukanrot90
berkat @LuisMendo, tetapi menemukan bug pada kasing 1x1Mengambil input sebagai matriks biner dengan 1 mewakili Queen dan 0 mewakili ruang kosong.
Menciptakan fungsi anonim yang pertama kali menggabungkan matriks input dan transposinya.
spdiags
menciptakan matriks dengan jumlah baris yang sama dengan argumen, dengan diagonal diubah menjadi kolom (nol-empuk seperlunya), jadi digabungkanspdiags
dari matriks input untuk mendapatkan diagonal danspdiags
dari matriks membalik secara horizontal untuk mendapatkan antidiagonal.Sekarang ambil jumlah dari setiap kolom dari matriks gabungan dan pastikan setiap kolom adalah tepat 1.
Sampel dijalankan ideone .
sumber
flip
sebagai gantinyarot90
all()
?MATL ,
3834 byte4 byte off berkat @ speaker !
Input adalah array 2D dari nol dan satu, menggunakan titik koma sebagai pemisah baris.
Ini menghasilkan vektor kolom yang benar, dan vektor kolom berisi setidaknya satu nol sebagai kepalsuan.
Cobalah online! Kode footer adalah
if
cabang untuk menunjukkan kebenaran atau kepalsuan.Atau verifikasi semua kasus uji .
Penjelasan
sumber
J , 37 byte
Fungsi kereta anonim yang mengambil matriks Boolean sebagai argumen.
Cobalah online!
(
+/
jumlah&
dari,
ravel yang=
sama#
penghitungan baris)
*
dan (kali lit.)1
satu=
sama[:
dengan>./
maksimum+/
jumlah/.
diagonal,
dan (lit. dikurangkan ke)+/
jumlah yang/.
diagonal&
dari|.
sebaliknya,
dan+/
jumlah di,
dan+/
jumlah&
dari|:
transpossumber
SnakeEx , 67 byte
Digunakan
_
sebagai pengganti.
input. Mengembalikan 1 atau lebih kecocokan untuk kebenaran, 0 kecocokan untuk falsey. Anda dapat menemukan juru bahasa online di tautan di tajuk.Penjelasan
SnakeEx adalah bahasa dari tantangan Pencocokan Pola 2-D . Ini mendefinisikan "ular" yang bergerak di sekitar hal-hal yang cocok dengan kotak. Ular dapat memunculkan ular lain, membuat bahasanya cukup kuat.
Mari kita lihat program ini dari bawah ke atas.
Ini mendefinisikan ular
n
yang cocok dengan 1 atau lebih garis bawah dan kemudian tepi kisi. Perhatikan bahwa ini mungkin berada di salah satu dari 8 arah mata angin - arahnya ditentukan ketika ular itu melahirkan.Mirip dengan di
n
atas, ini mendefinisikanq
sebagai ular yang cocok dengan sejumlah garis bawah, satuQ
, sejumlah garis bawah, dan tepi grid. Dengan kata lain, baris / kolom / diagonal yang hanya memiliki satu ratu di dalamnya.e
adalah ular yang cocok dengan satu karakter dan ujung kisi.Ular utama
m
menggunakan blok bangunan ini untuk memeriksa seluruh papan. Secara konseptual, ia berjalan di sekitar tepi luar grid, menelurkan ular lain untuk memeriksa bahwa semua kolom dan baris memiliki tepat satu ratu, dan semua diagonal memiliki paling banyak satu ratu. Jika ada ular yang muncul gagal untuk mencocokkan, seluruh pertandingan gagal. Mari kita jabarkan.( )%{4}
menjalankan apa yang ada di dalam tanda kurung 4 kali, sekali untuk setiap sisi. (Dalam penjelasan berikut, sangat membantu untuk menggambarkan sisi tertentu - katakanlah, tepi atas kisi, mulai dari sudut kiri atas dan bergerak ke kanan.){q<>}
memunculkanq
ular ke arah yang sama bahwa ular utama bergerak. Ini memverifikasi bahwa tepi saat ini memenuhi aturan "tepat satu ratu". Perhatikan bahwa ular yang bertelur tidak menggerakkan pointer korek api ular utama, jadi kita masih berada di awal tepian.( )*
cocok dengan 0 atau lebih dari apa yang ada di dalam tanda kurung.{q<R>}
memunculkanq
ular berbelok ke kanan dari arah ular utama. (Misalnya jika ular utama bergerak ke kanan di sepanjang tepi atas, ular ini bergerak ke bawah.) Ini memeriksa setiap kolom / baris.[ ]
cocok dengan salah satu opsi di dalam kurung:{q<RF>}
memunculkanq
ular berbelok 45 derajat ke kanan (yaituR
ight danF
orward) dari arah ular utama. Theq
ular cocok jika diagonal yang berisi tepat satu Ratu.{n<RF>}
memunculkann
ular sebagai gantinya. Then
ular cocok jika diagonal tidak mengandung ratu..
cocok dengan karakter apa pun, menggerakkan penunjuk pertandingan ke depan.{e<>}
.<R>
putar ular utama ke kanan, siap untuk mencocokkan tepi berikutnya.Hal-hal aneh
X
(cabang di semua arah diagonal) sebagai penggantiRF
. Sayangnya, juru bahasa online mengatakan itu adalah kesalahan sintaksis. Saya juga mencoba*
(bercabang ke segala arah), tapi itu tergantung juru bahasa._*Q?_*$
seharusnya bekerja untuk mencocokkan "paling banyak satu ratu" di diagonal, tetapi itu juga menggantung penerjemah. Dugaan saya adalah bahwa kemungkinan kecocokan kosong menyebabkan masalah.sumber
Ruby, 120 byte
Fungsi Lambda berdasarkan spesifikasi asli yang membutuhkan input sebagai string.
mengubah Q menjadi bilangan kompleks dan menguranginya satu sama lain. Jika perbedaan antara koordinat dari dua ratu adalah horisontal, vertikal atau diagonal, menaikkannya ke daya 4 akan menghasilkan bilangan real dan pengaturan tidak valid.
Tidak digabungkan dalam program uji
sumber
Python 3 ,
232200155 byteCobalah online!
-32 byte terima kasih kepada @beaker yang memperhatikan perubahan spesifikasi input; Saya telah mengubah bahasa dari Python 3 menjadi 2, sehingga memungkinkan saya untuk menggunakan
input
input sebagai array string atau array array karakter.-45 byte terima kasih kepada @Leaky Nun
sumber
JavaScript (ES6), 115 byte
Tidak Terkumpul:
sumber
Ruby, 155 byte
Ini mengerikan untuk dibaca, jadi saya punya versi yang sedikit kurang golf di bawah ini
Ini adalah kode yang sama, tetapi dengan beberapa baris baru untuk memisahkan apa yang terjadi.
Kode itu sendiri adalah fungsi lambda anonim yang mengambil larik string (
x
) dalam format["..Q", "Q..", ".Q."]
.Baris pertama adalah memetakan setiap string ke indeks karakter Q dalam string itu. Jika tidak ada karakter Q, itu diganti dengan -2 1 . Array indeks baru ini ditugaskan ke variabel
y
.Baris berikutnya ritsleting array indeks ini dengan dirinya sendiri diimbangi oleh satu (diputar). Ini menghasilkan array pasang indeks berurutan.
Baris berikutnya sangat rumit. Itu melewati masing-masing pasangan indeks, dan mengurangi yang lebih kecil dari yang lebih besar. Jika ini 1 (dan kami bukan pasangan terakhir 2 ), maka ada dua ratu yang berada di diagonal yang sama, dan nilai -2 dimasukkan, jika tidak, indeks asli ratu dalam string dimasukkan .
Baris terakhir merangkum semua indeks untuk masing-masing dan memeriksa untuk melihat apakah itu adalah angka segitiga untuk n-1, di mana n adalah lebar (atau tinggi) dari bujur sangkar.
1: -1 akan menjadi tujuan saya, tetapi 1 terpisah dari 0, jadi akan berantakan dengan pemeriksaan diagonal. Negatifnya adalah penting untuk membuat jumlah akhir yang salah. Saya memikirkan angka tinggi (dengan angka tunggal) seperti 9, tetapi saya tidak yakin itu tidak akan menghasilkan verifikasi yang salah.
2: Papan tidak membungkus, sedangkan
rotate
fungsi array ruby tidak, dan jika pasangan terakhir berbeda satu sama lain tidak masalah - itu bukan diagonal.sumber
PHP,
137143 byteterinspirasi oleh solusi Neil
mengambil input dari argumen baris perintah pertama; jalankan bersama
-r
. Membutuhkan jeda baris byte tunggal.Sebenarnya Anda dapat menggunakan karakter apa pun kecuali
0
untuk jeda baris.mencetak true (
1
) atau false (string kosong).kerusakan
sumber
Python 3 ,
185176175172171 byteFungsi anonim mengambil daftar string sebagai input.
Python 2 , 175 byte
sumber