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