Bardzo lubię Tetris, ale nie jestem w tym zbyt dobry. Raz chciałbym zobaczyć, jak ten statek kosmiczny startuje na własne oczy! A ponieważ komputery są naprawdę świetne we wszystkim, jedynym możliwym rozwiązaniem jest stworzenie dla mnie programu do grania ... z wyjątkiem tego, że zrobisz to dla mnie!
Biorąc pod uwagę tetromino (kształt złożony z czterech kwadratów) i mapę pola gry, należy umieścić tetromino tak, aby uzyskało największą liczbę linii (sprawia, że najwięcej wierszy jest całkowicie wypełnionych blokami) i tworzy najmniejszą liczbę z nowych otworów (pustej przestrzeni, która nie może „widzieć” szczyt boisku 1 ).
Wejście
Dane wejściowe będą zawierać znak w jednym wierszu reprezentującym upuszczające tetromino, a następnie 10 * 18 siatki 2 spacji ( ) i znaków plus (
+
).
Postać reprezentuje dowolną z siedmiu podstawowych tetrominoes znalezionych w Tetris. Wszystkie elementy można obracać o 90 stopni, ale nie można ich odwrócić. Wszystkie tetromino i ich rotacje są następujące:
#
S = ## ##
## #
#
Z = ## ##
## #
# ### ##
L = # # # #
## # ###
# ### ##
J = # # # #
## # ###
# # #
T = ### ## ### ##
# # #
O = ##
##
#
I = # ####
#
#
Siatka reprezentuje pole gry Tetris, z +
uprzednio umieszczonymi blokami. Tak więc przykładowe dane wejściowe mogą wyglądać następująco:
I
+ ++
+ +++++
++ +++++++
++ +++++++
++ +++++++
++ +++++++
++++++ +++
Wynik
Twój wynik będzie identyczny z wejściem, ale z tetromino w idealnej pozycji. Tetromino powinno być reprezentowane przez, #
aby odróżnić je od wstępnie umieszczonych bloków. Oprócz tego masz również wyprowadzić, ile linii / otworów utworzy Twoje umiejscowienie w formularzu xL yH
w nowej linii.
Dane wyjściowe dla powyższego przykładu byłyby następujące 3 :
I
+ ++
+ +++++
++#+++++++
++#+++++++
++#+++++++
++#+++++++
++++++ +++
4L 0H
Masz generować tylko najlepsze wyniki; w przypadku dwóch lub więcej przypadków dających ten sam wynik, musisz wypisać wszystkie (oddzielone pustą linią). Najlepsze wyniki należy ustalić, sortując najpierw według liczby linii (malejąco), a następnie liczby utworzonych nowych otworów (rosnąco). Tak, 1L 1H
to lepszy wynik niż 0L 0H
.
Będę pracować nad stworzeniem listy różnych danych wejściowych i oczekiwanych danych wyjściowych, na podstawie których możesz przetestować swój program. Patrz na przestrzeń.
Zasady i ujednoznacznienie
- To jest golf golfowy , więc wygrywa najkrótsza poprawna implementacja.
- Dane wejściowe / wyjściowe mogą być na dowolnym nośniku, który pasuje do twojego języka docelowego (np. Plik, stdin / stdout, pole tekstowe).
- Jeśli Twój język docelowy nie obsługuje wprowadzania wielu wierszy (lub jest to niewygodne), możesz zamiast tego ograniczyć każdy wiersz wpisu przecinkami (
,
). - Możesz pominąć wyświetlanie jakichkolwiek pustych linii w siatce.
- Pamiętaj, że tetromino spada z góry - nie możesz umieszczać elementu „pod ziemią”. Możesz zatem założyć, że wszystkie możliwe położenia elementu będą na „poziomie powierzchni” (tzn. Nie będzie żadnych bloków między kawałkiem a górną częścią planszy).
- Załóżmy, że nigdy nie wystąpi sytuacja, w której zostaniesz zmuszony do zakończenia gry (umieszczone tetromino dotyka górnej środkowej części pola).
- Rozwiązania, które mają identyczne wyjście, należy pominąć (np. Istnieją 3 wyjścia, jeśli naiwnie obracasz
O
element).
1 Wiem, że spowoduje to powstanie fałszywych trafień, ale jest to uproszczenie.
2 To jest rozmiar siatki używany w wersji Game Boy.
3 Tak, 0H
jest poprawne. Sprawdź jeszcze raz, powiedziałem nowe dziury; ^)
Odpowiedzi:
C 1009 bajtów
Oto wersja bez golfa
Widziałem, że głównym źródłem długiego kodu prawdopodobnie będzie definicja kafelków. Postanowiłem więc przedstawić je jako wzory bitowe w tablicy 4x4. Powoduje to 16 bitów, które łatwo pasują do jednego
int
.tiles
Tablica posiada wszystkie wzory na 19 możliwych obrotów 7 płytek.Podczas kompilacji zignoruj
gets
przestarzałe ostrzeżenie . Wiem, że tak, ale jest to najkrótszy sposób odczytu linii z wejścia.źródło
int
zgodnie z założeniami. Kilku z twoichprintfs
jedynych produkuje pojedynczy znak. Być może będziesz w stanie zastąpić je ekwiwalentem,putchar
aby zapisać kilka znaków. Na przykład zmianaprintf("\n")
naputchar(10)
:)