(Meskipun 60+ pertanyaan ditandai catur , kami tidak memiliki tantangan n-ratu sederhana.)
Dalam catur, Puzzle N-Queens digambarkan sebagai berikut: Diberikan n x n
papan catur dan n
ratu, atur ratu ke papan catur sehingga tidak ada dua ratu yang saling mengancam. Di bawah ini adalah contoh solusi untuk n = 8
, yang dipinjam dari Wikipedia.
Atau, dalam rendering ASCII:
xxxQxxxx
xxxxxxQx
xxQxxxxx
xxxxxxxQ
xQxxxxxx
xxxxQxxx
Qxxxxxxx
xxxxxQxx
Tantangannya di sini adalah untuk mengambil input n
dan output representasi ASCII dari solusi untuk n
puzzle -Queens. Karena ada lebih dari satu solusi yang mungkin (mis., Setidaknya, rotasi atau refleksi), kode Anda hanya perlu menampilkan solusi yang valid.
Memasukkan
Integer positif tunggal n
dengan n >= 4
format apa pun yang nyaman . (n = 2 dan n = 3 tidak memiliki solusi, dan n = 1 adalah sepele, jadi itu dikecualikan)
Keluaran
Representasi ASCII yang dihasilkan dari solusi untuk puzzle N-queens, seperti diuraikan di atas. Anda dapat memilih dua nilai ASCII yang berbeda untuk mewakili ruang kosong dan ratu. Sekali lagi, ini bisa berupa output dalam format yang sesuai (string tunggal, daftar string, array karakter, dll.).
Aturan
- Leading atau trailing newlines atau spasi putih semuanya opsional, serta spasi putih di antara karakter, selama karakter itu sendiri berbaris dengan benar.
- Anda dapat menggunakan algoritme untuk menghitung posisi yang mungkin, atau menggunakan gaya solusi "tangga-langkah" eksplisit, yang mana pun sesuai dengan kode golf Anda.
- Program lengkap atau fungsi dapat diterima. Jika suatu fungsi, Anda dapat mengembalikan output daripada mencetaknya.
- Jika memungkinkan, harap sertakan tautan ke lingkungan pengujian online sehingga orang lain dapat mencoba kode Anda!
- Celah standar dilarang.
- Ini adalah kode-golf sehingga semua aturan golf biasa berlaku, dan kode terpendek (dalam byte) menang.
Contohnya
n=4
xQxx
xxxQ
Qxxx
xxQx
n=7
xxQxxxx
xxxxxxQ
xQxxxxx
xxxQxxx
xxxxxQx
Qxxxxxx
xxxxQxx
n=10
xxxxQxxxxx
xxxxxxxxxQ
xxxQxxxxxx
xxxxxxxxQx
xxQxxxxxxx
xxxxxxxQxx
xQxxxxxxxx
xxxxxxQxxx
Qxxxxxxxxx
xxxxxQxxxx
Jawaban:
MATL ,
333227 byteCobalah online!
Gaya semi-kasar, pendekatan non-determistik:
Solusi yang diperoleh adalah acak. Jika Anda menjalankan kode lagi, Anda mungkin mendapatkan konfigurasi valid yang berbeda. Waktu berjalan juga acak, tetapi kasus uji terpanjang (
n = 10
) selesai dalam waktu sekitar 30 detik di TIO sebagian besar waktu.sumber
C, 114 byte
Mencetak solusi secara langsung dalam waktu O (1).
sumber
n/2
?n-=o=n%2;for(y=n+o;y--;)
bukannyao=n%2;n-=o;for(y=0;y<n+o;++y)
Mathematica, 103
108110117byte-5 byte untuk
DuplicateFreeQ
->E!=##&@@@
-7 byte untuk
ReplacePart[Array[],]
->SparseArray[]
Kembalikan array 2D. Dibutuhkan 2,76 untuk menghitung
f[6]
dan 135 untukf[7]
. (Dalam versi saat ini,-
menjadi0
danQ
ke1
.Algoritma ini mirip dengan jawaban MATL tetapi di sini kodenya benar-benar kasar.
sumber
C - 222 byte
Kode ini bukan milik saya, tetapi dari IOCCC . Saya harap saya tidak melanggar aturan apa pun. Juga, ini menampilkan semua solusi untuk N antara 4 dan 99. Saya akan mencoba untuk mendapatkan tautan TIO nanti.
sumber
Jelly ,
2421 byteCobalah online!
Dengan asumsi setiap ratu ditempatkan pada baris terpisah, kita hanya perlu menemukan indeks kolom untuk menempatkan masing-masing ratu untuk menghindari konflik, yang dapat ditemukan dengan menghasilkan permutasi acak dari
[1, 2, ..., n]
dan mengujinya.Penjelasan
sumber
Œc€
sebagai gantiœc€2
-1?Python 3,
204189 byteBrute force search melalui semua permutasi. Saya dapat menghapus * dan mencetak daftar pemahaman, tetapi mereka terlihat mengerikan.
Keluaran:
Sedikit tidak berbulu:
sumber
Befunge, 122 byte
Cobalah online!
Ini lebih atau kurang didasarkan pada solusi C oleh orlp .
Penjelasan
Baca jumlah ratu, q , dari stdin dan hitung dua variabel untuk digunakan nanti:,
n = q - q%2
danhn = n/2
Mulai loop utama, iterasi r , nomor baris, dari q ke 0, penurunan pada awal loop, jadi r pertama is q minus 1.
Hitung offset ratu di setiap baris dengan rumus berikut:
Output mengimbangi karakter spasi untuk indentasi posisi ratu untuk baris saat ini, ditambah satu ruang tambahan hanya karena itu membuat loop output lebih mudah.
Keluarkan
Q
untuk ratu, diikuti oleh baris baru untuk pindah ke baris berikutnya.Tes jika r adalah nol, dalam hal ini kita telah mencapai ujung papan dan dapat keluar, jika tidak kita ulangi loop utama lagi.
sumber
Haskell , 145 byte
Pendekatan brute force yang jelas:
Cobalah online!
sumber
Retina , 136 byte
Cobalah online! Port jawaban C orlp sangat bagus. Penjelasan:
Konversikan ke unary, menggunakan spasi (ada spasi setelah
*
).Buat
N
baris denganN
spasi, a;
, lalu0..N-1
spasi, lalu aQ
. Tahap yang tersisa berlaku untuk semua baris.Membagi integer
N
dengan 2. (Juga membungkus hasilnya:;
agar lebih mudah untuk jangkar pola.)Jika indeks loop sama dengan
N/2*2
, maka biarkan saja banyak ruang.Jika
N/2
kelipatan 3, maka gandakan indeks loop plus satu, moduloN/2*2+1
.Kalau tidak, ambil dua kali indeks loop plus
(N/2-1)
plus 3 tambahan di bagian bawah papan, moduloN/2*2
.Sebenarnya melakukan operasi modulo.
sumber
Arang , 44 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Port lain dari jawaban C sangat bagus @ orlp.
sumber
APL (Dyalog Unicode) , 18 byte SBCS
Program lengkap yang diminta
n
dari stdin. Mencetak solusi yang dipisahkan ruang untuk stdout menggunakan·
untuk kotak kosong dan⍟
untuk Queens.Cobalah online!
⎕CY'dfns'
C op y yang "dfns" perpustakaan⎕
dapatkan input dari stdinqueens
temukan semua solusi Queens yang benar-benar unik (tanpa refleksi atau rotasi)⊃
pilih solusi pertamasumber
J , 49 byte
Cobalah online!
Brute force dengan menguji semua permutasi panjang n .
sumber