Herausforderung Aus meinem Hochschulcode-Herausforderungswettbewerb entnommen
Dies ist eigentlich Tag 0, aber die gestrige Herausforderung war zu einfach und kann hier ein Betrug einer anderen Frage sein.
Tetris ist ein Videospiel, das in den 80er Jahren populär wurde. Es besteht aus einer Reihe von Stücken mit unterschiedlichen Formen, die auf ein Brett fallen, damit sie möglichst kompakt passen.
In diesem Problem nehmen wir eine Folge von Stücken an, die jeweils in einer bestimmten Position und mit einer bestimmten Ausrichtung abfallen, die nicht geändert werden können. Die Steine werden beim Fallen gestapelt und die kompletten Reihen werden nicht eliminiert (wie im ursprünglichen Spiel). Ziel ist es, die endgültige Höhe jeder Brettsäule zu bestimmen, nachdem alle Teile gefallen sind.
Es gibt insgesamt 7 verschiedene Teile, die in der Abbildung dargestellt sind:
Herausforderung
Wenn Sie eine Stückliste erhalten haben, geben Sie die Höhe aller Spalten von der Tafel aus, nachdem alle Stücke gefallen sind
Ein Stück besteht aus drei Zahlen: I, R und P. Die erste Zahl, I, ist die Kennung des Stücks (eine Zahl zwischen 1 und 7 in derselben Reihenfolge wie in der Abbildung). Die zweite Zahl, R, ist die Drehung des Stücks. Sie kann die Werte 0, 90, 180 oder 270 annehmen und repräsentiert den Drehwinkel des Werkstücks gegen den Uhrzeigersinn. Die dritte Zahl P gibt die Position des Teils an. Stellt die Spalte auf der linken Seite dar, die von dem Stück belegt ist (dies kann ein Index von 1 oder 0 sein. Bitte angeben).
Beispiel und Testfall (1 Index)
- Gegeben
[[1, 0, 1], [4, 0, 1], [5, 90, 4]]
- Ausgabe
[3, 3, 1, 3, 2]
- Gegeben
[[6, 270, 4], [1, 180, 5], [1, 90, 6], [7, 0, 4]]
- Ausgabe
[0, 0, 0, 9, 9, 8, 3, 3]
Gegebene
[[3,0,1],[3,180,3]]
Ausgabe[1,1,4,4,4]
Gegebene
[[2,180,1],[2,0,3]]
Ausgabe[2,2,4,3,3]
Anmerkungen
- Das ist Code-Golf
- Zeile / Spalte kann 1 oder 0 Index sein. Bitte spezifizieren.
- Sie können Eingabewerte neu definieren (möglicherweise möchten Sie Teil 1 als A usw. bezeichnen). In diesem Fall bitte angeben
Fragen
Können wir 4 verschiedene Werte anstelle eines Winkels in Grad verwenden ?: Ja
Sollen wir mit "Löchern" umgehen, wenn ein Teil nicht genau über die vorherigen passt ?: Ja
Ist die Höhe oder die Breite der Tafel begrenzt? Nein, weder die Breite noch die Höhe sind begrenzt
Danke @Arnauld für die Bilder und die Testfälle *. *
I
,R
undP
sein Eingang in einer anderen Reihenfolge?Antworten:
JavaScript (Node.js) ,
286 284 270266 BytesTeile und Positionen sind 0-indiziert. Winkel sind in[0..3] .
Probieren Sie es online! Oder versuchen Sie es mit einer erweiterten Version , die auch die endgültige Karte anzeigt.
Formkodierung
Alle Teile werden als genau 4 Halbbytes (4 × 4 Bits) gespeichert, wobei die Zeilen in umgekehrter Reihenfolge sortiert sind und das am weitesten links stehende Pixel dem niedrigstwertigen Bit zugeordnet ist. Mit anderen Worten wird die binäre Darstellung der Form sowohl vertikal als auch horizontal gespiegelt.
Beispiel:
Hash-Funktion und Nachschlagetabelle
Nur die ersten Einträge werden explizit gespeichert. Alles andere wird auf .82 0
Diese Einträge sind gepackt als:
Das erweitert sich auf die folgenden 82 Knabbereien:
Die Verwendung von Hexadezimal im endgültigen Format ist nur für die beiden horizontalen Darstellungen des Stücks erforderlich , daher die in der obigen Zeichenfolge.ich
"ff"
Die Parameter der Hash-Funktion wurden auf eine Weise brutal erzwungen, die führende und nachfolgende Nullen optimiert. Die Tatsache, dass die Zeichenfolge durch Verwendung
1e12
der Nullen in der Mitte und einer Konvertierung von base-16 zu base-4 für den rechten Teil noch weiter komprimiert werden kann, ist nur ein willkommener, aber unerwarteter Nebeneffekt. :-)Hier sehen Sie eine Demonstration des Auspackvorgangs für alle Teile und alle Umdrehungen.
Kommentiert
quelle
C (clang) ,
253239221212 BytesProbieren Sie es online!
ps Tatsächlich beträgt die Codegröße 221 Byte (aber 212 Zeichen), da UNICODE-Zeichen in UTF-8 codiert sind. Aber tio.run behandelt es als 212-Byte-Code ...
Die Codegröße auf meinem Computer beträgt 209 Zeichen (218 Byte). Aber ich konnte nicht
\225
durch sichtbares Zeichen in tio.run replace ersetzenUngolfed Code
Beschreibung
Finden wir die obere Grundlinie ( TBL ) jeder Figur und beschreiben sie als eine Anzahl von Zellen unterhalb der TBL für jede horizontale Position. Beschreiben wir auch die Anzahl der Zellen (Höhe) über TBL ( HAT ).
Z.B:
Beschreiben wir TBLs und HATs für jede Figur und jeden Drehwinkel:
Jetzt sollten wir diese Zahlen als Sequenzen von 2 Bits codieren und in ein Array einfügen (Ersetzen
4 0
durch3 1
für einen 90 ° -Winkel der "Linie", um 2 Bits zu passen - das Ergebnis ist dasselbe und die Breite wird um 1 verringert).Wir werden in der Reihenfolge codieren: width (in 2 LSB), TBLs , HATs (Rückwärts für Rückwärtsschleife). ZB
2 2 1 1 0
für 270 ° Winkel von T-Zahl wird als codiert wird1 0 1 2 1
(letzte 1 ist Breite-1 ):0b0100011001 = 281
.aktualisiert am 12.02:
a) Ich habe ein Array in einen String konvertiert und 18 Zeichen gespeichert (Sie können den vorherigen 239-Byte-Code sehen ) :))
b) Mehr Optimierung, Code wird um 9 Zeichen verkleinert.
Dies ist mein letzter Versuch (ich denke schon, lol!) 😀
quelle
<s> ... </s>
.Common Lisp, 634 Bytes
Ausführlich
Probier es aus
Die Stücke sind Kreislisten von Nummernlisten. Diese Unterlisten stellen jeweils eine Seite der Form dar, wobei die Zahlen angeben, wie weit sie von der gegenüberliegenden Seite entfernt sind. Sie sind von links nach rechts, wenn diese Seite unten ist, von rechts nach links, wenn oben, von oben nach unten, wenn links und von unten nach oben, wenn rechts. Diese Entwurfsentscheidungen machen das Schreiben von Code für die Drehung überflüssig. Leider scheint das Fehlen eines Rotationscodes die langen Formdarstellungen oder die etwas komplizierte Logik, die ich zur Berechnung neuer Spaltenhöhen verwendet habe, nicht kompensiert zu haben.
Die Drehung ist eine nicht negative ganze Zahl. 0 = 0 Grad, 1 = 90 Grad, 2 = 180 Grad, 4 = 270 Grad
quelle
C # (Visual C # Interactive Compiler) , 308 Byte
Probieren Sie es online!
OK - Das war Wahnsinn ... Ich reichte eine Antwort ein, die Standard-Code-Golftechniken verwendete. Aber als ich sah, was andere einreichten, erkannte ich, dass es einen besseren Weg gab.
Jedes
(shape, rotation)
Tupel wird in ein C # -Stringliteral codiert, wobei Duplikate entfernt werden. Der Codierungsprozess erfasst jede dieser Konfigurationen in 2 Bytes.Die niedrigsten 3 Bits speichern die Höhe und die nächsten 3 die Breite. Da jeder dieser Werte niemals mehr als 4 ist, können sie ohne Konvertierung direkt aus den 3 Bits gelesen werden. Hier sind einige Beispiele:
Als nächstes wird jede Spalte in 3 Bits gespeichert. Am nützlichsten für mich war die Anzahl der fehlenden Quadrate oben und unten in der Spalte.
Es fehlen nie mehr als 2 Felder oben oder unten und es fehlt nie mehr als 1 Feld in beiden gleichzeitig. Angesichts dieser Einschränkungen habe ich die folgende Codierung gefunden:
Da wir höchstens 3 Spalten mit fehlenden Quadraten darüber oder darunter berücksichtigen müssen, können wir jedes
(shape, rotation)
Tupel in 15 Bits codieren .Zuletzt wurden doppelte Formen entfernt. Das folgende Beispiel zeigt, wie mehrere
(shape,rotation)
Tupel bei verschiedenen Umdrehungen doppelte Ausgaben für dieselbe Form erzeugen können:Alle eindeutigen Ausgaben werden ermittelt und
byte[]
in einem C # -Zeichenfolgenliteral gespeichert und konvertiert. Um schnell nachzuschlagen, wo eine Form aufI
und basiertR
, bestehen die ersten 7 Bytes des Arrays aus einem codierten Nachschlageschlüssel.Unten ist ein Link zu dem Programm, mit dem ich die Teile komprimiert habe.
Probieren Sie es online!
Code mit weniger Golfspielen und Kommentaren:
quelle
Kohle , 98 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Nimmt die Eingabe als Array von [P, R, I] -Werten an, wobei I zwischen 0 und 6 liegt, R zwischen 0 und 3 liegt und P ebenfalls mit 0 indiziert ist. Erläuterung:
Schleife über die Eingangsstücke.
Extrahieren Sie die Beschreibung des aktuellen Teils und der Rotation. (Siehe unten.)
Extrahieren Sie die Position.
Stellen Sie sicher, dass genügend horizontaler Raum vorhanden ist, um das Teil zu platzieren.
Stellen Sie sicher, dass genügend vertikaler Raum vorhanden ist, um das Teil zu platzieren.
Berechnen Sie die neuen Höhen der betroffenen Spalten.
Wenn alle Teile verarbeitet wurden, geben Sie die endgültige Liste der Spaltenhöhen in separaten Zeilen aus.
Die komprimierte Zeichenfolge repräsentiert die ursprüngliche Zeichenfolge
00001923001061443168200318613441602332034173203014614341642430137
. Hier sind das2
sI
Trennzeichen und das1
sR
Trennzeichen. Die Stücke dekodieren daher wie folgt:Fehlende
R
Werte werden von Charcoal automatisch zyklisch aufgefüllt. Jede Ziffer ist dann gemäß der folgenden Tabelle zwei Werten zugeordnet: Überhang und Gesamthöhe:Der Überhang und die Gesamthöhe beziehen sich auf die Säulenhöhen wie folgt: Bei einem Stück, das wir an einer bestimmten Position platzieren möchten
e
, ist es möglicherweise möglich, das Stück zu platzieren, obwohl eine der Säulen größer als iste
. Die Menge des freien Platzes ergibt sich aus dem Überhang. Die neue Höhe der Säule nach dem Platzieren des Teils ist einfach die platzierte Position plus die Gesamthöhe.Beispiel: Angenommen, wir beginnen mit der Platzierung eines
5
Stücks in Spalte 1. Da noch nichts anderes vorhanden ist, wird das Stück an Position 0 platziert, und die Spalten 1 und 3 haben jetzt die Höhe 1, während Spalte 2 die Höhe 2 hat. Dann möchten wir ein6
Stück platzieren mit1
Drehung in Spalte 0. Hier können wir dieses Stück tatsächlich an Position 0 platzieren; Obwohl Spalte 1 eine Höhe von 1 hat, hat das Teil einen Überhang von 1, sodass genügend Platz vorhanden ist, um es zu platzieren. Spalte 0 endet mit einer Höhe von 2 und Spalte 1 endet mit einer Höhe von 3.quelle