Beschreibung
Wir betrachten eine leicht vereinfachte Version von Tetris, bei der jeder Zug aus Folgendem besteht:
- Drehen Sie das Stück im Uhrzeigersinn, 0 bis 3 Mal
- Positionieren Sie das Stück an einer bestimmten Spalte
- schnell fallen
Ziel ist es, anhand einer Liste solcher Tetris-Züge die Anzahl der fertiggestellten Linien zu bestimmen.
Abgeschlossene Reihen werden entfernt, wenn Teile fallengelassen werden, gemäß den Standardregeln von Tetris.
Spielfeld
Das Spielfeld ist 10 Spalten breit. Es gibt kein Spielende und es wird davon ausgegangen, dass immer genügend Platz und Zeit zur Verfügung stehen, um die oben genannten Aktionen auszuführen, unabhängig von der Konfiguration des Spielfelds. Die Höhe des Spielfelds spielt hier keine Rolle, aber Sie können die 22 Standardreihen als Obergrenze verwenden.
Formen von Tetrominoes
Input-Output
Eingang
Eine durch Kommas getrennte Liste von Tetris-Zügen, die mit 3 Zeichen codiert sind. Die ersten beiden Zeichen beschreiben die zu verwendende Tetromino-Form und das letzte beschreibt die Position, an der sie abgelegt wird.
- Tetromino:
I
,O
,T
,L
,J
,Z
oderS
, in der gleichen Reihenfolge wie oben. - Anzahl der Umdrehungen im Uhrzeigersinn:
0
bis3
- Spalte:
0
bis9
. Dies ist die Spalte, in der sich die linke obere Ecke des Stücks (x
im obigen Bild mit einem gekennzeichnet ) nach der Drehung 1 befindet
Es wird davon ausgegangen, dass alle Züge in der angegebenen Liste gültig sind. Es ist nicht erforderlich, nach ungültigen Einträgen wie I07
(horizontale I
Form zu weit rechts) zu suchen.
1 Es steht Ihnen frei, entweder einen echten Rotationsalgorithmus zu implementieren oder alle verschiedenen Formen fest zu codieren, solange x
sich diese in der Spalte befinden, die durch das dritte Zeichen des Zuges angegeben wird.
Ausgabe
Anzahl der ausgefüllten Zeilen.
Beispiel
O00,T24
erzeugt die erste Position und O00,T24,S02,T01,L00,Z03,O07,L06,I05
erzeugt die zweite Position.
Daher generiert die folgende Sequenz ein Tetris und sollte zurückgeben 4
:
O00,T24,S02,T01,L00,Z03,O07,L06,I05,I19
Testfälle
1) "O00,T24,S02,T01,L00,Z03,O07,L06,I05,I19" -> 4
2) "S00,J03,L27,Z16,Z18,I10,T22,I01,I05,O01,L27,O05,S13" -> 5
3) "I01,T30,J18,L15,J37,I01,S15,L07,O03,O03,L00,Z00,T38,T01,S06,L18,L14" -> 4
4) "S14,T00,I13,I06,I05,I19,L20,J26,O07,Z14,Z10,Z12,O01,L27,L04,I03,S07,I01,T25,J23,J27,O01,
I10,I10" -> 8
5) "O00,T24,L32,T16,L04,Z11,O06,L03,I18,J30,L23,Z07,I19,T05,T18,L30,I01,I01,I05,T02" -> 8
Testseite
Mit diesem JSFiddle können Sie eine Verschiebungsliste testen.
Antworten:
PHP,
405399378372368360354347331330328319309300 Bytes(mit Daves Blockmapping )
Programm, bewegt sich als separate Argumente, druckt Ergebnis
Aufschlüsselung nach Funktion:
Nimmt Züge als Array und gibt das Ergebnis zurück
als referenz: das alte mapping
testen
siehe meine andere PHP-Antwort
will es sehen?
Entfernen Sie die
#
aus der Funktionsquelle und fügen Sie Folgendes hinzu:einige Golfschritte
Rev. 5: Ein großer Sprung (399- 21 = 378) wurde , indem einfach die Spaltenverschiebungs Bewegen
von einer separaten Schleife zu den beiden vorhandenen Schlaufen.
Rev. 8: Der Wechsel von Array zu Basis 16 für das Teil ($ s) brachte nicht viel,
machte aber Platz für mehr Golf.
Rev. 17: Die Werte wurden mit gekürzt
base64_encode(pack('V*',<values>))
und die Byte-Indizierung verwendet, anstatt 16 Byte
unpack
zu sparenRev. 25 bis 29: inspiriert von Daves Code: neues Hashing (-2), neues Loop-Design (-9), gehe zu (-10), aber
keine Vorverschiebung ; das würde 17 bytes kosten.
mehr Potenzial
Mit
/2%9
könnte ich 15 Bytes (nur 14 Bytes mit/4%5
) sparen,indem ich binäre Daten in eine Datei lege
b
und dann indizierefile(b)[0]
.Will ich das
UTF-8-Zeichen würden für die Umwandlung viel kosten.
auf dem Hashing
Ich benutzte
ZJLO.ST /2%9 -> 0123.56
; ist aberT.ZJLOS /3%7 -> 0.23456
genauso gut.ein Byte länger
O.STJLZ %13/2 -> 0.23456
und drei weitere:
OSTZJ.L %17%12%9 -> 01234.6
Ich konnte keinen kurzen Hash (max. 5 Bytes) finden, der keine Lücke hinterlässt.
aber Dave fand
STZJL /4%5 -> 01234
und ließ das O von der Liste fallen. wtg!btw:
TIJSL.ZO (%12%8) -> 01234.67
Raum für dieI
Form(und einer fiktiven
A
,M
oderY
Form).%28%8
und%84%8
mache dasselbe (aber mitE
stattA
).quelle
break 2
ist viel sauberer als das, was ich in C tun musste! Sie könnten möglicherweise einige Bytes speichern , indem Siearray_diff
(Satz abgeschlossen Linien auf einen festen Wert anstatt der Verwendungunset
dann ersetzenarray_values
mitarray_diff
), aber ich kann aus der Dokumentation nicht sagen , ob das wiederholte Werte abflachen würde (zB array_diff ([1,2, 2,3], [1]) -> [2,2,3] oder nur [2,3])array_diff
keine doppelten Werte; und ich habe bereits den festen Wert (1023); Das Array wird jedoch nicht neu indiziert. Tolle Idee, aber es würde ein Byte kosten./10
überall benötige ), aber ansonsten denke ich, dass ich fertig bin. Ich bin überrascht, wie sich herausgestellt hat, dass PHP und C direkt wettbewerbsfähig sind. Das hat Spaß gemacht - ich hoffe, das OP akzeptiert Ihre Antwort!if
.C,
401392383378374351335324320318316305 BytesÜbernimmt die durch Kommas getrennte Eingabe für stdin und gibt die Punktzahl im Beendigungsstatus zurück.
Muss
char
signiert werden (dies ist die Standardeinstellung für GCC) und muss'3Z3Z'
als 861549402 interpretiert werden (was zumindest für GCC auf Little-Endian-Computern der Fall ist).Anwendungsbeispiel:
Erklärung auf hoher Ebene:
Alle Formen mit Ausnahme der Linie können in ein 3x3-Raster passen, wobei eine Ecke fehlt:
Das heißt, es ist einfach, sie jeweils in einem Byte zu speichern. Beispielsweise:
(Wir richten jedes Stück unten links in der Box aus, um das Ablegen zu erleichtern.)
Da wir mindestens 4 Bytes zu einem Int erhalten, können wir alle 4 Umdrehungen jedes Stücks in einer einzelnen Ganzzahl speichern, mit einem Sonderfall für die Zeile. Wir können auch jede Zeile des Spielgitters in ein int (benötigt nur 10 Bit) und das aktuell fallende Teil in ein long (4 Zeilen = 40 Bit) einpassen.
Nervenzusammenbruch:
-4, -1 danke an @Titus und -23, -11 mit Inspiration von ihrer Antwort
quelle
s+=(d[A-x]=d[A])
Verwendung verzichtenx
?x
nachverfolgt werden, wie viele Zeilen im aktuellen SchrittA
A-x
1[a]
unda[1]
machen Sie dasselbe (oder genauera[b]
übersetzt*(a+b)
). Es wird so missbraucht, um Klammern zu vermeiden. In diesem Fall1[*v]
==(*v)[1]
, dh der zweite Buchstabe des Befehls, dh die Drehung.I
Platzhalter loswerden ? Wenn ja, versuchen Sie es/2%9
als Hash anstelle von%12
.%12%8
wenn nicht.Ruby,
474443428379 + 48 = 427 Bytes-1 danke an @Titus
Damit kann man definitiv mehr golfen.
Liest ein binäres Teilewörterbuch (siehe unten) aus STDIN oder einem Dateinamen und nimmt eine Verschiebungsliste als Argument, z
$ cat pieces | ruby script.rb O00,T24,S02,...
.Binäre Stückdaten (xxd-Format)
Siehe es auf repl.it (mit fest codierten Argumenten, Wörterbuch): https://repl.it/Cqft/2
Ungolfed & Erklärung
quelle
m >> 10
könnte seinm >> x
\d
s im regulären Ausdruck zu fordern :/(\w)(\d)(\d)/
→/(\w)(.)(.)/
PHP,
454435427420414 BytesBitfelder für Teile und Karte; aber kein spezieller Fall für die
I
Form wie Daves Golf.Übernimmt Argumente von der Kommandozeile und gibt das Ergebnis aus
ungolfed als funktion
Nimmt Argumente als Array und gibt das Ergebnis zurück
Tests (auf Funktion)
quelle
<?
Overhead :)