Apakah ini papan Takuzu yang valid?

21

Takuzu adalah gim logika tempat Anda harus menyelesaikan kisi dengan sel yang berisi 0s dan 1s. Kisi harus mengikuti 3 aturan:

  1. Tidak ada tiga sel berturut-turut horisontal atau vertikal yang bisa sama.
  2. Harus ada jumlah 0s dan 1s yang sama di setiap baris dan kolom.
  3. 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, 2dan 3. Tidak ada tiga sel horizontal atau vertikal yang sama, semua baris dan kolom berisi jumlah 0s dan 1s 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 5memiliki tiga 0s berturut-turut, dan kolom 2memiliki tiga 1s berturut-turut, diikuti oleh tiga 0s. Karenanya, ini bukan kisi yang valid.

Tugas:

Tugas Anda adalah untuk membuat program yang, mengingat array 2D n* n 0s dan 1s, 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 1tidak 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 mana nbilangan bulat genap positif.
  • Anda dapat mengasumsikan bahwa semua papan sudah selesai.
  • Anda dapat mengambil input sebagai array 2D yang berisi nilai yang menandakan 0dan 1, 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 , jadi kode terpendek dalam byte menang!

clismique
sumber
1
Terkait
Kevin Cruijssen
3
Saya tahu ini sebagai jam 0 h1 ...
Erik the Outgolfer
3
@EriktheOutgolfer Ya, saya mulai hanya mengetahui ini sebagai 0j h1 juga, tapi Takuzu adalah nama asli dari teka-teki.
clismique
@EriktheOutgolfer Saya selalu tahu itu sebagai "Binary Puzzle" atau "Subiku", tetapi "Takuzu" adalah seperti Qwerp-Derp menyebutkan nama aslinya.
Kevin Cruijssen
2
Beberapa kasus uji lagi akan menyenangkan (Saya kehilangan papan besar, valid.)
Lynn

Jawaban:

16

Brachylog , 20 18 byte

≠\≠,?¬{∋s₃=|∋ọtᵐ≠}

Cobalah online!

Penjelasan

≠                           All rows are different
 \                          Transpose
  ≠                         All columns are different
   ,?                       Append the list of rows to the list of columns
     ¬{          }          It is impossible that:
       ∋                      A row/column of the matrix…
        s₃=                   …contains a substring of 3 equal elements
           |                Or that:
            ∋ọ                The occurences of 1s and 0s in a row/column…
              tᵐ≠             …are not equal
Fatalisasi
sumber
" Tambahkan daftar baris ke daftar kolom " cara cerdas untuk golf itu! Dan di sini saya pikir jawaban 20-byte Anda to the point dan golf sebanyak yang bisa. Saya melihat Brachylog sama baiknya dalam memvalidasi matriks seperti dalam memecahkannya . :)
Kevin Cruijssen
1
Tidakkah seharusnya ini dihasilkan falseuntuk ini ?
H.PWiz
1
@ H.PWiz Temukan yang bagus, terima kasih. Kembali ke versi 18 byte yang berfungsi.
Fatalkan
@LuisMendo Saya hanya menempatkan semua baris dan semua kolom pada daftar yang sama pada dasarnya.
Fatalkan
2
@ Zgarb Benar, terima kasih. Itu ketiga kalinya saya harus mengembalikan suntingan, posting pembukaan sangat membutuhkan kasus uji yang lebih baik ...
Fatalize
11

Sekam , 19 18 byte

