Диэдральная группа является группой симметрии квадрата, то есть движениями, которые преобразуют квадрат в себя посредством поворотов и отражений. Он состоит из 8 элементов: повороты на 0, 90, 180 и 270 градусов и отражения по горизонтальной, вертикальной и двум диагональным осям.
Изображения все с этой прекрасной страницы Ларри Риддла.
Задача состоит в том, чтобы составить эти ходы: с учетом двух ходов выведите ход, который эквивалентен выполнению их один за другим. Например, ход 7, за которым следует ход 4, аналогичен ходу 5.
Обратите внимание, что переключение ордера на ход 4, а затем ход 7 производит вместо этого ход 6.
Результаты приведены в таблице ниже; это таблица Кэли группы . Так, например, входы должны давать выход .
Вызов
Ваша цель состоит в том, чтобы реализовать эту операцию как можно меньшим числом байтов, но в дополнение к коду вы также выбираете метки , представляющие ходы с 1 по 8. Метки должны состоять из 8 различных чисел от 0 до 255. или из 8 -байтовые символы, которые представляют их кодовые точки.
Ваш код получит две метки из 8 выбранных вами, и должен вывести метку, соответствующую их составу, в диэдральной группе .
пример
Допустим, вы выбрали символы C, O, M, P, U, T, E, R для ходов с 1 по 8 соответственно. Затем ваш код должен реализовать эту таблицу.
Учитывая входы E и P, вы должны вывести U. В качестве входных данных всегда будут две буквы C, O, M, P, U, T, E, R, а выходные данные всегда должны быть одной из этих букв.
Текстовая таблица для копирования
1 2 3 4 5 6 7 8
2 3 4 1 8 7 5 6
3 4 1 2 6 5 8 7
4 1 2 3 7 8 6 5
5 7 6 8 1 3 2 4
6 8 5 7 3 1 4 2
7 6 8 5 4 2 1 3
8 5 7 6 2 4 3 1
Your choice of labels doesn't count against your code length.
возражаете? В настоящее время я могу жестко закодировать матрицу в свой код и утверждать, что она не засчитывается в мой счет.Ответы:
Рубин , 18 байт
Ungolfed
Попробуйте онлайн!
Использует следующие номера кодирования от 0 до 7
Для того, чтобы родной код:
В порядке по вопросу
объяснение
/
представляет переворот в линииy=x
и|
представляет переворот по оси Y.Можно сгенерировать любую из симметрий группы D4, попеременно переворачивая эти две строки. Например,
/
после следует|
задание,/|
которое представляет собой поворот на 90 градусов против часовой стрелки.Общее количество последовательных переворотов дает очень удобное представление для арифметических манипуляций.
Если первый ход - это вращение, мы можем просто добавить количество сальто:
Если первый ход - это отражение, мы обнаруживаем, что у нас есть несколько одинаковых отражений
/
и|
символов рядом друг с другом. Поскольку отражение самообращено, мы можем отменить эти броски один за другим. Таким образом, мы должны вычесть одно движение из другогоисточник
~0
с7
из - за модульной арифметики.Wolfram Language (Mathematica) , 31 байт
Используя целые числа0,5,2,7,1,3,6,4 качестве меток.
Попробуйте онлайн!
Объяснение:
Диэдральная группаD4 изоморфна унитреугольной матричной группе степени три над полем F2 :
И у нас есть
который может быть легко записан в побитовых операциях.
источник
Wolfram Language (Mathematica) , 51 байт
Попробуйте онлайн!
Использование ярлыков
{228, 57, 78, 147, 27, 177, 198, 108}
.Это
{3210, 0321, 1032, 2103, 0123, 2301, 3012, 1230}
в базе 4. К счастью, 256 = 4 ^ 4.Реализация нижнего уровня, также 51 байт
Попробуйте онлайн!
источник
Python 2 , 22 байта
Порт моего ответа Mathematica . Использование целых чисел0,6,1,7,2,3,5,4 качестве меток.
Попробуйте онлайн!
источник
Python 2 ,
262321 байтand
xnor
источник
(-1)
с7
из - за модульной арифметики для -3 байт.y+x*7**y&7
TI-BASIC, 165 байт
Вход представляет собой список длиной два дюйма
Ans
.Выход - число по
(row, column)
индексу в таблице.Может быть лучший метод сжатия, который бы экономил байты, но я должен рассмотреть это.
Примеры:
Объяснение:
(Новые строки были добавлены для удобства чтения.)
Вот 155-байтовое решение, но оно просто жестко кодирует матрицу и получает индекс.
Я нашел это более скучным, поэтому я не сделал это своим официальным представлением:
Примечание: TI-BASIC - это токенизированный язык. Количество символов не равно количеству байтов.
источник
0-7
для1-8
Желе , 6 байт
Диадическая ссылка, принимающая первое преобразование справа и второе преобразование слева, что приводит к составному преобразованию.
Где преобразования:
Попробуйте онлайн! ... Или посмотрите на таблицу, отображенную обратно на метки в вопросе .
(Аргументы могут быть взяты в другом порядке, используя 6 байтов,
_+Ḃ?%8
)Как?
Каждая метка - это длина последовательности чередования
hor
и+ve
преобразования, которая эквивалентна преобразованию (например180
, эквивалентнаhor, +ve, hor, +ve
).Композиция
A,B
эквивалентна объединению двух эквивалентных последовательностей и позволяет упростить вычитание или сложение по модулю восемь ...Используя
7, 4
пример вопроса, который мы имеем+ve, 90c
:hor, +ve, hor, +ve, hor, +ve, hor , hor, +ve, hor, +ve, hor, +ve
... но так
hor, hor
какid
у нас есть:hor, +ve, hor, +ve, hor, +ve , +ve, hor, +ve, hor, +ve
... и так
+ve, +ve
какid
мы имеем:hor, +ve, hor, +ve, hor , hor, +ve, hor, +ve
... и мы можем повторить эти отмены, чтобы: ...
hor
эквивалентно вычитанию длины (
7-6=1
).Когда отмены невозможны, мы просто добавляем длины (например,→ →
90a, 180
2+4=6
90c
).Наконец, обратите внимание, что последовательность длиной восемь такова,
id
что мы можем взять результирующую длину последовательности по модулю восемь.Он также на 1 байт короче этой реализации с использованием лексикографических индексов перестановки:
... монадическая ссылка принимает
[first, second]
, с метками:источник
JavaScript (Node.js) ,
2217 байтПопробуйте онлайн! Порт моего ответа на Cayley Table группы DihedralD3 но проиграл, используя предложения моего ответа на Python. Использует следующее отображение:
Старые версии JavaScript могут поддерживаться различными способами для 22 байтов:
источник
x=>y=>(y&1?y-x:y+x)&7
затем вызовите вашу функцию, используяf(x)(y)
.Ржавчина , 16 байт
Попробуйте онлайн!
Порт алефальского Python ответа. Но короче.
источник
Вяз ,
42 байта19 байтовПорт Нейла Node.js версия
Попробуйте онлайн
Предыдущая версия:
источник
f x
заключается в вызове функций, как иf(x)
в C-подобных языках. И вы не можете с этим поделать. Но это может быть действительно приятно и менее загромождено во многих сценариях, не связанных с гольфом. В Elm нет побитовых операторов (например, &), поэтомуand x y
здесь просто вызов функции.<|
вместо скобок. Спасибо за вопрос!Python,
8271 байт0-7
-11 байт благодаря только ASCII
TIO
источник
f=
могут быть удалены, так как не являются рекурсивнымиint.from_bytes
кодировкой без UTF, но ... не уверен, как это сделать на TIOScala , 161 байт
Выбор COMPUTER в качестве меток.
Попробуйте онлайн!
источник
Scala , 70 байт
Выбор 0-7 нативных целых чисел в качестве меток.
Сжатый матрицу в 32-байтовую строку ASCII, каждая пара чисел n0, n1 в 1 символ c = n0 + 8 * n1 + 49. Начиная с 49 до этого у нас нет \ в закодированной строке.
Попробуйте онлайн!
источник
C # (интерактивный компилятор Visual C #) , 17 байт
Порт альфаальфа Python ответ.
Попробуйте онлайн!
источник
Perl 6 , 19 байт
Порт Нейла Python решение .
Попробуйте онлайн!
источник
Wolfram Language (Mathematica), 7 байтов (кодировка UTF-8)
Чистая функция, принимающая два аргумента. Символ представлен здесь как
⊙
на самом деле частный Unicode-символ Mathematica F3DE (3 байта), который представляет функциюPermutationProduct
.Mathematica знает о диэдральных группах и представляет элементы различных групп в виде перестановок, написанных с помощью
Cycles
команды. Например, запустив командудает выход:
PermutationProduct
это функция, которая умножает элементы группы при написании в этой форме.Поскольку нам разрешено выбирать наши собственные метки, эта функция принимает эти метки для элементов группы; связь между этими ярлыками и ярлыками в сообщении о проблеме определяется следующим образом:
TL; DR Есть встроенный.
источник