Takuzu adalah gim logika tempat Anda harus menyelesaikan kisi dengan sel yang berisi 0
s dan 1
s. Kisi harus mengikuti 3 aturan:
- Tidak ada tiga sel berturut-turut horisontal atau vertikal yang bisa sama.
- Harus ada jumlah
0
s dan1
s yang sama di setiap baris dan kolom. - Tidak ada dua baris yang bisa sama, dan tidak ada dua kolom yang bisa sama.
Mari kita lihat kisi-kisi yang sudah jadi:
0011
1100
0101
1010
Seperti yang Anda lihat, forum ini mengikuti aturan 1
, 2
dan 3
. Tidak ada tiga sel horizontal atau vertikal yang sama, semua baris dan kolom berisi jumlah 0
s dan 1
s yang sama, dan tidak ada dua baris dan tidak ada dua kolom yang sama.
Mari kita lihat kisi yang tidak valid:
110100
010011
011010
101100
100011
001101
Ada banyak masalah dengan kisi ini. Misalnya, baris 5
memiliki tiga 0
s berturut-turut, dan kolom 2
memiliki tiga 1
s berturut-turut, diikuti oleh tiga 0
s. Karenanya, ini bukan kisi yang valid.
Tugas:
Tugas Anda adalah untuk membuat program yang, mengingat array 2D n
* n
0
s dan 1
s, memverifikasi papan untuk melihat apakah itu, selesai papan Takuzu valid.
Contoh:
0011
1100
0101
1010
Papan ini mengikuti semua aturan, dan karenanya merupakan papan Takuzu yang valid. Anda harus mengembalikan nilai kebenaran untuk ini.
11
00
Ini bukan baris board yang valid 1
tidak mengikuti aturan 2
. Anda harus mengembalikan nilai falsey untuk ini.
100110
101001
010101
100110
011010
011001
Ini bukan papan yang valid, ini gagal (hanya) karena aturan 3 - baris pertama dan keempat adalah sama.
110100
001011
010011
101100
100110
011001
Ini bukan papan yang valid, ini gagal (hanya) karena aturan 3 - kolom pertama dan keempat adalah sama.
011010
010101
101100
010011
100110
101001
Ini adalah papan yang valid.
Aturan dan Spesifikasi:
- Anda dapat mengasumsikan bahwa semua papan adalah kuadrat dimensi
n * n
, di manan
bilangan bulat genap positif. - Anda dapat mengasumsikan bahwa semua papan sudah selesai.
- Anda dapat mengambil input sebagai array 2D yang berisi nilai yang menandakan
0
dan1
, atau sebagai string. - Anda harus menampilkan nilai-nilai kebenaran dan falsey yang konsisten untuk papan kebenaran dan falsey, dan nilai-nilai yang mewakili "kebenaran" dan "falsey" tidak boleh sama.
Ini adalah kode-golf , jadi kode terpendek dalam byte menang!
sumber
Jawaban:
Brachylog ,
2018 byteCobalah online!
Penjelasan
sumber
false
untuk ini ?Sekam ,
1918 byteCobalah online!
1 byte disimpan berkat H.PWiz!
Gagasan utamanya adalah menerapkan serangkaian transformasi pada input yang merupakan identitas untuk papan yang valid dan memeriksa apakah hasil akhirnya sama dengan input asli.
Penjelasan
sumber
)
Jelly , 17 byte
Cobalah online!
-6 byte berkat miles dan Jonathan Allan .
sumber
µZ$⁺
hal itu lagi: p ... dan 17 byte dengan menukar sedikit: D sekarang saya mengalahkan brachylog heheMathematica, 143 byte
memasukkan
sumber
Python 2 , 127 byte
Cobalah online!
Membaca daftar n n -tuples sebagai masukan.
Saya bisa menampilkan dengan kode keluar dengan menulis
1/(…)
alih-alihprint…
tetapi rasanya payah. Haruskah saya?Penjelasan
n
adalah ukuran papan;b
adalah daftar kolom (transposisi daria
). Sisanya adalah satu perbandingan panjang dirantai:[n/2]*n*2==map(sum,a+b)
aturan pengecekan 2. Setiap baris dan kolom harus berjumlah n / 2.map(sum,a+b)>len(set(a))
selalu benar (daftar> int).len(set(a))==len(set(b))==n
aturan pemeriksaan 3.n<'0, 0, 0'
selalu benar (int <str).'0, 0, 0'not in`a+b`>'1, 1, 1'not in`a+b`
memeriksa aturan 1.`a+b`
adalah representasi string dari semua baris dan kolom; untuk input contoh pada TIO ituDi
`a+b`>'1, 1, 1'
tengah selalu benar karena string ini dijamin untuk memulai"["
, yang lebih besar dari"1"
.sumber
[n/2]*n*2==map(sum,a+b)>len(set(a))==len(set(b))==n<'0, 0, 0'not in`a+b`>'1, 1, 1'not in`a+b`>x
, yang 2 byte lebih pendek dari pembagian dan menghasilkanNameError
input yang benar.Sekam ,
2725 byteInput adalah daftar daftar dan output
1
untukTrue
dan0
untukFalse
Cobalah online!
Penjelasan
Tes 1
Tes 2
Tes 3
sumber
Retina ,
1298985 byteCobalah online! Output 0 untuk valid, 1 untuk tidak valid. Sunting: Disimpan 4 byte berkat @MartinEnder. Penjelasan:
Gandakan setiap baris dengan
,
pemisah.Alihkan duplikat pertama.
Gandakan lagi, kali ini dengan
;
pemisah.Hapus semua pasangan digit yang cocok yang mendahului titik koma.
Periksa untuk melihat apakah ada kolom atau baris yang gagal salah satu aturan;
(.)\1\1
memeriksa tiga digit identik berturut-turut,\d,?;
memeriksa digit tidak berpasangan dan(\D\d+\b).*\2
memeriksa duplikat.sumber
(...).*
pada tahap terakhir hanya untuk melakukannyamax(matches,1)
maka Anda dapat menyimpan tiga byte dengan menggunakan1
konfigurasi sebagai gantinya..\b\d+\b
bisa jadi\D\d+\b
..*
sebelumnya saya gunakan tetapi tidak berpikir untuk menggunakan konfigurasi untuk membatasi hasilnya, terima kasih!Pyth , 31 byte
Terima kasih banyak kepada @Leaky Nun .
Verifikasi semua test case atau Coba di sini!
Pyth ,
48 46 4442 byteIni solusi awal.
Verifikasi semua test case atau Coba di sini!
sumber
MATL , 27 byte
Input adalah matriks yang mengandung
0
dan1
. Keluaran adalah0
untuk kepalsuan,1
untuk kebenaran.Cobalah online! Atau lihat test case: 1 , 2 , 3 , 4 , 5 .
Penjelasan
sumber
R ,
114107 byte-7 Terima kasih kepada Giuseppe, memanggil fungsi-fungsi tidak sesuai dan benar-benar menekan kondisi
Cobalah online!
Ini hanya berlaku aturan untuk kolom dari matriks, kemudian kolom dari transpose dari matriks.
Mengambil input dalam bentuk:
Itulah cara R mengambil array 2D.
Output BENAR untuk kegagalan, SALAH untuk melewati.
sumber
mean(y)-.5
di dalamf
fungsi internal untuk mendapatkan sarana daripadacolMeans
, dan dibuatg
anonim. Ini akan menambahkan peringatan untuk mengkonversidouble
kelogical
dalam panggilan keany
tetapi tidak apa-apa.Perl 6 ,
10093 bytePersimpangan FTW! Mereka menghemat 7 byte.
Untuk saat ini, ini tampaknya mengalahkan semua kiriman lainnya yang ditulis dalam bahasa non-golf. Yippie!
Cobalah online!
Penjelasan : Ini adalah blok yang menganggap papan sebagai daftar daftar. Kami membuat transpos dengan
[Z] @^a
(mengurangi daftar daftar dengan operator zip). Begitu@^a,[Z] @^a
juga daftar dewan dan transposnya. Kami memutarnya denganfor
yang bekerja persis sepertimap
, hanya menjadi 1 char lebih murah dalam hal ini.Di dalam, kita pertama-tama bergabung dengan daftar yang menyusun baris menjadi string, jadi kita memiliki daftar string alih-alih daftar daftar (
@(.map(*.join))
). Lalu kami menggunakan blok anonim di atasnya (.&{...}
), tempat kami sebenarnya mengevaluasi aturan. Kami akan mengevaluasi mereka hanya berdasarkan baris. (Karena kita melakukannya untuk array asli dan transpos juga.)Untuk menyimpan beberapa
!
, kami menggunakan sedikit logika dan bukannya menguji(NO repeated rows) AND (NO 3 consecutive same symbols) AND (NOT different counts of 0 and 1)
, kami mengujiNOT[ (repeated rows) OR (3 consecutive same symbols) OR (different counts) ]
. Itulah yang kami lakukan di blok anonim:.repeated
memberikan semua baris yang muncul lebih dari satu kali, lalu kami memetakan di atas baris, mencoba mencocokkan 3 simbol berturut-turut menggunakan regex, dan kurangi jumlah 0 dan 1. Ini OR'red dengan|
. (Sebenarnya itu menciptakan hal yang sangat kuat yang disebut persimpangan , tetapi kami tidak menggunakan salah satu dari kekuatannya :)) Setelah semua ini, kami mendapatkan daftar 2 "bools" (persimpangan tidak terputus). Kami akhirnya atau mereka (menggunakanmax
) dan meniadakan (!
), yang memberikan hasil yang diinginkan.sumber
J,
403855 byteCobalah online!
Mendefinisikan fungsi yang mengambil matriks persegi sebagai input.
Setidaknya itu mengalahkan Pyth (untuk saat ini ...)(keliru). Saya harus kembali menghitung emoji yang disembunyikan dalam kode saya karena J juga cocok untuk itu:[:
/^:
:1
|:
:]
:-.@
:#
:@]
:~@
Penjelasan (sedikit usang)
Ini terlihat berbeda dari jawaban saya, dan saya mungkin memperbaruinya. Sebagian masih sama - saya hanya belum memeriksa aturan 3 dan memeriksa aturan 2 sebelumnya dengan tidak benar.
Dibagi menjadi beberapa fungsi dan tidak ungolfed:
join_trans
Ini bergabung dengan transpos matriks untuk dirinya sendiri, menciptakan array matriks.
part_3
Ini memeriksa jumlah partisi 3-baris untuk melihat apakah itu adalah 3 atau 0 (karena salah satu dari ini berarti papan tidak valid), mengembalikan 1 jika dan 0 sebaliknya. Ini beroperasi pada kedua matriks dan transpos karena itu diberikan keduanya.
f
Karena tidak ada nama yang lebih baik, saya menyebutnya
f
. Ini menggantikan 0s dengan _1 dan membiarkan 1s tidak berubah. Ini untuk memungkinkan saya akhirnya memeriksa apakah jumlah 0s dan 1s sama di setiap baris dan kolom (jumlah masing-masing baris harus 0).utama
Pada dasarnya, saya memanfaatkan fakta bahwa saya telah mengaturnya sehingga
f join_trans
danpart_3 join_trans
keduanya harus berjumlah 0 jika papan valid.part_3
harus semua nol untuk papan yang valid dan keseluruhanf
harus berjumlah nol untuk papan yang valid, yang berarti bahwa jumlah dari jumlah mereka adalah 0 hanya untuk papan yang valid.sumber
*/@,@,&(~:,(0~:3|3+/\]),#=2*+/)|:
Haskell ,
137136127 byte9 byte disimpan berkat Lynn!
Cobalah online!
sumber
all
menjadi satuand
:l x=x==nub x&&and[sum y*2==length x&¬(j[0,0,0]y||j[1,1,1]y)|y<-x]
j=isSubSequenceOf
kej x=isSubSequenceOf[x,x,x]
?j a b
memanggil (dan menetapkan) sebagaia#b
?Java 8,
350326325312303299298259255 byteKembali
0
saat papan yang valid;1
jika tidak valid untuk satu atau lebih dari tiga aturan.-95 byte terima kasih kepada @Nevay .
Penjelasan:
Coba di sini.
sumber
Python 3, 187 byte
Cobalah online!
Mengambil input sebagai daftar baris.
sumber
05AB1E , 29 byte
Cobalah online!
Penjelasan
Aturan: 3
Aturan: 2
Aturan: 1
Kemudian kami membawa produk dari hasil 3 aturan dengan
P
sumber
Dyalog APL,
6452514948 byteMembutuhkan
⎕IO←0
Cobalah online!
sumber
PHP, 245 +1 byte
ew ini besar. linebreak hanya untuk kenyamanan membaca:
Mengambil string tunggal tanpa baris baru, mencetak
1
untuk kebenaran, tidak ada untuk kepalsuan.Jalankan sebagai pipa dengan
-nR
atau coba online .sumber