Czy to ważna tablica Takuzu?

21

Takuzu to gra logiczna, w której musisz wypełnić siatkę komórkami zawierającymi 0s i 1s. Siatka musi spełniać 3 zasady:

  1. Żadne trzy kolejne poziome lub pionowe komórki nie mogą być takie same.
  2. W każdym rzędzie i kolumnie musi znajdować się taka sama liczba 0si 1.
  3. Żadne dwa wiersze nie mogą być takie same i żadne dwie kolumny nie mogą być takie same.

Spójrzmy na gotową siatkę:

0011
1100
0101
1010

Jak widać, ta płyta następująca reguła 1, 2i 3. Nie ma trzech poziomych lub pionowych komórek, które są takie same, wszystkie wiersze i kolumny zawierają taką samą liczbę 0si 1si, i nie ma dwóch wierszy i żadnych dwóch kolumn.

Spójrzmy na niepoprawną siatkę:

110100
010011
011010
101100
100011
001101

Jest wiele problemów z tą siatką. Na przykład wiersz 5ma trzy 0s z rzędu, a kolumna 2ma trzy 1s z rzędu, a następnie trzy 0s. Dlatego nie jest to poprawna siatka.

Zadanie:

Twoim zadaniem jest, aby program, który, biorąc pod uwagę tablicę 2D n* n 0s i 1s weryfikuje planszę, aby zobaczyć, czy jest to poprawny, wykończone deska Takuzu.

Przykłady:

0011
1100
0101
1010

Ta tablica spełnia wszystkie zasady i dlatego jest prawidłową tablicą Takuzu. Musisz zwrócić za to prawdziwą wartość.

11
00

To nie jest prawidłowa tablica - rząd 1nie przestrzega reguły 2. Musisz zwrócić za to wartość falsey.

100110
101001
010101
100110
011010
011001

To nie jest prawidłowa plansza, zawodzi (tylko) z powodu reguły 3 - pierwszy i czwarty rząd są takie same.

110100
001011
010011
101100
100110
011001

To nie jest poprawna plansza, nie powiedzie się (tylko) z powodu reguły 3 - pierwsza i czwarta kolumna są takie same.

011010
010101
101100
010011
100110
101001

To jest ważna tablica.

Zasady i specyfikacje:

  • Możesz założyć, że wszystkie tablice mają kwadratowe wymiary n * n, gdzie ndodatnia liczba parzysta jest liczbą całkowitą.
  • Możesz założyć, że wszystkie tablice są gotowe.
  • Dane wejściowe można traktować jako tablicę 2D zawierającą wartości oznaczające 0i 1lub ciąg znaków.
  • Musisz generować spójne wartości prawdy i falseya dla tablic prawdy i falseya, a wartości reprezentujące „prawdę” i „falsey” nie mogą być takie same.

To jest , więc wygrywa najkrótszy kod w bajtach!

clismique
źródło
1
Powiązane
Kevin Cruijssen
3
Znam to jako 0h h1 ...
Erik Outgolfer
3
@EriktheOutgolfer Tak, zacząłem tylko wiedzieć, że jest to 0 h h1, ale Takuzu to oryginalna nazwa układanki.
clismique
@EriktheOutgolfer Zawsze znałem to jako „Binary Puzzle” lub „Subiku”, ale „Takuzu” jest tak, jak Qwerp-Derp wspomniał o oryginalnej nazwie.
Kevin Cruijssen
2
Przydałoby się jeszcze kilka przypadków testowych (brakuje mi dużych, ważnych tablic.)
Lynn

Odpowiedzi:

16

Brachylog , 20 18 bajtów

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

Wypróbuj online!

Wyjaśnienie

≠                           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
Fatalizować
źródło
Dołącz listę wierszy do listy kolumn ” inteligentny sposób na golfa! I tutaj myślałem, że twoja 20-bajtowa odpowiedź była trafna i grała w golfa tak bardzo, jak tylko mogła. Widzę, że Brachylog sprawdza się zarówno w sprawdzaniu poprawności macierzy, jak i w ich rozwiązywaniu . :)
Kevin Cruijssen
1
Czy nie powinno to falsew tym przypadku wynikać ?
H.PWiz
1
@ H.PWiz Dobre znalezisko, dzięki. Przywrócono do działającej wersji 18-bajtowej.
Fatalize
@LuisMendo Po prostu umieszczam wszystkie wiersze i wszystkie kolumny na tej samej liście.
Fatalize
2
@Zgarb Prawidłowo, dzięki. To już trzeci raz, kiedy musiałem cofnąć edycję, rozpaczliwie potrzebuję lepszych przypadków testowych ...
Fatalize
11

Łuska , 19 18 bajtów

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

Wypróbuj online!

1 bajt zapisany dzięki H.PWiz!

