Diese Herausforderung basiert auf dem Spiel Layerz.
Gegeben, auf stdin oder als Funktionsargument, ein rechteckiges 2D-Array von Zellen, wobei jede Zelle entweder ein Leerzeichen (Sie können 0 anstelle von Leerzeichen ohne Strafe verwenden), eine 1, eine 2, eine 3 oder eine 4 enthält ; Finden Sie eine Möglichkeit, es in gültige Regionen (wie unten definiert) zu unterteilen, sodass jede nicht leere Zelle in genau einer Region enthalten ist. Geben Sie dann die gefundene Lösung in einem angemessenen Format aus. Wenn es keine Lösung gibt, stoppen Sie entweder, ohne eine Ausgabe zu erzeugen, oder geben Sie einen einzelnen Falsey-Wert aus, und stoppen Sie dann.
Jedes der folgenden Elemente stellt eine gültige Region dar:
- Eine einzelne Zelle mit einer 1
- Eine Zelle mit einer 2 und genau einem ihrer nicht leeren orthogonalen Nachbarn
- Eine Zelle mit einer 3 und genau zwei nicht leeren orthogonalen Nachbarn
- Eine Zelle, die 4 und genau drei ihrer nicht leeren orthogonalen Nachbarn enthält
Dies ist Codegolf , daher gewinnt die kürzeste gültige Antwort in Bytes.
Einige Testfälle:
1. Eine eher triviale:
Und das ist die Lösung, mit jeder Region in einer anderen Farbe:
2. Interessanter
Dieser hat mehr als eine Lösung, aber hier ist eine davon:
3. Ein kleineres, das Leerzeichen enthält und keine Lösung hat (je nachdem, ob Sie eines der beiden verwenden, um die drei zu "erfassen", oder die drei, um zwei der beiden zu nehmen, bleibt entweder ein Paar nicht benachbarter (und daher nicht gruppierbarer) Zweien oder eine einzelne Zwei für sich):
Da dieses Raster keine Lösungen enthält, sollte Ihr Programm angehalten werden, ohne dass eine Ausgabe erfolgt, wenn dieses Raster angegeben wird.
4. Diese (wobei die obersten 2 um eine Zelle nach links verschoben sind) hat jedoch eine Lösung:
Lösung:
(Die untere rechte 2 wird verwendet, um die 3 "einzufangen")
5. Weil wir einen Testfall mit ein paar Vieren brauchten:
Eine Lösung:
quelle
4
s abdecken, wenn diese gültige Eingaben sind.Antworten:
Ich weiß, dass diese Herausforderung über ein Jahr alt ist, aber ich fand sie einfach "unbeantwortet" und sah für mich ziemlich interessant aus.
Angenommen, die Nummer der "Root" -Zelle ist die einzige signifikante in jeder Region (aus den Beispielen ableitbar), dann ist hier meine Backtracking-Lösung:
Python 3 ,
355351349 BytesProbieren Sie es online!
Das Eingabeformat ist eine 2D-Liste von Ganzzahlen, Leerzeichen als Null, und das Ausgabeformat ist auch eine 2D-Liste von Ganzzahlen, die eine Region pro Zahl darstellen. Die Regionsnummer beginnt bei eins. Null ist für leere Zellen reserviert (wie bei der Eingabe). Wenn die angegebene Eingabe nicht lösbar ist, gibt die Funktion eine einzelne Null zurück (falscher Wert).
Beispielsweise wird der Testfall 5 als eingegeben
und die Ausgabe ist
Ungolfed, mit Kommentaren:
Probieren Sie es online!
Hinweis: Dies ist ein Sonderfall der Set-Packung, die bekanntermaßen NP-vollständig ist. Dieses spezielle Problem hat eine begrenzte Satzgröße (max. 4) und es gibt Approximationsalgorithmen, um eine "gute" Satzpackung in Polynomzeit zu finden, aber sie garantieren nicht die maximal mögliche Satzpackung (die in diesem Problem unbedingt erforderlich ist).
quelle