Вызов от моего университетского конкурса
Это на самом деле День 0, но вчерашний вызов был слишком легким и может быть обманом другого вопроса здесь.
Тетрис - это видеоигра, которая стала популярной в 80-х годах. Он состоит в размещении серии кусков различной формы, которые падают на доску так, чтобы они подходили максимально компактным образом.
В этой задаче мы будем предполагать последовательность частей, которые падают, каждая в определенной позиции и с определенной ориентацией, которая не может быть изменена. Части накапливаются по мере их падения, и полные ряды не удаляются (как в оригинальной игре). Цель состоит в том, чтобы определить окончательную высоту каждого столбца доски после падения всех фигур.
Всего на рисунке показано 7 разных фигур:
Вызов
Учитывая список фигур, выведите высоту всех столбцов с доски после падения всех фигур.
Часть состоит из трех чисел: I, R и P. Первое число, I, является идентификатором части (число между 1 и 7, в том же порядке, что и на рисунке). Второе число, R, это поворот фигуры. Он может принимать значения 0, 90, 180 или 270 и представляет угол поворота детали в направлении против часовой стрелки. Третье число, P, указывает положение фигуры. Представляет столбец слева, занятый частью (это может быть 1 или 0 индекс. Пожалуйста, укажите).
Пример и тестовый пример (1 индекс)
- Данный
[[1, 0, 1], [4, 0, 1], [5, 90, 4]]
- Выход
[3, 3, 1, 3, 2]
- Данный
[[6, 270, 4], [1, 180, 5], [1, 90, 6], [7, 0, 4]]
- Выход
[0, 0, 0, 9, 9, 8, 3, 3]
Данный
[[3,0,1],[3,180,3]]
вывод[1,1,4,4,4]
Данный
[[2,180,1],[2,0,3]]
вывод[2,2,4,3,3]
Примечания
- Это код-гольф
- Строка / Столбец может быть 1 или 0 Индекс. Пожалуйста уточни.
- Вы можете переопределить входные значения (возможно, вы хотите назвать часть 1 как A и т. Д.). В этом случае, пожалуйста, укажите
Вопросов
Можем ли мы использовать 4 различных значения вместо угла в градусах ?: Да
Должны ли мы обрабатывать «дыры», если кусок не совсем подходит по сравнению с предыдущими ?: Да
Высота или ширина доски ограничены? Нет. Ни ширина, ни высота не ограничены
Спасибо @Arnauld за изображения и контрольные примеры *. *
I
,R
иP
вводить в другом порядке?Ответы:
JavaScript (Node.js) ,
286 284 270266 байтПопробуйте онлайн! или попробуйте расширенную версию, которая также отображает финальную доску.
Кодировка формы
Все фрагменты сохраняются как ровно 4 полубайта (4х4 бита), причем строки сортируются в обратном порядке, а крайний левый пиксель отображается на младший значащий бит. Другими словами, двоичное представление формы отражается как по вертикали, так и по горизонтали.
Пример:
Хеш-функция и таблица поиска
Только первые записи хранятся в явном виде. Все остальное установлено на .82 0
Эти записи упакованы как:
который расширяется до следующих 82 клевов:
Использование шестнадцатеричного в окончательном формате требуется только для двух горизонтальных представлений части , следовательно, в приведенной выше строке.я
"ff"
Параметры хэш-функции были перебором таким образом, чтобы оптимизировать начальные и конечные нули. Тот факт, что строку можно сжать еще немного, используя
1e12
нули в середине и преобразование из base-16 в base-4 для правой части, - это только приятный, но неожиданный побочный эффект. :-)Вот демонстрация процесса распаковки для всех частей и всех вращений.
комментарии
источник
С (лязг) ,
253239221212 байтПопробуйте онлайн!
ps На самом деле размер кода составляет 221 байт (но 212 символов) из-за символов UNICODE, кодированных в UTF-8. Но tio.run обрабатывает его как 212-байтовый код ...
Размер кода на моем компьютере составляет 209 символов (218 байт). Но я не смог заменить
\225
видимый символ в tio.run 😞Код без правил
Описание
Давайте найдем верхнюю базовую линию ( TBL ) каждой фигуры и опишем ее как количество ячеек ниже TBL для каждой горизонтальной позиции. Также давайте опишем количество клеток (рост) выше TBL ( HAT ).
Например:
Давайте опишем TBL и HAT для каждой фигуры и каждого угла поворота:
Теперь мы должны кодировать эти числа в качестве последовательностей 2 бита и поместить в массив (заменяя
4 0
от3 1
90 ° угла «линии» , чтобы соответствовать в 2 бита - результат будет тем же самым , и уменьшение ширины на 1).Мы будем кодировать по порядку: ширина (в 2 LSB), TBL , HAT (в обратном направлении для обратной петли). Например ,
2 2 1 1 0
для 270 ° угла Т-фигуры будет закодирован как1 0 1 2 1
(последний 1 является ширина-1 ):0b0100011001 = 281
.обновлено 12.02:
а) Я преобразовал массив в строку и сохранил 18 символов (вы можете увидеть предыдущий 239-байтовый код ) :))
б) Больше оптимизации, код сокращен на 9 символов.
Это моя последняя попытка (я так думаю, лол!) 😀
источник
<s> ... </s>
.Common Lisp, 634 байта
Подробный
Проверь это
Части представляют собой круговые списки номеров. Каждый из этих подсписков представляет одну из сторон фигуры, а числа указывают, как далеко они находятся от противоположной стороны. Они слева направо, когда эта сторона находится снизу, справа налево, когда сверху, сверху вниз, когда слева, и снизу вверх, когда справа. Эти варианты дизайна исключают необходимость написания кода для ротации. К сожалению, отсутствие кода поворота, похоже, не компенсировало длинных представлений формы или несколько сложной логики, которую я использовал для вычисления новых высот столбцов.
Вращение - неотрицательное целое число. 0 = 0 градусов, 1 = 90 градусов, 2 = 180 градусов, 4 = 270 градусов
источник
C # (интерактивный компилятор Visual C #) , 308 байт
Попробуйте онлайн!
ОК - Это было безумие ... Я представил ответ, в котором использовались заурядные техники игры в гольф. Но когда я увидел то, что подали другие, я понял, что есть лучший способ.
Каждый
(shape, rotation)
кортеж кодируется в строковый литерал C # с удаленными дубликатами. Процесс кодирования захватывает каждую из этих конфигураций в 2 байта.Самые младшие 3 бита хранят высоту и следующие 3 магазина ширину. Поскольку каждое из этих значений никогда не превышает 4, они могут быть считаны непосредственно из 3 битов без какого-либо преобразования. Вот некоторые примеры:
Далее каждый столбец хранится в 3 битах. Самым полезным для меня было хранить количество пропущенных квадратов сверху и снизу столбца.
Никогда не бывает больше 2 квадратов, пропущенных сверху или снизу, и никогда не бывает более 1 квадрата, пропущенного в обоих одновременно. Учитывая этот набор ограничений, я придумал следующую кодировку:
Поскольку мы должны учитывать не более 3 столбцов с пропущенными квадратами выше или ниже, мы можем закодировать каждый
(shape, rotation)
кортеж в 15 бит.Наконец, дубликаты были удалены. В следующем примере показано, как несколько
(shape,rotation)
кортежей могут создавать повторяющиеся выходные данные для одной и той же фигуры при разных поворотах:Все уникальные выходные данные определены и сохранены в
byte[]
и преобразованы в строковый литерал C #. Для быстрого поиска, на котором основана форма,I
иR
первые 7 байтов массива состоят из закодированного ключа поиска.Ниже приведена ссылка на программу, которую я использовал для сжатия фрагментов.
Попробуйте онлайн!
Меньше кода для игры в гольф и комментариев:
источник
Древесный уголь , 98 байт
Попробуйте онлайн! Ссылка на подробную версию кода. Принимает входные данные в виде массива значений [P, R, I], где I - от 0 до 6, R - от 0 o 3, а P также индексируется 0. Объяснение:
Цикл по входным частям.
Извлеките описание текущего куска и поворота. (См. ниже.)
Извлечь позицию.
Убедитесь, что есть достаточно горизонтального пространства, чтобы разместить кусок.
Убедитесь, что имеется достаточно места для вертикальной установки части.
Рассчитайте новые высоты затронутых столбцов.
Когда все фрагменты будут обработаны, выведите окончательный список высот столбцов в отдельных строках.
Сжатая строка представляет исходную строку
00001923001061443168200318613441602332034173203014614341642430137
. Здесь2
s -I
разделители, а1
s -R
разделители. Части поэтому декодируют следующим образом:Недостающие
R
значения автоматически заполняются циклически углем. Каждая цифра затем отображается в два значения, выступ и общую высоту, в соответствии со следующей таблицей:Выступ и общая высота соотносятся с высотой столбцов следующим образом: учитывая кусок, который мы хотим разместить в заданной позиции
e
, может оказаться возможным разместить кусок, даже если один из столбцов выше, чемe
. Количество свободного места определяется навесом. Новая высота столбца после размещения фигуры - это просто размещенная позиция плюс общая высота.Пример: Предположим, что мы начинаем с помещения
5
фигуры в столбец 1. Поскольку больше ничего нет, поэтому фигура размещается в позиции 0, а столбцы 1 и 3 теперь имеют высоту 1, а столбец 2 - высоту 2. Затем мы хотим разместить6
фигуру. с1
вращением в столбце 0. Здесь мы можем фактически поместить этот кусок в позицию 0; хотя столбец 1 имеет высоту 1, кусок имеет выступ 1, и поэтому для его размещения достаточно места. Столбец 0 заканчивается с высотой 2, а столбец 1 заканчивается с высотой 3.источник