Напишите программу или функцию, которая принимает текстовую сетку 4 × 4, состоящую из ровно 4 A
, 4 B
, 4 C
и 4 D
, например:
ACDC
BBCA
BADD
ABCD
Они ABCD
могут быть в любом порядке, но всегда будет 4 каждого. Вы можете предположить, что ввод действителен. При желании вы также можете предположить, что у него есть завершающий символ новой строки и / или что он идет одной строкой в порядке чтения, например ACDCBBCABADDABCD
. Вы также можете заменить символы ABCD
на 0123
или 1234
соответственно, если хотите (но это все).
Выведите истинное значение, если текстовая сетка имеет отражательную или вращательную симметрию. В частности:
Если есть центральная горизонтальная линия симметрии. например
BACD BACD BACD \___ bottom mirrors top BACD /
Если есть центральная вертикальная линия симметрии. например
BCCB DAAD CAAC BDDB \/___ right mirrors left
Если есть диагональная линия симметрии (в любом направлении). например
___ diagonally mirrored / ABDC BACD DCAB CDBA \___ diagonally mirrored
Если есть вращательная симметрия 90 °. например
BDAB ACCD same if rotated 90 degrees (or 180 or 270) DCCA BADB
Если есть вращательная симметрия 180 °. например
DBCA BDCA same if rotated 180 degrees ACDB ACBD
(Обратите внимание, что трансляционная симметрия здесь не играет роли.)
Выведите ложное значение, если сетка не имеет одну из симметрий, упомянутых выше. например, самый первый пример сетки.
Самый короткий код в байтах побеждает.
Ответы:
CJam, 16 байтов
Безымянный блок, который ожидает входные данные в виде списка из четырех строк в верхней части стека и оставляет
0
(ложное значение) для асимметричных входных данных и положительное целое число (истинное значение) для симметричных входных данных.Проверьте это здесь. Или запустить полный набор тестов.
объяснение
Симметрии квадрата - это элементы диэдральной группы порядка 8 (которые представляют собой всего лишь 4 поворота квадрата и те же 4 поворота некоторой отраженной версии квадрата). Невозможно создать эту группу из многократного применения одной перестановки. Но два отражения всегда дают некоторое вращение. Следовательно, вся группа может быть создана путем чередования двух отражений четыре раза. (Нам просто нужно убедиться, что два отражения дают поворот на 90 или 270 градусов, а не на 0 или 180.)
Задача спрашивает, равен ли входной квадрат какой-либо из 7 других симметрий. Таким образом, этот ответ просто генерирует их все, а затем проверяет, входит ли вход среди других.
Чтобы увидеть, как повторное применение
z
иW%
генерирует все симметрии, взгляните на эту «диаграмму»:источник
z
оно транспонировано иW%
переворачивает линии, поэтому я просто генерирую все симметрии путем их повторного применения.Pyth, 11 байт
Тестирование
При этом используется метод транспонирования и реверса Мартина, но с изюминкой. В то время как другие решения явно сгенерировали все 8 симметрий, а затем подсчитали количество появлений оригинала, эта программа использует
.u
функцию Пита ..u
Функция «Применить до повтора не найден». В этом случае мы поочередно транспонируем и обращаемся до тех пор, пока не произойдет повторение, а затем накапливаем результаты в список. Затем я удаляю последние 7 значений, так что останется значение, только если не было симметрии, и первое повторение произошло после того, как все 8 отражений и повторений были сгенерированы.Объяснение:
источник
05AB1E , 13 байтов
объяснение
Использует метод, мастерски объясненный Мартином в его ответе CJam .
Попробуйте онлайн
источник
Perl
6160 байтВключает +3 для
-p0a
Дайте входной квадрат на STDIN, печатает 0 для отсутствия симметрии, в противном случае некоторое положительное число
symmetry.pl
:источник
Дьялог АПЛ ,
371917 байт@ngn уменьшил его на 20 байтов!
Попробуй APL онлайн!
источник
⍉¨
а не⌽∘⍉¨
работает тоже.Брахилог ,
3836 байтПопробуйте онлайн!
Это ожидает список строк в качестве ввода. Это печатает либо
true.
илиfalse.
.объяснение
Основной предикат:
Предикат 1: Выход является одной из 8 симметрий входа.
источник
TSQL, 229 байт
Имейте в виду, что TSQL не имеет встроенной функции для поворота, так что это включено в код.
Golfed:
Ungolfed:
скрипка
источник
Python 2,
154146 байтПроверяет, является ли любое из необходимых преобразований эквивалентным оригиналу, используя массивы numpy. Ввод принимается как список из четырех строк.
Попробуйте онлайн
Принятие ввода в виде одной строки на один символ длиннее, с
A=array(list(input())).reshape(4,4)
.A[:,::-1]
так же, какfliplr(A)
.A[::-1]
так же, какflipud(A)
.источник
map(list,input())
вместо[list(r)for r in input()]
any
принимает выражение генератора, поэтому вы можете сохранить несколько байтов, отбросив внешнюю пару квадратных скобок.print
оператор не будет работать. Попробуйте разветвить мой онлайн-код и запустить его таким образом, чтобы увидеть.print
.Python 3, 99 байт
Функция, которая принимает через аргумент ввод списка строк и возвращает
True
илиFalse
как релевантный.Это использует тот же подход, что и ответ @ MartinEnder .
Как это работает
Попробуйте это на Ideone
источник
JavaScript (ES6), 131 байт
17 байтов могут быть удалены, если вы передадите массив из 4 строк напрямую. Я попробовал бит-тиддлинг (ввод в
"0123301223011230"
формате), но это заняло у меня 199 байт:источник