Einführung
Es gibt ein kleines Dorf mit nur ein paar Häusern und leeren Feldern. Die örtlichen Bürokraten wollen das Dorf in Grundstücke aufteilen, so dass jedes Grundstück genau ein Haus enthält und die Grundstücksgrenzen ein schönes, geradliniges Raster bilden. Ihre Aufgabe ist es festzustellen, ob dies möglich ist.
Die Aufgabe
Ihre Eingabe ist ein rechteckiges 2D-Array von Bits. 1 steht für ein Haus und 0 für ein leeres Feld. Ihre Größe beträgt mindestens 1 × 1 und sie enthält mindestens eine 1. Sie können die Eingabe in jedem vernünftigen Format vornehmen (verschachtelte Liste von Ganzzahlen, Liste von Zeichenfolgen, mehrzeilige Zeichenfolge usw.).
Ihr Programm muss bestimmen, ob das Array mithilfe von geraden horizontalen und vertikalen Linien in Gitterzellen unterteilt werden kann, sodass jede Gitterzelle genau eine 1 enthält. Die Gitterzellen können unterschiedliche Größen und Formen haben, obwohl sie immer rechteckig sind. Die Linien müssen von einer Kante des Arrays zur gegenüberliegenden Kante verlaufen.
Das Folgende ist beispielsweise eine gültige Aufteilung eines Arrays:
00|0010|01|1
01|0000|00|0
--+----+--+-
00|0000|00|1
01|0010|01|0
--+----+--+-
01|1000|10|1
Die folgende Unterteilung ist ungültig, da es Gitterzellen mit keiner 1 oder mehr als einer 1 gibt:
00|0010|01|1
--+----+--+-
01|0000|00|0
00|0000|00|1
01|0010|01|0
--+----+--+-
00|1000|10|1
Wenn eine gültige Unterteilung vorliegt, geben Sie einen Wahrheitswert und ansonsten einen falschen Wert aus.
Regeln und Wertung
Sie können ein vollständiges Programm oder eine Funktion schreiben. Die niedrigste Byteanzahl gewinnt.
Testfälle
[[1]] -> True
[[0,1],[1,0]] -> True
[[1,1],[1,0]] -> False
[[1,0,1],[0,1,0]] -> True
[[1,0],[0,1],[0,1]] -> True
[[1,0,0],[0,0,1],[0,1,1]] -> True
[[1,1,1],[1,1,1],[1,1,1]] -> True
[[1,0,1],[0,1,0],[1,0,0]] -> True
[[1,0,0],[1,0,0],[0,1,1]] -> False
[[0,0,0,0,1],[1,0,0,1,0],[0,0,0,1,0]] -> False
[[0,0,1,0,1],[0,0,0,1,0],[0,0,0,0,0]] -> True
[[1,1,0,0,0],[0,0,0,0,0],[1,0,1,0,0]] -> True
[[1,1,0,1,1],[0,1,0,1,1],[1,0,0,0,0]] -> True
[[0,0,0,0,0,0,0],[0,1,1,1,0,1,0],[0,1,0,0,1,0,0],[0,0,0,0,0,0,1],[0,0,1,0,0,0,1],[1,1,0,1,1,0,0]] -> False
[[1,1,0,0,0,0,0],[1,0,1,1,0,1,0],[0,0,0,0,1,0,0],[0,1,0,1,1,0,0],[1,0,0,0,1,1,0],[0,0,0,0,0,1,0]] -> False
[[0,1,0,1,1,1,0],[0,0,0,0,1,0,0],[0,0,0,0,0,0,0],[1,0,0,1,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,1]] -> True
[[0,1,0,0,1,0,1],[1,0,0,0,1,0,1],[0,0,1,0,1,0,1],[1,0,0,0,1,1,0],[0,0,0,1,1,1,0],[0,1,0,0,1,0,1]] -> True
[[0,1,0,0,1,0,0,1,0],[0,0,0,0,1,1,0,1,0],[1,1,0,0,1,0,0,0,0],[0,0,1,0,1,0,1,0,0],[0,0,1,0,1,0,1,0,0],[0,1,0,0,0,1,0,0,1],[0,1,0,0,0,0,1,0,0]] -> False
[[1,0,1,0,0,1,1,0,1],[0,1,1,0,0,1,1,0,1],[1,0,0,0,0,1,0,0,0],[0,0,0,0,0,0,0,0,0],[0,0,1,0,0,0,0,1,1],[0,1,1,0,1,0,1,0,1],[1,0,1,0,0,1,1,0,1]] -> True
[[1, 0, 1], [0, 1, 0], [1, 0, 0]]
Das war die einzige 3x3-Matrix, bei der mein neuer Ansatz versagte.