Główną ideą jest zastosowanie serii transformacji do danych wejściowych, które są tożsamościami dla prawidłowej płytki i sprawdzenie, czy końcowy wynik jest taki sam jak oryginalny sygnał wejściowy.

Wyjaśnienie

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
Lew
źródło
2
Trochę przetasowań w celu usunięcia)
H.PWiz
@ H.PWiz to było prawie oczywiste, głupie mnie!
Leo
7

Galaretka , 17 bajtów

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

Wypróbuj online!

-6 bajtów dzięki milom i Jonathanowi Allanowi .

Erik the Outgolfer
źródło
1
Wierzę, że możesz to skrócić do 21 bajtów. TIO
mile
@miles ... może nawet 19 bajtów ?
Jonathan Allan
1
@JonathanAllan to 18 bajtów ... tak, zrobiłeś to µZ$⁺jeszcze raz: p ... i 17 bajtów, zmieniając trochę: D teraz pokonałem Brachylog hehe
Erik the Outgolfer
@EriktheOutgolfer Już nie, to remis!
Fatalize
@JonathanAllan Nice. Wierzę też, że po raz pierwszy dodany szybki / prefiks był przydatny.
mile
5

Mathematica, 143 bajty

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


wkład

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

J42161217
źródło
5

Python 2 , 127 bajtów

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`

Wypróbuj online!

Odczytuje listę n n -tuples jako wejście.

Mógłbym wyprowadzić kod wyjścia, pisząc 1/(…)zamiast, print…ale wydaje mi się, że jest obleśny. Czy powinienem?

Wyjaśnienie

njest wielkością planszy; bto lista kolumn (transpozycja a). Reszta to jedno długie porównanie:

  • [n/2]*n*2==map(sum,a+b) sprawdza regułę 2. Każdy wiersz i kolumna powinna sumować się do n / 2.
  • map(sum,a+b)>len(set(a)) ma zawsze wartość true (list> int).
  • len(set(a))==len(set(b))==n sprawdza zasadę 3.
  • n<'0, 0, 0' jest zawsze prawdziwe (int <str).
  • '0, 0, 0'not in`a+b`>'1, 1, 1'not in`a+b`sprawdza regułę 1. `a+b`to ciąg znaków reprezentujący wszystkie wiersze i kolumny; dla przykładowego wejścia w TIO jest to

    "[(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)]"

    `a+b`>'1, 1, 1'W centrum zawsze jest to prawda, ponieważ ten ciąg jest gwarantowana na początek "[", który jest większy niż "1".

Lynn
źródło
Jeśli chcesz wyprowadzać kod wyjściowy, możesz to zrobić [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, który jest o 2 bajty krótszy niż dzielenie i daje NameErrorprawdziwe dane wejściowe.
ovs
3

Łuska , 27 25 bajtów

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

Dane wejściowe to lista list, a dane wyjściowe są 1dla Truei 0dlaFalse

Wypróbuj online!

Wyjaśnienie

                      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

Test 1

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

Test 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

Test 3

S=u
S=    Is the result of the following function equal two its argument
  u   Remove duplicates
H.PWiz
źródło
3

Retina , 129 89 85 bajtów

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

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

Wypróbuj online! Wyjścia 0 dla prawidłowego, 1 dla nieprawidłowego. Edycja: Zapisano 4 bajty dzięki @MartinEnder. Wyjaśnienie:

.+
$&,$&

Duplikuj każdy wiersz za pomocą ,separatorów.

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

Transponuj pierwszy duplikat.

.+
$&;$&

Powtórz ponownie, tym razem z ;separatorami.

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

Usuń wszystkie pasujące pary cyfr poprzedzające średnik.

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

Sprawdź, czy jakakolwiek kolumna lub wiersz nie spełnia żadnej z reguł; (.)\1\1sprawdza trzy identyczne cyfry z rzędu, \d,?;sprawdza niesparowaną cyfrę i (\D\d+\b).*\2sprawdza duplikat.

Neil
źródło
Jeśli celem (...).*jest tylko ostatni etap max(matches,1), możesz zapisać trzy bajty, używając 1zamiast tego w konfiguracji.
Martin Ender
I .\b\d+\bmoże być \D\d+\b.
Martin Ender
@MartinEnder Pierwotnie zastąpiłem nieprawidłowe dane wyjściowe bez danych wyjściowych i przetestowałem je na końcu ... W końcu dopracowałem je do pojedynczego testu na końcu i zdałem sobie sprawę, że mogę pominąć wiodące .*, z których wcześniej korzystałem, ale nie pomyślałem o użyciu konfiguracja ograniczająca wynik, dzięki!
Neil
3

Pyth , 31 bajtów

Wielkie dzięki dla @Leaky Nun .

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

Sprawdź wszystkie przypadki testowe lub wypróbuj tutaj!


Pyth ,  48 46 44  42 bajtów

To jest początkowe rozwiązanie.

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

Sprawdź wszystkie przypadki testowe lub wypróbuj tutaj!

& {IQ & {I.TQ.Am & q / d \ 0 / d \ 1! + / D * 3 \ 0 / d * 3 \ 1sC, .T Pełny program z niejawnym wejściem.

 {IQ Czy dane wejściowe są niezmienne przy deduplikacji?
& {I.TQ A czy transpozycja też jest niezmienna?
                                        .TQ Transpozycja.
                                           Q Wejście.
                                     sC, Zip powyższe, [^, ^^] (i spłaszcz).
    I Czy spełniony jest następujący warunek?
          .Am Wszystkie elementy są zgodne z prawdą podczas mapowania na ^^.
              q / d \ 0 / d \ 1 Jest tyle zer, co 1.
             &! + / d * 3 \ 0 / d * 3 \ 1 I nie ma serii 3 równych elementów.
Pan Xcoder
źródło
3

MATL , 27 bajtów

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

Dane wejściowe to macierz zawierająca 0i 1. Wyjście jest 0dla fałszu, 1dla prawdy.

Wypróbuj online! Lub zobacz przypadki testowe: 1 , 2 , 3 , 4 , 5 .

Wyjaśnienie

,       % 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
źródło
2

R , 114 107 bajtów

-7 dzięki Giuseppe, wywoływanie niedziałających funkcji i naprawdę kompresowanie warunków

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))

Wypróbuj online!

To po prostu stosuje reguły do ​​kolumn macierzy, a następnie do kolumn transpozycji macierzy.

Pobiera dane wejściowe w postaci:

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

Właśnie tak R przyjmuje tablice 2D.

Wyprowadza wartość PRAWDA w przypadku awarii, FALSE w przypadku podań.

Kryminalnie Wulgarne
źródło
107 bajtów
Giuseppe,
Aktualizacje ogólne: stosowane mean(y)-.5w wewnętrznej ffunkcji, aby uzyskać środki zamiast colMeans, wykonane gAnonim. To spowoduje dodanie ostrzeżenia do przekształcania doublesię logicalw zaproszeniu do anyale to jest OK.
Giuseppe,
@Giuseppe Thanks! Bardzo podoba mi się to połączone zastosowanie, bardzo sprytna zmiana! Miałem to jako 2 osobne zgłoszenia na wczesnym etapie i nie zdawałem sobie sprawy, jak czysto można je połączyć.
CriminallyVulgar
2

Perl 6 ,100 93 bajty

Skrzyżowania FTW! Oszczędzają 7 bajtów.

Na razie wydaje się, że jest to lepsze niż wszystkie inne artykuły napisane w językach innych niż golf. Yippie!

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

Wypróbuj online!

Objaśnienie : Jest to blok, który bierze tablicę jako listę list. Dokonujemy transpozycji za pomocą [Z] @^a(zmniejsz listę list za pomocą operatora zip). Więc@^a,[Z] @^a jest lista planszy i jej transpozycja. Pętlimy nad nim, dzięki forczemu działa dokładnie tak mapsamo, będąc w tym przypadku o 1 znak tańszy.

Wewnątrz najpierw łączymy listy składające się z wierszy w ciągi, więc mamy listę ciągów zamiast listy list (@(.map(*.join)) ) . Następnie używamy anonimowego bloku na nim ( .&{...}), w którym faktycznie oceniamy reguły. Ocenimy je tylko pod kątem wierszy. (Ponieważ robimy to również dla oryginalnej tablicy i transpozycji.)

Aby zaoszczędzić sporo !, używamy trochę logiki i zamiast testować (NO repeated rows) AND (NO 3 consecutive same symbols) AND (NOT different counts of 0 and 1), testujemy NOT[ (repeated rows) OR (3 consecutive same symbols) OR (different counts) ]. To właśnie robimy w bloku anonimowym: .repeateddaje wszystkie wiersze, które występują więcej niż jeden raz, następnie mapujemy rzędy, próbujemy dopasować 3 kolejne symbole za pomocą wyrażenia regularnego i odejmujemy liczby zer i jedynek. Są OR'red z |. (W rzeczywistości tworzy bardzo potężną rzecz zwaną skrzyżowaniem , ale nie używamy żadnej z jej mocy :)) Po tym wszystkim otrzymujemy listę 2 „bool” (niezakończonych skrzyżowań). W końcu my lub oni (używając max) i negujemy ( !), co daje pożądany rezultat.

Ramillies
źródło
2

J, 40 38 55 bajtów

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

Wypróbuj online!

Definiuje funkcję przyjmującą macierz kwadratową jako dane wejściowe.

Przynajmniej bije Pytha (na razie ...) (błędnie). Muszę wrócić do liczenia emoji ukrytych w moim kodzie, ponieważ J również dobrze się do tego nadaje:

[: /^: :1 |: :] :-.@ :# :@] :~@

Wyjaśnienie (nieco nieaktualne)

Wygląda to inaczej niż moja odpowiedź i mogę ją zaktualizować. Części są nadal takie same - po prostu nie sprawdzałem reguły 3 i nie sprawdzałem wcześniej reguły 2.

Podzielony na kilka funkcji i bez golfa:

join_trans  =. |: ,: ]
part_3      =. 3 (0 = 3 | +/)\"1 ]
f           =. 1 - 2 * ]
main        =. 0 = [: ([: +/^:_ part_3 , f) join_trans

Join_trans

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

To łączy transpozycję macierzy do siebie, tworząc tablicę macierzy.

część_3

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

Sprawdza to sumę partycji z 3 rzędów, aby zobaczyć, czy jest to 3 lub 0 (ponieważ jedna z tych oznacza nieprawidłową tablicę), zwracając 1, jeśli jest, i 0 w przeciwnym razie. Działa zarówno na macierzy, jak i na jej transpozycji, ponieważ ma obie te funkcje.

fa

1 - 2 * ]

Z braku lepszego imienia nazywam to f. Zamienia cyfry 0 na _1 i pozostawia cyfry 1 bez zmian. Ma to pozwolić mi ostatecznie sprawdzić, czy liczba zer i jedynek jest równa w każdym wierszu i kolumnie (suma każdego wiersza powinna wynosić 0).

Główny

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

Zasadniczo wykorzystać fakt, że mam skonfigurować go tak, że f join_transi part_3 join_transoba powinny suma 0 wtw płyta jest ważna. part_3powinny zawierać wszystkie zera dla prawidłowej planszy, a całość fpowinna sumować się do zera dla prawidłowej planszy, co oznacza, że ​​suma ich sum wynosi 0 tylko dla prawidłowej planszy.

kapusta
źródło
Przynajmniej bije Pytha (na razie ...). - Naprawdę muszę
pograć w
@ Mr.Xcoder haha ​​tak, zawsze wydaje się, że się przeciągasz, dlatego dodałem bit „na razie”. Nie, że moja odpowiedź nie ma miejsca na grę w golfa - po prostu nie wiem, jak to zrobić zbyt dobrze.
cole
1
Ten kod dla 33 bajtów powinien być równoważny z twoim*/@,@,&(~:,(0~:3|3+/\]),#=2*+/)|:
milami
2

Haskell , 137 136 127 bajtów

9 bajtów zapisanych dzięki 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)

Wypróbuj online!

Kreator pszenicy
źródło
Rzuć oba alls w jedno 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 Thanks! Przez jakiś czas próbowałem zrolować te dwa. Nie wiem, dlaczego nie mogłem tego rozgryźć.
Wheat Wizard
1
Czy możesz zmienić j=isSubSequenceOfna j x=isSubSequenceOf[x,x,x]?
Cyoce,
@Cyoce Wydaje się, że straciłem bajt. Jeśli masz sposób na zrobienie tego, co oszczędza mi bajt, chętnie go wdrożę. Pomysł wydaje się dobry.
Wheat Wizard
Na telefonie komórkowym, hmmm ... Może zamiast j a bwywoływać (i definiować) jako a#b?
Cyoce,
2

Java 8, 350 326 325 312 303 299 298 259 255 bajtów

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];}

Zwroty 0 gdy jest to ważna tablica; 1jeśli jest nieważny dla jednej lub więcej z trzech zasad.

-95 bajtów dzięki @Nevay .

Wyjaśnienie:

Wypróbuj tutaj.

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
źródło
1

Python 3, 187 bajtów

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)

Wypróbuj online!

Pobiera dane wejściowe jako listę linii.

LyricLy
źródło
187 bajtów
Mr. Xcoder,
171 bajtów
Mr. Xcoder,
147 bajtów , na podstawie sugestii @ Mr.Xcoder.
ovs
1

05AB1E , 29 bajtów

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

Wypróbuj online!

Wyjaśnienie

Reguła: 3

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

Reguła: 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

Zasada nr 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

Następnie bierzemy iloczyn wyniku wszystkich 3 reguł z P

Emigna
źródło
1

Dyalog APL, 64 52 51 49 48 bajtów

Wymaga ⎕IO←0

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

Wypróbuj online!

Zacharý
źródło
1

PHP, 245 + 1 bajtów

ew to jest nieporęczne. podziały wierszy służą wyłącznie do czytania:

$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;

Zajmuje pojedynczy ciąg bez znaków nowej linii, drukuje 1 dla prawdy, nic dla fałszu.

Uruchom jako potok z -nRlub spróbuj online .

Tytus
źródło