Представьте, что у нас есть некоторые polyomino и мы хотели бы однозначно идентифицировать их, однако polyominos можно вращать, поэтому слепое их хеширование не даст нам одинаковых отпечатков пальцев для части и ее поворота (в целом).
Например, если у нас есть L-тетромино
x
x
xx
мы хотели бы иметь такой же отпечаток пальца, как любой из них:
xx
x x xxx
xxx , x or x
Примечание. Мы допускаем только повороты на плоскости (т. Е. Они являются односторонними многочленами), и поэтому следующий полиомино будет другим:
x
x
xx
Вызов
Задача для этой задачи состоит в том, чтобы реализовать функцию / программу снятия отпечатков пальцев, которая принимает булеву / -значную матрицу / список списков / строку / .., кодирующую polyomino, и возвращает строку - отпечаток пальца Полимин. Отпечаток пальца должен быть одинаковым для всех возможных поворотов (в общем 4).
Ввод, вывод
- n ≥ 1 и (т. е. нет пустого polyomino)
- вы гарантировано, что настолько малы, насколько это возможно (т.е. все обрезаются, чтобы соответствовать и
- вы гарантировано, что вход
- просто подключен
- не имеет отверстий
- вывод должен быть строкой, которая является одинаковой для каждого возможного поворота polyomino
Примеры
Вот некоторые классы эквивалентности, для каждого класса отпечаток должен быть одинаковым, а для любых двух полиоминиумов из двух разных классов они должны отличаться.
Вращения L-тетромино из примера:
[[1,0],[1,0],[1,1]]
[[0,0,1],[1,1,1]]
[[1,1],[0,1],[0,1]]
[[1,1,1],[1,0,0]]
J-тетромино:
[[0,1],[0,1],[1,1]]
[[1,1,1],[0,0,1]]
[[1,1],[1,0],[1,0]]
[[1,0,0],[1,1,1]]
Блок полиомино:
[[1]]
бар:
[[1,1,1,1,1]]
[[1],[1],[1],[1],[1]]
угол:
[[1,1],[1,0]]
[[1,0],[1,1]]
[[0,1],[1,1]]
[[1,1],[0,1]]
W-пентомино:
[[1,0,0],[1,1,0],[0,1,1]]
[[0,0,1],[0,1,1],[1,1,0]]
[[1,1,0],[0,1,1],[0,0,1]]
[[0,1,1],[1,1,0],[1,0,0]]
""
(пустую строку), удовлетворял ли я всем требованиям?Ответы:
Python 2 , 48 байт
Попробуйте онлайн!
Принимает самое большое из четырех вращений с точки зрения сравнения списка. Основано на решении FlipTack .
Код использует способность Python 2 сравнивать объекты разных типов. Базовое значение
0
безвредно,max
поскольку оно меньше любого списка. Кроме того,zip
выдает список кортежей, в то время как входные данные представляют собой список списков, но кортежи больше, чем списки, поэтому входной список списков никогда не является претендентом. Вот почему мы вращаемся 5 раз, а не 4, чтобы мы вернулись к дублированной версии исходного списка. (Взятие списка кортежей также будет работать, если это допустимая форма ввода.)источник
Python 3 , 63 байта
Попробуйте онлайн!
Находит вращение с лексографическим минимумом и печатает его.
Лямбда-форма входит с тем же количеством байтов:
Попробуйте онлайн!
источник
lambda
можно добраться до 58lambda m,M=[]:exec("m=[*zip(*m[::-1])];M+=m,;"*4)or min(M)
. Работает потому чтоexec
всегда возвращаетсяNone
.M
уже заполнено ...M[-4:]
может привести к тому же количеству байтов.Желе , 5 байт
Попробуйте онлайн!
Полная программа.
Просто генерирует все возможные повороты и выбирает лексикографический минимум.
Обратите внимание, что одноэлементные списки не включаются в
[]
вывод. Это не имеет значения, поскольку единственным случаем, когда на входе будут существовать одноэлементные списки, будет вертикальная линия (включая единицу polyomino), которая совпадает с горизонтальной линией с таким же размером (где те не обернуты ). Единственный случай, когда внешнее[]
тоже не будет существовать - это единица полиомино.источник
Чисто , 136 байт
Попробуйте онлайн!
Включает в себя тестовый верификатор.
источник
К (нгн / к) , 16 байт
Попробуйте онлайн!
мин оборотов
{
}
функция с аргументомx
{+|x}
повернуть, т.е. перевернуть (|
) и переставить (+
)3{
}\
применять 3 раза, сохраняя промежуточные результаты; это возвращает список из 4 вращенийa:
назначить вa
<
вознесение (вычисление сортировки по возрастанию)*
первыйa@
индексa
с этимисточник
Japt
-g
, 6 байтПопытайся
источник
-g
флаг? Сортировка должна означать, что все начальные повороты заканчиваются одним и тем же списком, поэтому полный список должен работать как отпечаток пальца, если я что-то не пропустил.J , 16 байт
-2 байта благодаря Shaggy
Попробуйте онлайн!
J , 18 байт
Попробуйте онлайн!
Возвращает первый элемент в списке лексикографически отсортированных вращений полиомино.
Объяснение:
источник
05AB1E ,
108 байт-2 байта благодаря @Shaggy .
Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
ПРИМЕЧАНИЕ. Принятие минимума с
ß
илиW
будет неявно сглаживаться, поэтому будет выводиться0
. И сортировка с помощью{
, кажется, не работает для списка матриц, поэтому я используюΣ˜
вместо этого.источник
}
выполняется неявно, если после этого ничего не происходит.