Eingang
Ihre Eingabe in dieser Herausforderung ist eine Liste von ganzzahligen Paaren. Sie repräsentieren die südwestlichen Ecken der Einheitsquadrate in der Ebene und die Liste repräsentiert ihre Vereinigung als Teilmenge der Ebene. Zum Beispiel die Liste
[(0,0),(1,0),(0,1),(1,1),(2,1),(1,2),(2,2)]
stellt den roten Satz in diesem Bild dar:
Ausgabe
Ihre Ausgabe ist eine Liste von ganzzahligen Vierfachen, die rechteckige Teilmengen der Ebene darstellen. Genauer (x,y,w,h)
gesagt , ein Vierfacher entspricht einem Rechteck mit Breite w > 0
und Höhe, h > 0
dessen südwestliche Ecke sich in befindet (x,y)
. Die Rechtecke müssen eine exakte Abdeckung des Eingabebereichs bilden, in dem Sinne, dass jedes der Einheitsquadrate eine Teilmenge eines Rechtecks ist, jedes Rechteck eine Teilmenge des Bereichs ist und zwei Rechtecke nur an ihren Rändern überlappen dürfen. Um triviale Lösungen zu verbieten, darf die Abdeckung keine zwei Rechtecke enthalten, die zu einem größeren Rechteck zusammengefügt werden könnten.
Zum Beispiel die Liste
[(0,0,2,1),(0,1,3,1),(1,2,2,1)]
vertritt die rechtliche Abdeckung
der oben genannten Region, während die Bedeckung gegeben durch
[(0,0,2,2),(2,1,1,1),(1,2,1,1),(2,2,1,1)]
ist illegal, da die benachbarten 1-zu-1-Quadrate zusammengeführt werden könnten:
Regeln
Sie können ein vollständiges Programm oder eine Funktion angeben. Die genaue Formatierung der Ein- und Ausgabe ist aus vernünftigen Gründen nicht wichtig. Die kürzeste Byteanzahl gewinnt, und Standardlücken sind nicht zulässig. Sie werden aufgefordert, eine Erläuterung Ihres Algorithmus und einige Beispielausgaben anzugeben.
Testfälle
Eine U-förmige Region:
[(0,0),(0,1),(0,2),(0,3),(0,4),(0,5),(1,0),(1,1),(1,2),(1,3),(1,4),(1,5),(2,0),(2,1),(3,0),(3,1),(4,0),(4,1),(4,2),(4,3),(4,4),(4,5),(5,0),(5,1),(5,2),(5,3),(5,4),(5,5)]
Ein großes Dreieck:
[(0,0),(0,1),(0,2),(0,3),(0,4),(0,5),(0,6),(0,7),(0,8),(0,9),(1,0),(1,1),(1,2),(1,3),(1,4),(1,5),(1,6),(1,7),(1,8),(2,0),(2,1),(2,2),(2,3),(2,4),(2,5),(2,6),(2,7),(3,0),(3,1),(3,2),(3,3),(3,4),(3,5),(3,6),(4,0),(4,1),(4,2),(4,3),(4,4),(4,5),(5,0),(5,1),(5,2),(5,3),(5,4),(6,0),(6,1),(6,2),(6,3),(7,0),(7,1),(7,2),(8,0),(8,1),(9,0)]
Ein Quadrat mit Löchern:
[(0,0),(0,1),(0,2),(0,3),(0,4),(0,5),(0,6),(0,7),(0,8),(1,0),(1,1),(1,2),(1,3),(1,4),(1,5),(1,6),(1,7),(1,8),(1,9),(2,0),(2,1),(2,2),(2,3),(2,4),(2,5),(2,6),(2,7),(2,8),(2,9),(3,0),(3,1),(3,2),(3,4),(3,5),(3,6),(3,7),(3,8),(3,9),(4,0),(4,1),(4,2),(4,3),(4,4),(4,5),(4,6),(4,7),(4,8),(4,9),(5,0),(5,1),(5,2),(5,3),(5,4),(5,5),(5,7),(5,8),(5,9),(6,1),(6,2),(6,3),(6,5),(6,6),(6,7),(6,8),(6,9),(7,0),(7,1),(7,2),(7,3),(7,4),(7,5),(7,6),(7,7),(7,8),(7,9),(8,0),(8,1),(8,2),(8,3),(8,4),(8,5),(8,6),(8,7),(8,8),(8,9),(9,0),(9,1),(9,2),(9,3),(9,4),(9,5),(9,6),(9,7),(9,8),(9,9)]
Nicht verbundene Regionen:
[(0,0),(0,1),(0,2),(0,3),(0,4),(0,5),(0,6),(0,7),(0,8),(1,0),(1,1),(1,2),(1,3),(1,4),(1,6),(1,7),(1,8),(1,9),(2,1),(2,2),(2,3),(2,4),(2,5),(2,6),(2,7),(2,8),(2,9),(4,0),(4,1),(4,2),(4,4),(4,5),(4,6),(4,7),(4,8),(4,9),(5,0),(5,1),(5,2),(5,3),(5,4),(5,5),(5,6),(5,7),(5,8),(5,9),(6,0),(6,1),(6,2),(6,4),(6,5),(6,6),(6,7),(6,8),(6,9),(8,0),(8,1),(8,2),(8,3),(8,4),(8,5),(8,6),(8,7),(8,8),(8,9),(9,0),(9,1),(9,2),(9,3),(9,7),(9,8),(9,9),(10,0),(10,1),(10,2),(10,3),(10,4),(10,5),(10,6),(10,7),(10,8),(10,9)]
Verifizierer
Verwenden Sie dieses Python 2-Programm, um Ihre Lösung zu überprüfen. Es wird von STDIN eine Liste von Tupeln (die Eingabe) und eine Liste von Vierfachen (Ihre Ausgabe) durch Komma getrennt.
Ich habe auch dieses Python 2-Programm geschrieben, um die Bilder zu generieren, und Sie können es auch verwenden. Es nimmt von STDIN eine Liste von entweder Tupeln oder Vierfachen und erzeugt eine Datei mit dem Namen out.png
. Es erfordert die PIL-Bibliothek. Sie können bei Bedarf auch die Größe der Gitterzellen und die Breite der Gürtellinien ändern.
3-h
um~h
?Python -
272261258251224Ich denke, ich kann das mehr Golf spielen.
Ich bin mir ziemlich sicher, dass dies funktioniert, aber ich habe noch nicht alle Testfälle getestet.Ich habe es ausprobiert. Es funktioniert für alle Testfälle.Ich arbeite daran, Bilder der Ergebnisse hinzuzufügen.Bearbeiten: Hier sind die Ergebnisse aus dem Beispiel und den Testfällen:Ich versuche, dies in Perl zu schreiben, aber ich kann nicht herausfinden, wie man mehrdimensionale Arrays aus stdin ohne eine große Anzahl von Zeichen erhält. Hat jemand irgendwelche Vorschläge?
quelle
(i[0]+w,i[1]+j)not in c
zu{(i[0]+w,i[1]+j)}-c
und Sie könnenw=h=1
zurc=set(a)-set(b)
Linieb+=[(j+i[0],k+i[1])]
zub+=(j+i[0],k+i[1]),
und du verwendestrange
dreimal, also ist es kürzer zuzuweisenr=range
x,y=i
dannx
undy
anstelle voni[0]
und zu verwendeni[1]
? Das würde eine Menge Bytes sparen.while not[j for j in r(h)if(x+w,y+j)not in c]:w+=1
benutzenwhile all((x+w,y+j)in c for j in r(h)):w+=1
.Python 2, 139
Das Programm akzeptiert Listen geordneter Paare, die bei der Standardeingabe von geschweiften Klammern umgeben sind. Z.B,
{(0,0),(1,0),(0,1),(1,1),(2,1),(1,2),(2,2)}
Es ist oft irritierend (nicht nur im Golf), dass Python eine Zuweisung innerhalb eines Loop-Tests nicht zulässt. Um dies zu umgehen, habe ich Zeichenfolgenformatierungsoperationen verwendet.
quelle
Mathematica -
315 285267 BytesMit etwas Hilfe von @ MartinBüttner.
Ungolfed:
Verwendung:
Testfälle
Eine U-förmige Region
Ein großes Dreieck
Ein Quadrat mit Löchern
Nicht verbundene Regionen
quelle
Haskell, 158
Testfälle und Bilder folgen in Kürze.
Algorithmus: Nehmen Sie das erste Quadrat. Greifen Sie ganz nach rechts, ohne auf ein Feld zu stoßen, das nicht in der Eingabe enthalten ist. Greifen Sie dann so weit wie möglich nach oben, ohne ein Quadrat auf der Eingabe zu haben. Wir haben jetzt ein Rechteck ohne fehlendes Quadrat. Fügen Sie es der Ausgabe hinzu, entfernen Sie alle seine Quadrate von der Eingabe und rufen Sie rekursiv auf.
quelle
not$all(\x->elem(x,i)s)
mitany(\x->notElem(x,i)s)
.JavaScript (ES6) 148
155 199Edit2 Noch ein bisschen Tuning
Edit Ein bisschen Golfen + Umschreiben mit Rekursion. Habe nicht mit einer solchen Reduzierung gerechnet. Jetzt ist es etwas schwierig zu folgen, aber der Algorithmus ist der gleiche.
Der Algorithmus ähnelt der Antwort von @jakube.
. Das erste Element wächst, das zweite Element wird gelöscht. Beginnen Sie erneut mit Schritt 2.
Andernfalls fahren Sie mit dem nächsten Element fort
Test im Snippet
quelle
Mathematica,
153 151 144 136133Beispiel:
Eingang:
Ausgabe:
Eingang:
Ausgabe:
Algorithmus:
Bedecke die Region mit Quadraten und füge sie dann zusammen.
quelle