Ich mag Tetris sehr, aber ich bin nicht sehr gut darin. Nur einmal möchte ich sehen, wie das Raumschiff vor meinen eigenen Augen abhebt! Und da Computer in allem ach so großartig sind, besteht die einzig mögliche Lösung darin, ein Programm zu erstellen, das es für mich spielt ... außer Sie werden das für mich tun!
Bei einem Tetromino (Form aus vier Quadraten) und einer Karte des Spielfelds müssen Sie das Tetromino so platzieren, dass es die größte Anzahl von Linien erzielt (die größte Anzahl von Zeilen vollständig mit Blöcken gefüllt ist) und die geringste Anzahl erzeugt von neuen Löchern (ein leerer Raum, der die Oberseite des Spielfeldes 1 nicht "sehen" kann ).
Eingang
Die Eingabe enthält ein Zeichen in einer einzelnen Zeile, das das fallende Tetromino darstellt, gefolgt von einem 10 * 18-Raster 2 aus Leerzeichen ( ) und Pluszeichen (
+
).
Der Charakter repräsentiert eines der sieben in Tetris gefundenen Basistetrominoes. Alle Teile können um 90 Grad gedreht, aber nicht gedreht werden. Alle Tetrominoes und ihre Rotationen sind wie folgt:
#
S = ## ##
## #
#
Z = ## ##
## #
# ### ##
L = # # # #
## # ###
# ### ##
J = # # # #
## # ###
# # #
T = ### ## ### ##
# # #
O = ##
##
#
I = # ####
#
#
Das Gitter stellt das Spielfeld von Tetris dar, wobei +
es sich um zuvor platzierte Blöcke handelt. Eine Beispieleingabe könnte also die folgende sein:
I
+ ++
+ +++++
++ +++++++
++ +++++++
++ +++++++
++ +++++++
++++++ +++
Ausgabe
Ihre Ausgabe ist identisch mit der Eingabe, jedoch mit dem Tetromino in der idealen Position. Das Tetromino sollte mit dargestellt werden #
, um sie von den vorab platzierten Blöcken zu unterscheiden. Darüber hinaus müssen Sie auch ausgeben, wie viele Linien / Löcher Ihre Platzierung im Formular xL yH
in einer neuen Linie erzeugt.
Die Ausgabe für das oben angegebene Beispiel wäre die folgende 3 :
I
+ ++
+ +++++
++#+++++++
++#+++++++
++#+++++++
++#+++++++
++++++ +++
4L 0H
Sie müssen nur die besten Ergebnisse ausgeben. Bei zwei oder mehr Fällen mit derselben Punktzahl müssen Sie alle ausgeben (durch eine Leerzeile getrennt). Die besten Ergebnisse werden ermittelt, indem zuerst nach der Anzahl der bewerteten Linien (absteigend) und dann nach der Anzahl der neu erstellten Löcher (aufsteigend) sortiert wird. Also, 1L 1H
ist eine bessere Punktzahl als 0L 0H
.
Ich werde daran arbeiten, eine Liste verschiedener Eingaben und erwarteter Ausgaben zu erstellen, anhand derer Sie Ihr Programm testen können. Beobachten Sie diesen Raum.
Regeln und Begriffsklärung
- Dies ist Code-Golf , so dass die kürzeste korrekte Implementierung gewinnt.
- Die Eingabe / Ausgabe kann in einem beliebigen Medium erfolgen, das zu Ihrer Zielsprache passt (z. B. Datei, Standard / Standardausgabe, Textbereich).
- Wenn Ihre Zielsprache keine mehrzeilige Eingabe unterstützt (oder dies unpraktisch ist), können Sie stattdessen jede Zeile der Eingabe durch Kommas (
,
) abgrenzen . - Sie können die Ausgabe von Leerzeilen im Raster weglassen.
- Denken Sie daran, dass der Tetromino von oben fällt - Sie dürfen das Stück nicht "unter der Erde" platzieren. Sie können daher davon ausgehen, dass sich alle möglichen Platzierungen des Stücks auf "Oberflächenebene" befinden (dh es befinden sich keine Blöcke zwischen dem Stück und der Oberseite des Bretts).
- Angenommen, es wird niemals eine Situation geben, in der Sie zu einem Spiel gezwungen werden (der platzierte Tetromino berührt die obere Mitte des Feldes).
- Lösungen, deren Ausgabe identisch ist, müssen weggelassen werden (z. B. gibt es 3 Lösungsausgaben, wenn Sie das
O
Stück naiv drehen ).
1 Ich bin mir bewusst, dass dies zu Fehlalarmen führen wird, aber es ist eine Vereinfachung.
2 Dies ist die Rastergröße, die in der Game Boy-Version verwendet wird.
3 Ja, 0H
ist richtig. Überprüfen Sie noch einmal, ich sagte neue Löcher; ^)
Antworten:
C 1009 Bytes
Hier ist die ungolfed Version
Ich sah, dass die Hauptquelle für langwierigen Code wahrscheinlich die Definition der Kacheln sein würde. Deshalb habe ich beschlossen, sie als Bitmuster in einem 4x4-Bit-Array darzustellen. Dies führt zu 16 Bits, die leicht in ein einzelnes passen
int
. Dastiles
Array enthält alle Muster für die 19 möglichen Umdrehungen der 7 Kacheln.Ignorieren Sie beim Kompilieren die
gets
veraltete Warnung . Ich weiß, dass es so ist, aber es ist die kürzeste Art, eine Zeile von der Eingabe zu lesen.quelle
int
wie angenommen löschen. Einige von Ihnen gebenprintfs
nur ein einziges Zeichen aus. Möglicherweise können Sie sie durch ein Äquivalent ersetzenputchar
, um einige Zeichen zu speichern. Zum Beispiel wechselnprintf("\n")
zuputchar(10)
:)