Takuzu ist ein Logikspiel, in dem Sie ein Gitter mit Zellen vervollständigen müssen, die 0
s und 1
s enthalten. Das Gitter muss 3 Regeln folgen:
- Keine drei horizontalen oder vertikalen aufeinanderfolgenden Zellen können gleich sein.
- Es muss eine gleiche Anzahl von
0
s und sein1
s in jeder Zeile und Spalte geben. - Keine zwei Zeilen können gleich sein und keine zwei Spalten können gleich sein.
Schauen wir uns ein fertiges Gitter an:
0011
1100
0101
1010
Wie Sie sehen können, folgt das Board Regel 1
, 2
und 3
. Es gibt keine drei horizontalen oder vertikalen Zellen, die gleich sind, alle Zeilen und Spalten enthalten die gleiche Anzahl von 0
s und 1
s, und keine zwei Zeilen und keine zwei Spalten sind gleich.
Schauen wir uns ein Gitter an, das nicht gültig ist:
110100
010011
011010
101100
100011
001101
Es gibt eine Reihe von Problemen mit diesem Raster. Beispielsweise 5
hat 0
eine Zeile drei Sekunden in einer Zeile und eine Spalte 2
drei 1
Sekunden in einer Zeile, gefolgt von drei 0
Sekunden. Daher ist dies kein gültiges Raster.
Aufgabe:
Ihre Aufgabe ist es, ein Programm zu erstellen, das bei einem 2D-Array von n
* n
0
s und1
erstellen s die Karte überprüft, um festzustellen, ob es sich um eine gültige, fertige Takuzu-Karte handelt.
Beispiele:
0011
1100
0101
1010
Dieses Board folgt allen Regeln und ist daher ein gültiges Takuzu-Board. Sie müssen einen wahrheitsgemäßen Wert dafür zurückgeben.
11
00
Dies ist keine gültige Tafel - die Reihe 1
folgt nicht der Regel2
. Sie müssen dafür einen falschen Wert zurückgeben.
100110
101001
010101
100110
011010
011001
Dies ist kein gültiges Board, es schlägt (nur) aufgrund von Regel 3 fehl - die erste und vierte Reihe sind gleich.
110100
001011
010011
101100
100110
011001
Dies ist kein gültiges Board, es schlägt (nur) aufgrund von Regel 3 fehl - die erste und vierte Spalte sind gleich.
011010
010101
101100
010011
100110
101001
Dies ist eine gültige Karte.
Regeln und Spezifikationen:
- Sie können davon ausgehen, dass alle Bretter quadratische Abmessungen haben
n * n
habenn
es sich um eine positive gerade Ganzzahl handelt. - Sie können davon ausgehen, dass alle Bretter fertig sind.
- Sie können Eingaben als 2D-Array mit Werten für
0
und vornehmen1
oder als Zeichenfolge vornehmen. - Sie müssen für Truthy- und Falsey-Boards konsistente Truthy- und Falsey-Werte ausgeben. Die Werte für "Truthy" und "Falsey" dürfen nicht identisch sein.
Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes!
quelle
Antworten:
Brachylog ,
20 bis18 BytesProbieren Sie es online!
Erläuterung
quelle
false
für diese ?Schale ,
1918 BytesProbieren Sie es online!
1 Byte gespart dank H.PWiz!
Die Hauptidee besteht darin, eine Reihe von Transformationen auf die Eingabe anzuwenden, die Identitäten für eine gültige Karte sind, und zu prüfen, ob das Endergebnis mit der ursprünglichen Eingabe übereinstimmt.
Erläuterung
quelle
)
Gelee , 17 Bytes
Probieren Sie es online!
-6 Bytes dank Meilen und Jonathan Allan .
quelle
µZ$⁺
Ding schon wieder gemacht: p ... und 17 Bytes durch ein bisschen tauschen: D Jetzt habe ich Brachylog Hehe besiegtMathematica, 143 Bytes
Eingang
quelle
Python 2 , 127 Bytes
Probieren Sie es online!
Liest eine Liste von n n -Tupeln als Eingabe.
Ich konnte Ausgabe von Exit - Code durch das Schreiben
1/(…)
statt ,print…
aber es fühlt sich scummy. Sollte ich?Erläuterung
n
ist die Größe der Tafel;b
ist eine Liste von Spalten (transponiert vona
). Der Rest ist ein langkettiger Vergleich:[n/2]*n*2==map(sum,a+b)
prüft Regel 2. Jede Zeile und Spalte sollte n / 2 ergeben.map(sum,a+b)>len(set(a))
ist immer wahr (liste> int).len(set(a))==len(set(b))==n
prüft Regel 3.n<'0, 0, 0'
ist immer wahr (int <str).'0, 0, 0'not in`a+b`>'1, 1, 1'not in`a+b`
prüft Regel 1.`a+b`
ist die Zeichenfolgendarstellung aller Zeilen und Spalten; für den Beispieleingang auf TIO ist esDas
`a+b`>'1, 1, 1'
in der Mitte ist immer wahr, da diese Zeichenfolge garantiert beginnt"["
und größer als ist"1"
.quelle
[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
ist 2 Byte kürzer als die Division und führt zu einerNameError
für wahrheitsgemäße Eingaben.Schale ,
2725 BytesInput ist eine Liste von Listen und Output ist
1
fürTrue
und0
fürFalse
Probieren Sie es online!
Erklärung
Test 1
Test 2
Test 3
quelle
Retina ,
1298985 BytesProbieren Sie es online! Gibt 0 für gültig und 1 für ungültig aus. Bearbeiten: 4 Bytes dank @MartinEnder gespeichert. Erläuterung:
Duplizieren Sie jede Zeile mit
,
Trennzeichen.Transponiere das erste Duplikat.
Duplizieren Sie erneut, diesmal mit
;
Trennzeichen.Löschen Sie alle übereinstimmenden Ziffernpaare, die einem Semikolon vorangehen.
Überprüfen Sie, ob eine Spalte oder Zeile eine der Regeln nicht erfüllt.
(.)\1\1
sucht nach drei identischen Ziffern in einer Reihe,\d,?;
sucht nach einer ungepaarten Ziffer und(\D\d+\b).*\2
sucht nach einem Duplikat.quelle
(...).*
in der letzten Phase nur darin bestehtmax(matches,1)
, drei Bytes zu speichern, können Sie1
stattdessen a in der Konfiguration verwenden..\b\d+\b
kann sein\D\d+\b
..*
ich zuvor verwendet hatte, weglassen konnte , aber nicht daran dachte, sie zu verwenden eine Konfiguration, um das Ergebnis zu begrenzen, danke!Pyth , 31 Bytes
Vielen Dank an @Leaky Nun .
Überprüfen Sie alle Testfälle oder versuchen Sie es hier!
Pyth ,
48 46 4442 BytesDies ist die erste Lösung.
Überprüfen Sie alle Testfälle oder versuchen Sie es hier!
quelle
MATL , 27 Bytes
Die Eingabe ist eine Matrix, die
0
und enthält1
. Ausgabe ist0
für falsch,1
für wahr.Probieren Sie es online! Oder siehe Testfälle: 1 , 2 , 3 , 4 , 5 .
Erläuterung
quelle
R ,
114107 Bytes-7 Dank an Giuseppe, der Funktionen nicht ordnungsgemäß aufruft und die Bedingungen wirklich komprimiert
Probieren Sie es online!
Dies wendet nur die Regeln auf die Spalten der Matrix an, dann auf die Spalten der Transponierten der Matrix.
Nimmt Eingaben in der Form:
Genau so nimmt R 2D-Arrays auf.
Gibt bei Fehlern TRUE und bei Durchläufen FALSE aus.
quelle
mean(y)-.5
in der internenf
Funktion , um die Mittel zu bekommen , stattcolMeans
und machteg
anonym. Es werden Warnungen für die Konvertierungdouble
inlogical
im Aufruf hinzugefügt ,any
aber das ist OK.Perl 6 ,
10093 BytesAbzweigungen FTW! Sie sparen 7 Bytes.
Derzeit scheint dies allen anderen Einsendungen zu trotzen, die in nicht-golferischen Sprachen verfasst wurden. Yippie!
Probieren Sie es online!
Erläuterung : Es ist ein Block, der die Karte als Liste von Listen aufnimmt. Wir machen eine Transponierung mit
[Z] @^a
(Liste der Listen mit zip-Operator verkleinern). So@^a,[Z] @^a
ist eine Liste des Boards und seiner Transponierung. Wir überfliegen es mitfor
dem genau so funktioniertmap
in diesem Fall ist es nur 1 Zeichen billiger.Im Inneren verbinden wir zuerst die Listen, die Zeilen bilden, zu Strings, sodass wir eine Liste von Strings anstelle von list of lists (
@(.map(*.join))
) haben. Dann verwenden wir einen anonymen Block (.&{...}
), in dem wir die Regeln tatsächlich auswerten. Wir werden sie nur zeilenweise auswerten. (Da wir es auch für das ursprüngliche Array und die Transponierung tun.)So speichern Sie ganz ein paar
!
‚s, verwenden wir ein bisschen Logik und statt Tests(NO repeated rows) AND (NO 3 consecutive same symbols) AND (NOT different counts of 0 and 1)
, wir testenNOT[ (repeated rows) OR (3 consecutive same symbols) OR (different counts) ]
. Das machen wir im anonymen Block:.repeated
Gibt alle Zeilen an, die mehr als einmal vorkommen, dann ordnen wir die Zeilen zu, versuchen, 3 aufeinanderfolgende Symbole mit einem regulären Ausdruck abzugleichen, und subtrahieren die Zählungen von Nullen und Einsen. Diese sind OR'rot mit dem|
. (Tatsächlich erzeugt es eine sehr mächtige Sache, die als Junction bezeichnet wird , aber wir verwenden keine ihrer Kräfte :)) Nach alledem erhalten wir eine Liste von 2 "Bools" (nicht zusammengefassten Junctions). Wir schließlich oder sie (mitmax
) und negieren (!
), was das gewünschte Ergebnis gibt.quelle
J,
403855 BytesProbieren Sie es online!
Definiert eine Funktion, die eine quadratische Matrix als Eingabe verwendet.
Zumindest schlägt es Pyth (fürs Erste ...)(fälschlicherweise). Ich sollte zurückgehen, um das in meinem Code verborgene Emoji zu zählen, da sich J auch gut dafür eignet:[:
/^:
:1
|:
:]
:-.@
:#
:@]
:~@
Erklärung (etwas veraltet)
Dies sieht anders aus als meine Antwort, und ich werde sie möglicherweise aktualisieren. Teile davon sind immer noch die gleichen - ich habe nur nicht nach Regel 3 und nicht richtig nach Regel 2 gesucht.
Aufgeteilt in einige Funktionen und ungolfed:
join_trans
Dies verbindet die Transponierung der Matrix mit sich selbst und erzeugt ein Array von Matrizen.
part_3
Dies überprüft die Summe der Partitionen von 3 zeilenweise, um festzustellen, ob sie 3 oder 0 ist (da eine dieser beiden Angaben eine ungültige Karte bedeutet), und gibt 1 zurück, wenn dies der Fall ist, und 0, wenn dies nicht der Fall ist. Es funktioniert sowohl auf der Matrix als auch auf der Transponierten, da beide angegeben sind.
f
Aus Mangel an einem besseren Namen nenne ich das
f
. Es ersetzt die 0en durch _1 und lässt die 1en unverändert. Damit kann ich eventuell überprüfen, ob die Anzahl der Nullen und Einsen in jeder Zeile und Spalte gleich ist (die Summe jeder Zeile sollte 0 sein).Main
Grundsätzlich nutze ich die Tatsache, dass ich es so eingerichtet habe, dass
f join_trans
undpart_3 join_trans
beide auf 0 summieren sollten, wenn das Board gültig ist.part_3
sollten für eine gültige Karte alle Nullen sein und die Summe vonf
sollte für eine gültige Karte Null ergeben, was bedeutet, dass die Summe ihrer Summen nur für eine gültige Karte 0 ist.quelle
*/@,@,&(~:,(0~:3|3+/\]),#=2*+/)|:
Haskell ,
137136127 Bytes9 Bytes gespart dank Lynn!
Probieren Sie es online!
quelle
all
s in einsand
: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
zuj x=isSubSequenceOf[x,x,x]
?j a b
aufzurufen (und zu definieren) alsa#b
?Java 8,
350326325312303299298259255 BytesGibt zurück,
0
wenn es sich um ein gültiges Board handelt.1
wenn es für eine oder mehrere der drei Regeln ungültig ist.-95 Bytes dank @Nevay .
Erläuterung:
Probieren Sie es hier aus.
quelle
Python 3, 187 Bytes
Probieren Sie es online!
Nimmt die Eingabe als eine Liste von Zeilen.
quelle
05AB1E , 29 Bytes
Probieren Sie es online!
Erläuterung
Regel: 3
Regel: 2
Regel 1
Dann nehmen wir das Produkt des Ergebnisses aller 3 Regeln mit
P
quelle
Dyalog APL,
6452514948 BytesBenötigt
⎕IO←0
Probieren Sie es online!
quelle
PHP, 245 + 1 Bytes
ew das ist sperrig. Zeilenumbrüche dienen nur der besseren Lesbarkeit:
Nimmt eine einzelne Zeichenfolge ohne Zeilenumbrüche, druckt
1
für die Wahrheit, nichts für die Falschheit.Laufen Sie als Pipe mit
-nR
oder versuchen Sie es online .quelle