S=‼(Tf§=LṁDum(ṁ↑2g

Cobalah 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

S=‼(Tf§=LṁDum(ṁ↑2g
            m(ṁ↑2g    in each line, take at most two items for each sequence of equal items
           u          remove duplicate lines
     f§=LṁD          keep only those lines where the sum of each element doubled is equal to the length of the line
    T                 transpose the matrix (swap rows with columns)
  ‼                   do all the previous operations again
S=                    check if the final result is equal to the original input
Leo
sumber
2
Beberapa perombakan untuk menghapus)
H.PWiz
@ H.Piz yang hampir jelas, bodoh!
Leo
7

Jelly , 17 byte

-*S;E3Ƥ€F$TȯQZµ⁺⁼

Cobalah online!

-6 byte berkat miles dan Jonathan Allan .

Erik the Outgolfer
sumber
1
Saya yakin Anda dapat mempersingkat ini menjadi 21 byte. TIO
mil
@miles ... bahkan mungkin 19 byte ?
Jonathan Allan
1
@ Jonathan Allan itu 18 byte ... ya Anda melakukan µZ$⁺hal itu lagi: p ... dan 17 byte dengan menukar sedikit: D sekarang saya mengalahkan brachylog hehe
Erik the Outgolfer
@EriktheOutgolfer Tidak lagi, ini dasi!
Fatalkan
@ Jonathan Allan Bagus. Saya juga percaya ini adalah pertama kalinya awalan / infiks cepat yang saya tambahkan bermanfaat.
miles
5

Mathematica, 143 byte

And@@Flatten@(((s=#;Equal@@(Count[s,#]&/@{0,1})&&FreeQ[Subsequences@s,#]&/@{{1,1,1},{0,0,0}})&/@#)&&(DeleteDuplicates@#==#)&/@{#,Transpose@#})&


memasukkan

[{{0, 0, 1, 1}, {1, 1, 0, 0}, {0, 1, 0, 1}, {1, 0, 1, 0}}]]

J42161217
sumber
5

Python 2 , 127 byte

a=input()
n=len(a)
b=zip(*a)
print[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`

Cobalah online!

Membaca daftar n n -tuples sebagai masukan.

Saya bisa menampilkan dengan kode keluar dengan menulis 1/(…)alih-alih print…tetapi rasanya payah. Haruskah saya?

Penjelasan

nadalah ukuran papan; badalah 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 itu

    "[(0, 0, 1, 1), (1, 1, 0, 0), (0, 1, 0, 1), (1, 0, 1, 0), (0, 1, 0, 1), (0, 1, 1, 0), (1, 0, 0, 1), (1, 0, 1, 0)]"

    Di `a+b`>'1, 1, 1'tengah selalu benar karena string ini dijamin untuk memulai "[", yang lebih besar dari "1".

Lynn
sumber
Jika Anda ingin menampilkan dengan kode keluar, Anda bisa melakukannya [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 menghasilkan NameErrorinput yang benar.
Ovs
3

Sekam , 27 25 byte

Λ§&Λȯ¬VEX3§&Λ§=#0#1S=uSeT

Input adalah daftar daftar dan output 1untuk Truedan 0untukFalse

Cobalah online!

Penjelasan

                      SeT    Create a list with the input and itself transposed
Λ                            Is the following function true for all in the list
 §&                          And the results of the following functions
   Λȯ¬VEX3                     Test for rule 1
          §&                   The and of:
            Λ§=#0#1                Test for rule 2
                   S=u             Test for rule 3

Tes 1

Λȯ¬VEX3
Λ         Is it True for all ...
   V      Are any of the ...
     X3   Substrings of length 3 ...
    E     All equal
 ȯ¬       Logical not

Tes 2

Λ§=#0#1
Λ         Is it true for all that ...
 §=       The results of the two functions are equal
   #0         Number of 0s
     #1       Number of 1s

Tes 3

S=u
S=    Is the result of the following function equal two its argument
  u   Remove duplicates
H.Piz
sumber
3

Retina , 129 89 85 byte

.+
$&,$&
O#$`.(?=.*,)
$.%`
.+
$&;$&
+`(01|10)(?=.*;)

1ms`(.)\1\1|\d,?;|(\D\d+\b).*\2

Cobalah online! Output 0 untuk valid, 1 untuk tidak valid. Sunting: Disimpan 4 byte berkat @MartinEnder. Penjelasan:

.+
$&,$&

Gandakan setiap baris dengan ,pemisah.

O#$`.(?=.*,)
$.%`

Alihkan duplikat pertama.

.+
$&;$&

Gandakan lagi, kali ini dengan ;pemisah.

+`(01|10)(?=.*;)

Hapus semua pasangan digit yang cocok yang mendahului titik koma.

1ms`(.)\1\1|\d,?;|(\D\d+\b).*\2

Periksa untuk melihat apakah ada kolom atau baris yang gagal salah satu aturan; (.)\1\1memeriksa tiga digit identik berturut-turut, \d,?;memeriksa digit tidak berpasangan dan (\D\d+\b).*\2memeriksa duplikat.

Neil
sumber
Jika tujuan (...).*pada tahap terakhir hanya untuk melakukannya max(matches,1)maka Anda dapat menyimpan tiga byte dengan menggunakan 1konfigurasi sebagai gantinya.
Martin Ender
Dan .\b\d+\bbisa jadi \D\d+\b.
Martin Ender
@ MartinEnder Awalnya saya mengganti output yang tidak valid dengan tidak ada output dan mengujinya pada akhirnya ... Saya akhirnya mengasahnya menjadi satu tes pada akhirnya dan menyadari bahwa saya bisa menghilangkan yang terkemuka yang .*sebelumnya saya gunakan tetapi tidak berpikir untuk menggunakan konfigurasi untuk membatasi hasilnya, terima kasih!
Neil
3

Pyth , 31 byte

Terima kasih banyak kepada @Leaky Nun .

.Asm++mqy/k\0lQdm<hk3srL8d{Id,C

Verifikasi semua test case atau Coba di sini!


Pyth ,  48 46 44  42 byte

Ini solusi awal.

&{IQ&{I.TQ.Am&q/d\0/d\1!+/d*3\0/d*3\1sC,.T

Verifikasi semua test case atau Coba di sini!

& {IQ & {I.TQ.Am & q / d \ 0 / d \ 1! + / D * 3 \ 0 / d * 3 \ 1sC, .T Program penuh dengan input implisit.

 {IQ Apakah input invarian di bawah deduplicating?
& {I.TQ Dan apakah transposenya juga invarian?
                                        .TQ Transpose.
                                           Q Masukan.
                                     sC, Zip yang di atas, [^, ^^] (dan ratakan).
    & Dan apakah kondisi berikut terpenuhi?
          .Am Semua elemen jujur ​​saat memetakan ^^.
              q / d \ 0 / d \ 1 Ada 0s sebanyak 1s.
             &! + / d * 3 \ 0 / d * 3 \ 1 Dan tidak ada run dari 3 elemen yang sama.
Tuan Xcoder
sumber
3

MATL , 27 byte

,G@?!]tEqts~w7BZ+|3<bXBSdvA

Input adalah matriks yang mengandung 0dan 1. Keluaran adalah 0untuk kepalsuan, 1untuk kebenaran.

Cobalah online! Atau lihat test case: 1 , 2 , 3 , 4 , 5 .

Penjelasan

,       % Do twice. First iteration will use the input, second its transpose
  G     %   Push input
  @     %   Push iteration index: first 0, then 1
  ?     %   If nonzero
    !   %     Transpose
  ]     %   End
  t     %   The top of the stack contains the input or its transpose. Duplicate
  Eq    %   Convert to bipolar form, i.e. replace 0 by -1
  t     %   Duplicate
  s     %   Sum of each column
  ~     %   Negate. If all results are true, condition 2 is fulfilled
  w     %   Swap. Moves copy of bipolar input/transposed input to top
  7B    %   Push [1 1 1], obtained as 7 converted to binary
  Z+    %   2D convolution. Gives a matrix of the same size as the input
  |3<   %   Is each entry less than 3 in absolute value? If all results are true,
        %   condition 1 is fulfilled
  b     %   Bubble up. Moves copy of input/transposed input to top
  XB    %   Convert each row from binary to a number
  Sd    %   Sort, consecutive differences. If all results are nonzero, condition 3
        %   is fulfilled
  v     %   Concatenate all results so far into a column vector
  A     %   True if all entries are nonzero
        % End (implicit). Display (implicit)
Luis Mendo
sumber
2

R , 114 107 byte

-7 Terima kasih kepada Giuseppe, memanggil fungsi-fungsi tidak sesuai dan benar-benar menekan kondisi

function(x)any(f(x),f(t(x)))
f=function(x)c(apply(x,1,function(y)max(rle(y)$l)>2+mean(y)-.5),duplicated(x))

Cobalah online!

Ini hanya berlaku aturan untuk kolom dari matriks, kemudian kolom dari transpose dari matriks.

Mengambil input dalam bentuk:

matrix(c(0,0,1,1,1,1,0,0,0,1,0,1,1,0,1,0), ncol=4)

Itulah cara R mengambil array 2D.

Output BENAR untuk kegagalan, SALAH untuk melewati.

Kriminal kriminal
sumber
107 byte
Giuseppe
Pembaruan umum: digunakan mean(y)-.5di dalam ffungsi internal untuk mendapatkan sarana daripada colMeans, dan dibuat ganonim. Ini akan menambahkan peringatan untuk mengkonversi doubleke logicaldalam panggilan ke anytetapi tidak apa-apa.
Giuseppe
@Giuseppe Terima kasih! Saya sangat suka kombinasi itu berlaku, perubahan yang sangat cerdas! Saya memilikinya sebagai 2 aplikasi terpisah pada tahap awal dan tidak menyadari betapa bersihnya Anda bisa menggabungkannya.
CriminallyVulgar
2

Perl 6 ,100 93 byte

Persimpangan FTW! Mereka menghemat 7 byte.

Untuk saat ini, ini tampaknya mengalahkan semua kiriman lainnya yang ditulis dalam bahasa non-golf. Yippie!

{!max (@(.map(*.join)).&{.repeated| |.map:{$_~~/000|111/|.comb(0)-.comb(1)}}for @^a,[Z] @^a)}

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] @^ajuga daftar dewan dan transposnya. Kami memutarnya denganfor yang bekerja persis seperti map, 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 menguji NOT[ (repeated rows) OR (3 consecutive same symbols) OR (different counts) ]. Itulah yang kami lakukan di blok anonim: .repeatedmemberikan 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 (menggunakan max) dan meniadakan ( !), yang memberikan hasil yang diinginkan.

Ramillies
sumber
2

J, 40 38 55 byte

0=[:([:+/^:_(3(0=3|+/)\"1 ]),:-.@~:,:#=[:+/"1+:@])|:,:]

Cobalah 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  =. |: ,: ]
part_3      =. 3 (0 = 3 | +/)\"1 ]
f           =. 1 - 2 * ]
main        =. 0 = [: ([: +/^:_ part_3 , f) join_trans

join_trans

|: ,: ]
|:       Transpose
   ,:    Laminated to
      ]  Input

Ini bergabung dengan transpos matriks untuk dirinya sendiri, menciptakan array matriks.

part_3

3 (0 = 3 | +/)\"1 ]
                  ]  Input (matrix and transpose)

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

1 - 2 * ]

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

0 = [: ([: +/^:_ part_3 , f) join_trans
                             join_trans  Join transpose to input
                 part_3 , f              Apply the validity checks and join them
           +/^:_                         Sum until it converges
0 =                                      Equate to 0

Pada dasarnya, saya memanfaatkan fakta bahwa saya telah mengaturnya sehingga f join_transdan part_3 join_transkeduanya harus berjumlah 0 jika papan valid. part_3harus semua nol untuk papan yang valid dan keseluruhan fharus berjumlah nol untuk papan yang valid, yang berarti bahwa jumlah dari jumlah mereka adalah 0 hanya untuk papan yang valid.

cole
sumber
Setidaknya itu mengalahkan Pyth (untuk saat ini ...). - Saya benar-benar perlu golf jawaban saya
Tn. Xcoder
@ Mr.Xcoder haha ​​ya, sepertinya Anda selalu menarik karena itulah saya menambahkan bit "untuk sekarang". Bukannya jawaban saya tidak memiliki ruang untuk bermain golf - saya hanya tidak tahu bagaimana melakukannya dengan baik.
cole
1
Kode ini untuk 33 byte harus setara dengan milik Anda*/@,@,&(~:,(0~:3|3+/\]),#=2*+/)|:
mil
2

Haskell , 137 136 127 byte

9 byte disimpan berkat Lynn!

import Data.List
j=isSubsequenceOf
l x=x==nub x&&and[sum y*2==length x&&not(j[0,0,0]y||j[1,1,1]y)|y<-x]
g x=l x&&l(transpose x)

Cobalah online!

Wisaya Gandum
sumber
Gulung keduanya allmenjadi satu and: l x=x==nub x&&and[sum y*2==length x&&not(j[0,0,0]y||j[1,1,1]y)|y<-x]
Lynn
@ Lynn, terima kasih! Saya mencoba menggabungkan keduanya untuk sementara waktu. Tidak tahu mengapa saya tidak bisa memahaminya.
Wheat Wizard
1
Bisakah Anda mengubah j=isSubSequenceOfke j x=isSubSequenceOf[x,x,x]?
Cyoce
@Cyoce Tampaknya kehilangan saya satu byte. Jika Anda memiliki cara melakukannya yang menyelamatkan saya satu byte, saya akan dengan senang hati mengimplementasikannya. Gagasan itu sepertinya bagus.
Wheat Wizard
Di ponsel, hmmm ... Mungkin alih-alih j a bmemanggil (dan menetapkan) sebagai a#b?
Cyoce
2

Java 8, 350 326 325 312 303 299 298 259 255 byte

int r,z,c,p,i,j,k,d,u,v=1;int c(int[][]b){v(b);k=v-=u=1;v(b);return r;}void v(int[][]b){String m="",x;for(d=b.length;j<d|k<d;k+=u,j+=v,r=m.contains(x)|z!=0?1:r,m+=x)for(x="#",c=0,k*=u,j*=v;j<d&k<d;z+=i|i-1,c*=i^p^1,x+=p=i,r=++c>2?1:r,k+=v,j+=u)i=b[k][j];}

Kembali 0saat papan yang valid; 1jika tidak valid untuk satu atau lebih dari tiga aturan.

-95 byte terima kasih kepada @Nevay .

Penjelasan:

Coba di sini.

int r,z,c,p,i,j,k,d,u,v=1;
                     // Temp integers on class-level

int c(int[][]b){     // Method (1) with int-matrix parameter and int return-type
  v(b);              //  Validate the rows
  k=v-=u=1;          //  Switch rows with columns, and reset `u` to 1
  v(b);              //  Validate the columns
  return r;          //  Return the result
}                    // End of method (1)

void v(int[][]b){    // Separated method (2) with int-matrix parameter and no return-type
  String m="",s;     //  Two temp Strings to validate uniqueness of rows
  for(d=b.length;    //  Set the dimension of the matrix to `d`
      j<d|k<d        //  Loop (1) as long as either `j` or `k` is smaller than `d`
    ;                //   After every iteration:
     k+=u,j+=v       //    Increase the loop-indexes
     r=m.contains(s) //    If we've found a duplicated row,
     |z!=0?          //    or if the amount of zeroes and ones on this row aren't equal
      1:r,           //     Set `r` to 1 (invalid due to either rule 2 or 3)
     m+=s)           //    Append the current row to the String `m`
    for(s=",",       //   Set String `x` to a separator-character
        c=0,         //   Reset the counter to 0
        k*=u,j*=v,   //   Increase the loop-indexes
        j<d&k<d      //   Inner loop (2) as long as both `j` and `k` are smaller than `d`
     ;               //    After every iteration:
      z+=i|i-1,      //     Increase or decrease `z` depending on whether it's a 0 or 1
      c*=i^p^1,      //     Reset `c` if current digit `i` does not equal previous `p`
      s+=p=i,        //     Set previous `p` to current digit, and append it to String `s`
      r=++c>2?       //     If three of the same adjacent digits are found:
         1:r;        //      Set `r` to 1 (invalid due to rule 1)
        k+=v,j+=u)   //      Increase the loop-indexes
      i=b[k][j];     //    Set `i` to the current item in the matrix
                     //   End of inner loop (2) (implicit / single-line body)
                     //  End of loop (2) (implicit / single-line body)
}                    // End of separated method (2)
Kevin Cruijssen
sumber
1

Python 3, 187 byte

lambda m,c=lambda m:all([len({*m})==len(m),sum(~-("000"in x)*~-("111"in x)and x.count("1")==x.count("0")for x in m)==len(m)]):c(["".join(x[i]for x in m)for i in range(len(m[0]))])and c(m)

Cobalah online!

Mengambil input sebagai daftar baris.

Lirik
sumber
187 byte
Tn. Xcoder
171 bytes
Mr. Xcoder
147 byte , berdasarkan saran dari Mr.Xcoder.
Ovs
1

05AB1E , 29 byte

ø‚D€ÙQIDøì©O·IgQP®εŒ3ù€Ë_P}PP

Cobalah online!

Penjelasan

Aturan: 3

ø‚        # pair the input with the zipped input
  D       # duplicate
   €Ù     # deduplicate each
     Q    # check for equality with the unmodified copy

Aturan: 2

IDøì          # prepend zipped input to input
    ©         # store a copy in register for rule 1
     O        # sum each row/column
      ·       # double
       IgQ    # check each for equality to length of input
          P   # product

Aturan: 1

®ε            # apply to each row/column in register
  Œ3ù         # get sublists of length 3
     €Ë       # check each if all elements are equal
       _      # logical not
        P     # product
         }    # end apply
          P   # product

Kemudian kami membawa produk dari hasil 3 aturan dengan P

Emigna
sumber
1

Dyalog APL, 64 52 51 49 48 byte

Membutuhkan ⎕IO←0

{⍲/{(∨/∊⍷∘⍵¨3/¨⍳2)∧((⊢≡∪)↓⍵)∧∧/(≢=2×+/)⍵}¨⍵(⍉⍵)}

Cobalah online!

Zacharý
sumber
1

PHP, 245 +1 byte

ew ini besar. linebreak hanya untuk kenyamanan membaca:

$t=_;foreach($a=($i=str_split)($s=$argn)as$i=>$c)$t[$i/($e=strlen($s)**.5)+$i%$e*$e]=$c;
for(;$k++<2;$s=$t)$x|=preg_match("#000|111|(\d{"."$e}).*\\1#s",chunk_split($s,$e))
|($m=array_map)(array_sum,$m($i,$i($s,$e)))!=array_fill(0,$e,$e/2);echo!$x;

Mengambil string tunggal tanpa baris baru, mencetak 1untuk kebenaran, tidak ada untuk kepalsuan.

Jalankan sebagai pipa dengan -nRatau coba online .

Titus
sumber