Как вы, скорее всего, сейчас знаете, существует 2339 решений головоломки пентомино в сетке 6х10. Существуют разные схемы маркировки для 12 пентомино, две из них показаны на рисунке ниже:
Изображение предоставлено: Википедия
Для целей текущей задачи мы скажем, что нормализованное решение пентомино является решением, использующим вторую схему маркировки (по Конвею).
Пример:
O O O O O S S S Z Z
P P R R S S W W Z V
P P P R R W W Z Z V
U U X R T W Y V V V
U X X X T Y Y Y Y Q
U U X T T T Q Q Q Q
Кусок с 5 квадратами в ряд обозначен буквами O
, согласно схеме. То же самое верно для всех частей.
Задача:
Учитывая решение пентомино 6x10, в котором кусочки помечены случайным слоем, нормализуйте его так, чтобы все кусочки были помечены в схеме маркировки Конвея. Вы должны распознать фигуры и пометить каждый квадрат конкретной фигуры символом фигуры.
Входные данные:
Решение должно быть нормализовано, в любом удобном для вас формате, например:
Многострочная строка
Список строк
Список списков персонажей
и так далее
Выход:
То же решение (все положения и ориентация кусков сохранены), но каждый кусочек помечен в соответствии со схемой маркировки Конвея. Примечание: выходные данные ДОЛЖНЫ быть напечатаны в виде сетки символов 6x10. Передние и конечные переводы строки и пробелы разрешены. Вы также можете напечатать пробел между символами (но не пустые строки), как в примере выше.
Тестовые случаи:
1. Вход:
6623338888
6222344478
66A234BB70
1AAA94B770
11A99BB700
1199555550
Выход:
UURTTTQQQQ
URRRTVVVSQ
UUXRTVZZSY
PXXXWVZSSY
PPXWWZZSYY
PPWWOOOOOY
2. Вход:
45ookkkk00
455ooogk00
4a55gggdd0
4aaa3gnnd.
4am333ndd.
mmmm3nn...
Выход:
OWSSQQQQPP
OWWSSSRQPP
OTWWRRRUUP
OTTTXRZZUV
OTYXXXZUUV
YYYYXZZVVV
Критерии победы:
Самое короткое решение в байтах на каждом языке выигрывает. Не разочаровывайтесь языками игры в гольф. Пояснения к алгоритмам и реализациям приветствуются.
источник
Ответы:
APL (Dyalog Classic) ,
545350 байтовПопробуйте онлайн!
Вычислите инвариант для каждого пентомино на входе: измерьте (∆x, ∆y) от каждого из его квадратов до центра тяжести, возьмите abs (∆x) и abs (∆y), сложите компоненты x и отдельно y компоненты, и умножьте две суммы. Это дает 12 четких результатов. Затем найдите индекс каждого инварианта пентомино в отсортированной коллекции всех инвариантов. Заменить 0 на
'O'
, 1 на'X'
, 2 на'R'
и т. Д.источник
Желе , 37 байт
Полная программа, принимающая список строк (потому что мы должны печатать - в противном случае удаляем завершающий
Y
символ, и у вас есть монада, берущая список списков чисел или символов, который возвращает список списков символов).Попробуйте онлайн!
Как?
Я полагаю, что это работает с использованием той же классификации пентамино, что и в решении ngn APL , хотя и немного по-другому (я также не знаю APL, поэтому я не уверен, насколько похож метод за категоризацией).
(Обратите внимание, что
“æṂ⁾+’Œ?¤+78Ọ
это только один байт“XRPTZWUYSVQO”
!)источник
Wolfram Language (Mathematica) , 103 байта
Вводит в виде списка списков символов.
Попробуйте онлайн!
Основная идея здесь заключается в том, что для каждого символа на входе мы находим координаты, где он происходит, берем эксцесс и суммируем его координаты. Это дает нам инвариант для каждого куска.
(Куртоз - это какой-то в основном не относящийся к делу оператор из статистики - ключ в том, что он инвариантен при переводе, в то время как отражение и вращение могут изменить порядок координат максимум. Мы суммируем координаты, поэтому инвариант никогда не меняется.)
В любом случае, кроме странного инварианта, это решение аналогично другим: мы сортируем символы и части по каждому инварианту, а затем заменяем каждый символ соответствующим символом
"UPSWZVRTQXYO"
: частей, отсортированных по сумме эксцессов.Наконец,
""<>Riffle[...,"\n"]
это код для печати в виде сетки.источник
Sort@Variance
местоTr@Kurtosis
, и, вероятно, больше людей слышали о дисперсии. НоTr@Variance
не работает, потому что несколько пентомино (таких как P и X) имеют одинаковую сумму x-дисперсии и y-дисперсии. Поэтому я просмотрел документацию Mathematica на предмет чего-то более необычного.Python 2 , 191 байт
Попробуйте онлайн!
Принимает многострочную строку с завершающим переводом строки и выполняет шесть вложенных списков.
Безголовая версия
источник