Описание
Мы рассматриваем слегка упрощенную версию тетриса, где каждый ход состоит из:
- вращая деталь по часовой стрелке, от 0 до 3 раз
- позиционирование фигуры в данном столбце
- быстрое падение
Цель состоит в том, чтобы определить количество завершенных линий, учитывая список таких ходов тетриса.
Завершенные строки удаляются по мере удаления частей, следуя стандартным правилам тетриса.
Playfield
Игровое поле шириной 10 колонок. Там нет Game Over, и предполагается, что всегда есть достаточно места и времени для выполнения вышеуказанных действий, независимо от конфигурации игрового поля. Высота игрового поля здесь не имеет большого значения, но вы можете использовать стандартные 22 строки в качестве верхнего предела.
Формы Тетромино
Ввод, вывод
вход
Разделенный запятыми список ходов тетриса, закодированных 3 символами. Первые два символа описывают используемую фигуру Тетромино, а последний - позицию, где она выпала.
- Tetromino:
I
,O
,T
,L
,J
,Z
илиS
, в том же порядке , как указано выше. - Количество вращений по часовой стрелке:
0
до3
- Колонка:
0
до9
. Это столбец , в котором верхний левый угол элемента (отмеченные звездочкойx
на рисунке выше) расположен после поворота 1
Предполагается, что все ходы в указанном списке действительны. Нет необходимости проверять наличие недопустимых записей, таких как I07
(горизонтальная I
форма расположена слишком далеко справа).
1 Вы можете либо реализовать алгоритм реального вращения, либо жестко закодировать все различные фигуры, если только они x
находятся в столбце, заданном третьим символом движения.
Выход
Количество завершенных строк.
пример
O00,T24
сгенерирует первую позицию и O00,T24,S02,T01,L00,Z03,O07,L06,I05
сгенерирует вторую позицию.
Поэтому следующая последовательность сгенерирует тетрис и должна вернуть 4
:
O00,T24,S02,T01,L00,Z03,O07,L06,I05,I19
Контрольные примеры
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
Тестовая страница
Вы можете использовать этот JSFiddle для проверки списка перемещений.
Ответы:
PHP,
405399378372368360354347331330328319309300 байт(с блок-картой Дейва )
программа, принимает ходы как отдельные аргументы, печатает результат
разбивка на функции:
принимает ходы как массив, возвращает результат
для справки: старое отображение
тестирование
посмотрите мой другой ответ PHP
хочу посмотреть?
удалите
#
из источника функции и добавьте это:некоторые шаги в гольф
Rev. 5: Большой скачок (399- 21 = 378) пришел, просто перемещая сдвиг колонки
от отдельного контура для двух существующих контуров.
Версия 8: Переключение с массива на основание 16 для фигуры ($ s) не дало много,
но уступило место еще большему гольфу.
Версия 17: сжатые значения с
base64_encode(pack('V*',<values>))
использованием байтовой индексации вместо
unpack
сохранения 16 байтовОт 25 до 29: вдохновлено кодом Дэйва: новое хэширование (-2), новый дизайн цикла (-9),
переход к (-10) без предварительной смены; это будет стоить 17 байт.
больший потенциал
С помощью
/2%9
я могу сохранить 15 байтов (только 14 байтов/4%5
), поместив двоичные данные в файл
b
и затем проиндексировавfile(b)[0]
.Хочу ли я этого?
Символы UTF-8 будут стоить дорого за преобразование.
на хеширование
Я использовал
ZJLO.ST /2%9 -> 0123.56
; ноT.ZJLOS /3%7 -> 0.23456
так же хорошо.один байт длиннее
O.STJLZ %13/2 -> 0.23456
и еще три:
OSTZJ.L %17%12%9 -> 01234.6
Я не смог найти короткий хеш (макс. 5 байт), который не оставляет пробела;
но Дейв нашел
STZJL /4%5 -> 01234
, выронив O из списка. WTG!кстати:
TIJSL.ZO (%12%8) -> 01234.67
оставляет место дляI
фигуры(и вымышленной
A
,M
илиY
фигуры).%28%8
и%84%8
сделать то же самое (но сE
вместоA
).источник
break 2
оно намного чище, чем то, что я должен был сделать в C! Вы могли бы быть в состоянии сохранить несколько байт, используяarray_diff
(набор завершен строки фиксированного значения вместо использованияunset
затем заменитьarray_values
сarray_diff
), но я не могу сказать , из документации , если это будет выравниваться повторяющиеся значения (например , array_diff ([1,2, 2,3], [1]) -> [2,2,3] или просто [2,3])array_diff
не удаляет повторяющиеся значения; и у меня уже есть фиксированное значение (1023); но он не переиндексирует массив. Отличная идея, но это будет стоить байта./10
все время), но в остальном я думаю, что все готово. Я удивлен тем, насколько конкурентными оказались PHP и C. Это было весело - надеюсь, что ОП примет ваш ответ!if
.C
401392383378374351335324320318316305 байтПринимает разделенный запятыми ввод в stdin, возвращает счет в статусе выхода.
Требует
char
подписи (что является значением по умолчанию для GCC) и'3Z3Z'
должно интерпретироваться как 861549402 (как в случае GCC на машинах с прямым порядком байтов, по крайней мере).Пример использования:
Объяснение высокого уровня:
Все фигуры, кроме линии, могут поместиться в сетку 3х3 без одного угла:
Это означает, что их легко хранить в байтах. Например:
(мы выравниваем каждую часть по левому нижнему краю коробки, чтобы сделать ее более удобной)
Поскольку мы получаем по крайней мере 4 байта для целого числа, это означает, что мы можем хранить все 4 вращения каждого куска в одном целом числе со специальным случаем для строки. Мы также можем вписать каждый ряд игровой сетки в целое число (нужно всего 10 бит), а текущую падающую часть в длинную (4 строки = 40 бит).
Сломать:
-4, -1 благодаря @Titus, и -23, -11 с вдохновением от их ответа
источник
s+=(d[A-x]=d[A])
без использованияx
?x
, необходимо отслеживать, сколько строк свернуть в текущем шаге (каждая строкаA
имеет значение строкиA-x
в ходе цикла)1[a]
иa[1]
делать то же самое (или, точнее,a[b]
переводится как*(a+b)
). Это используется как способ избежать скобок. В этом случае1[*v]
==(*v)[1]
, т.е. вторая буква команды, т.е. вращение.I
заполнителя? Если это так, попробуйте/2%9
вместо хеша%12
.%12%8
если не.Рубин,
474443428379 + 48 = 427 байт-1 благодаря @Titus
Это определенно может быть больше в гольфе.
Читает двоичный словарь частей (см. Ниже) из STDIN или имени файла и принимает список перемещения в качестве аргумента, например
$ cat pieces | ruby script.rb O00,T24,S02,...
.Двоичные данные (формат xxd)
Смотрите его на repl.it (с жестко закодированными аргументами, словарем): https://repl.it/Cqft/2
Ungolfed & объяснение
источник
m >> 10
может бытьm >> x
\d
s в регулярном выражении:/(\w)(\d)(\d)/
→/(\w)(.)(.)/
PHP,
454435427420414 байтбитовые поля для фигур и карты; но нет особого случая для
I
формы, как гольф Дэйва.принимает аргументы из командной строки, печатает результат
разряженный как функция
принимает аргументы как массив, возвращает результат
тесты (по функции)
источник
<?
накладные расходы :)