Takuzu to gra logiczna, w której musisz wypełnić siatkę komórkami zawierającymi 0
s i 1
s. Siatka musi spełniać 3 zasady:
- Żadne trzy kolejne poziome lub pionowe komórki nie mogą być takie same.
- W każdym rzędzie i kolumnie musi znajdować się taka sama liczba
0
si1
. - Ż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
, 2
i 3
. Nie ma trzech poziomych lub pionowych komórek, które są takie same, wszystkie wiersze i kolumny zawierają taką samą liczbę 0
si 1
si, 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 5
ma trzy 0
s z rzędu, a kolumna 2
ma trzy 1
s z rzędu, a następnie trzy 0
s. Dlatego nie jest to poprawna siatka.
Zadanie:
Twoim zadaniem jest, aby program, który, biorąc pod uwagę tablicę 2D n
* n
0
s i 1
s 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 1
nie 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
, gdzien
dodatnia 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
0
i1
lub 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 golf golfowy , więc wygrywa najkrótszy kod w bajtach!
źródło
Odpowiedzi:
Brachylog ,
2018 bajtówWypróbuj online!
Wyjaśnienie
źródło
false
w tym przypadku wynikać ?Łuska ,
1918 bajtówWypró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
źródło
)
Galaretka , 17 bajtów
Wypróbuj online!
-6 bajtów dzięki milom i Jonathanowi Allanowi .
źródło
µZ$⁺
jeszcze raz: p ... i 17 bajtów, zmieniając trochę: D teraz pokonałem Brachylog heheMathematica, 143 bajty
wkład
źródło
Python 2 , 127 bajtów
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
n
jest wielkością planszy;b
to lista kolumn (transpozycjaa
). 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`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"
.źródło
[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 dajeNameError
prawdziwe dane wejściowe.Łuska ,
2725 bajtówDane wejściowe to lista list, a dane wyjściowe są
1
dlaTrue
i0
dlaFalse
Wypróbuj online!
Wyjaśnienie
Test 1
Test 2
Test 3
źródło
Retina ,
1298985 bajtówWypró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.Transponuj pierwszy duplikat.
Powtórz ponownie, tym razem z
;
separatorami.Usuń wszystkie pasujące pary cyfr poprzedzające średnik.
Sprawdź, czy jakakolwiek kolumna lub wiersz nie spełnia żadnej z reguł;
(.)\1\1
sprawdza trzy identyczne cyfry z rzędu,\d,?;
sprawdza niesparowaną cyfrę i(\D\d+\b).*\2
sprawdza duplikat.źródło
(...).*
jest tylko ostatni etapmax(matches,1)
, możesz zapisać trzy bajty, używając1
zamiast tego w konfiguracji..\b\d+\b
może być\D\d+\b
..*
, z których wcześniej korzystałem, ale nie pomyślałem o użyciu konfiguracja ograniczająca wynik, dzięki!Pyth , 31 bajtów
Wielkie dzięki dla @Leaky Nun .
Sprawdź wszystkie przypadki testowe lub wypróbuj tutaj!
Pyth ,
48 46 4442 bajtówTo jest początkowe rozwiązanie.
Sprawdź wszystkie przypadki testowe lub wypróbuj tutaj!
źródło
MATL , 27 bajtów
Dane wejściowe to macierz zawierająca
0
i1
. Wyjście jest0
dla fałszu,1
dla prawdy.Wypróbuj online! Lub zobacz przypadki testowe: 1 , 2 , 3 , 4 , 5 .
Wyjaśnienie
źródło
R ,
114107 bajtów-7 dzięki Giuseppe, wywoływanie niedziałających funkcji i naprawdę kompresowanie warunków
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:
Właśnie tak R przyjmuje tablice 2D.
Wyprowadza wartość PRAWDA w przypadku awarii, FALSE w przypadku podań.
źródło
mean(y)-.5
w wewnętrznejf
funkcji, aby uzyskać środki zamiastcolMeans
, wykonaneg
Anonim. To spowoduje dodanie ostrzeżenia do przekształcaniadouble
sięlogical
w zaproszeniu doany
ale to jest OK.Perl 6 ,
10093 bajtySkrzyż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!
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ękifor
czemu działa dokładnie takmap
samo, 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)
, testujemyNOT[ (repeated rows) OR (3 consecutive same symbols) OR (different counts) ]
. To właśnie robimy w bloku anonimowym:.repeated
daje 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ącmax
) i negujemy (!
), co daje pożądany rezultat.źródło
J,
403855 bajtówWypró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
To łączy transpozycję macierzy do siebie, tworząc tablicę macierzy.
część_3
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
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
Zasadniczo wykorzystać fakt, że mam skonfigurować go tak, że
f join_trans
ipart_3 join_trans
oba powinny suma 0 wtw płyta jest ważna.part_3
powinny zawierać wszystkie zera dla prawidłowej planszy, a całośćf
powinna sumować się do zera dla prawidłowej planszy, co oznacza, że suma ich sum wynosi 0 tylko dla prawidłowej planszy.źródło
*/@,@,&(~:,(0~:3|3+/\]),#=2*+/)|:
Haskell ,
137136127 bajtów9 bajtów zapisanych dzięki Lynn!
Wypróbuj online!
źródło
all
s w jednoand
: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
naj x=isSubSequenceOf[x,x,x]
?j a b
wywoływać (i definiować) jakoa#b
?Java 8,
350326325312303299298259255 bajtówZwroty
0
gdy jest to ważna tablica;1
jeśli jest nieważny dla jednej lub więcej z trzech zasad.-95 bajtów dzięki @Nevay .
Wyjaśnienie:
Wypróbuj tutaj.
źródło
Python 3, 187 bajtów
Wypróbuj online!
Pobiera dane wejściowe jako listę linii.
źródło
05AB1E , 29 bajtów
Wypróbuj online!
Wyjaśnienie
Reguła: 3
Reguła: 2
Zasada nr 1
Następnie bierzemy iloczyn wyniku wszystkich 3 reguł z
P
źródło
Dyalog APL,
6452514948 bajtówWymaga
⎕IO←0
Wypróbuj online!
źródło
PHP, 245 + 1 bajtów
ew to jest nieporęczne. podziały wierszy służą wyłącznie do czytania:
Zajmuje pojedynczy ciąg bez znaków nowej linii, drukuje
1
dla prawdy, nic dla fałszu.Uruchom jako potok z
-nR
lub spróbuj online .źródło