Мені дуже подобається тетріс, але я в цьому не дуже добре. Якраз хотів би побачити, як космічний корабель злітає на моїх очах! А оскільки комп’ютери настільки чудові у всьому, єдине можливе рішення - це зробити програму, щоб вона відтворила її для мене ... за винятком того, що ви збираєтеся робити це для мене!
Враховуючи тетроміно (форма з чотирьох квадратів) та карту ігрового поля, ви повинні розмістити тетроміно таким чином, щоб він набрав найбільшу кількість рядків (робить найбільшу кількість рядків повністю заповненими блоками) і створює найменше число з нових отворів (порожнього простору , яке не може «бачити» у верхній частині ігрового поля 1 ).
Вхідні дані
Вхід буде містити символ в одному рядку, який представляє тетраміно, що випадає, з подальшим 10 * 18 сіткою 2 пробілів ( ) та знаками плюс (
+
).
Символ являє собою будь-який із семи базових тетромінонів, знайдених у тетрісі. Усі шматки можна обертати на 90 градусів, але не перевертати. Усі тетроміно та їх обертання наступні:
#
S = ## ##
## #
#
Z = ## ##
## #
# ### ##
L = # # # #
## # ###
# ### ##
J = # # # #
## # ###
# # #
T = ### ## ### ##
# # #
O = ##
##
#
I = # ####
#
#
Сітка представляє ігрове поле Tetris, з +
попередньо розміщеними блоками. Отже, прикладом введення може бути такий:
I
+ ++
+ +++++
++ +++++++
++ +++++++
++ +++++++
++ +++++++
++++++ +++
Вихідні дані
Ваш вихід буде ідентичним вхідному, але з тетроміно в ідеальному положенні. Тетроміно має бути представлене, #
щоб відрізняти їх від попередньо розміщених блоків. На додаток до цього, ви також повинні вивести, скільки ліній / отворів створює ваше розташування у формі xL yH
в новому рядку.
Вихід для наведеного вище прикладу буде таким 3 :
I
+ ++
+ +++++
++#+++++++
++#+++++++
++#+++++++
++#+++++++
++++++ +++
4L 0H
Ви повинні виводити лише найкращі результати; у випадку, коли два чи більше випадків дають однаковий бал, ви повинні вивести їх усі (розділені порожнім рядком). Найкращі результати слід визначати, сортуючи спочатку кількість набраних рядків (у спаді), а потім кількість нових отворів (зростаючих). Отже, 1L 1H
кращий бал, ніж 0L 0H
.
Я буду працювати над створенням списку різних входів та очікуваних результатів, на які ви можете протестувати свою програму. Слідкуйте за цим простором.
Правила та розбіжність
- Це код-гольф , тому найкоротша правильна реалізація виграє.
- Введення / вихід може бути на будь-якому носії, що відповідає вашій цільовій мові (наприклад, файл, stdin / stdout, область тексту).
- Якщо ваша цільова мова не підтримує введення декількох рядків (або це незручно), натомість ви можете розмежувати кожен рядок введення комами (
,
). - Ви можете опустити вихід будь-яких порожніх рядків у сітці.
- Пам’ятайте, що тетроміно падає зверху - ви можете не розмістити шматок «під землею». Ви можете, таким чином, припустити, що всі можливі розміщення шматка будуть знаходитись на рівні "поверхні" (тобто між шматком та верхом дошки немає блоків).
- Припустимо, що ніколи не буде ситуації, в якій вас змушують переграти гру (розміщене тетроміно торкається верхнього центру поля).
- Рішення, ідентичні у виході, повинні бути пропущені (наприклад, є 3 виходи рішення, якщо ви наївно обертаєте
O
шматок).
1 Я знаю, що це створить помилкові позитиви, але це спрощення.
2 Це розмір сітки, який використовується у версії Game Boy.
3 Так, 0H
це правильно. Перевірте ще раз, я сказав нові дірки; ^)