Композиція з двогранної групи D4 зі спеціальними етикетками


14

Двухгранна група D4 - це група симетрії квадрата, тобто ходи, які перетворюють квадрат до себе за допомогою обертань та віддзеркалень. Він складається з 8 елементів: обертання на 0, 90, 180 та 270 градусів і відображення по горизонтальній, вертикальній та двох діагональних осях.

8 елементів D4, що діють на квадрат.

Зображення - це з цієї чудової сторінки Ларрі Ріддла.

Це завдання полягає у складанні цих рухів: задавши два рухи, виведіть хід, еквівалентний виконанню їх один за одним. Наприклад, робити хід 7, за яким рухається крок 4 - це те саме, що робити хід 5.

Приклад композиції

Зауважте, що перемикання наказу на переміщення 4, а потім на переміщення 7 натомість призводить до переміщення 6.

Результати наведені в таблиці нижче; це таблиця Кейлі групи D4 . Так, наприклад, входи 7,4 повинні давати вихід 5 .

12345678123456781234567823418756341265874123786557681324685731427685421385762431

Виклик

Ваша мета - реалізувати цю операцію якомога менше байтів, але крім коду, ви також вибираєте мітки, які представляють ходи від 1 до 8. На мітках має бути 8 чітких чисел від 0 до 255 , або 8 -байтові символи, які представляють їхні кодові точки.

Ваш код отримає дві мітки з обраних вами 8, і повинен вивести мітку, що відповідає їхньому складу, у двогранній групі D4 .

Приклад

Скажіть, що ви вибрали символи C, O, M, P, U, T, E, R для руху 1 по 8 відповідно. Тоді ваш код повинен реалізувати цю таблицю.

COMPUTERCOMPUTERCOMPUTEROMPCREUTMPCOTUREPCOMERTUUETRCMOPTRUEMCPOETRUPOCMRUETOPMC

Враховуючи входи 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.розум детальніше? На даний момент я можу жорстко кодувати матрицю до свого коду і стверджувати, що вона не рахується з моєю оцінкою.
— Бенджамін

2
@BenjaminUrquhart Я намагався сказати, що довжина вашого коду - це лише довжина вашого коду, і, скажімо, вибір багатозначних міток не коштує нічого зайвого. Схоже, цей рядок є більш заплутаним, що корисно, тому я його видалю.
— xnor

Відповіді:


10

Рубін , 18 байт

->a,b{a+b*~0**a&7}

Безумовно

->a,b{ (a+b*(-1)**a) % 8}  
# for operator precedence reasons, 
#-1 is represented as ~0 in the golfed version 

Спробуйте в Інтернеті!

Використовує такі кодові числа від 0 до 7

Для введення коду:

Native     Effect                    Codes per
Code                                 Question
0          rotate 0 anticlockwise    1C
1 /        flip in y=x               7E
2 /|       rotate 90 anticlockwise   2O
3 /|/      flip in x axis            5U
4 /|/|     rotate 180 anticlockwise  3M
5 /|/|/    flip in y=-x              8R
6 /|/|/|   rotate 270 anticlockwise  4P
7 /|/|/|/  flip in y axis            6T

По порядку за запитанням

Native     Effect                    Codes per
Code                                 Question
0          rotate 0 anticlockwise    1C
2 /|       rotate 90 anticlockwise   2O
4 /|/|     rotate 180 anticlockwise  3M
6 /|/|/|   rotate 270 anticlockwise  4P
3 /|/      flip in x axis            5U
7 /|/|/|/  flip in y axis            6T
1 /        flip in y=x               7E
5 /|/|/    flip in y=-x              8R

Пояснення

/являє собою переворот у лінії y=xі |являє собою переворот по осі y.

Можна згенерувати будь-якого з симетрій групи D4, по черзі гортати в цих двох лініях для прикладу з /подальшим |дає /|що поворот на 90 градусів проти годинникової стрілки.

Загальна кількість послідовних обертів дає дуже зручне зображення для арифметичних маніпуляцій.

Якщо перший хід - це обертання, ми можемо просто додати кількість переворотів:

Rotate 90 degrees   +  Rotate 180 degrees = Rotate 270 degrees
/|                     /|/|                 /|/|/|

Rotate 90 degress   +  Flip in y=x        = Flip in x axis   
/|                    /                     /|/

Якщо перший хід є відображенням, ми виявляємо, що у нас є однакові відображення /та |символи поруч. Оскільки рефлексія самооборотна, ми можемо скасувати ці перевертання по черзі. Тому нам потрібно відняти один хід від іншого

Flip in x axis     +  Flip in y=x        = Rotate 90 degrees
/|/                   /                    /|/ / (cancels to) /|

Flip in x axis     +  Rotate 90 degrees  = Flip in y=x
/|/                   /|                   /|/ /| (cancels to ) / 

1
Ви можете замінити на ~0з- 7за модульної арифметики.
— NieDzejkob

Чудовий метод і пояснення! Те, як відміняє фліп, дає зрозуміти, чому мітки додають або віднімають.
— xnor

7

Мова Вольфрама (Mathematica) , 31 байт

0,5,2,7,1,3,6,4

BitXor[##,2Mod[#,2]⌊#2/4⌋]&

Спробуйте в Інтернеті!

Пояснення:

D4F2

D4≅U(3,2):={(1ab01c001)∣a,b,c∈F2}.

And we have

(1a1b101c1001)⋅(1a2b201c2001)=(1a1+a2b1+b2+a1c201c1+c2001),

which can easily be written in bitwise operations.


A pretty derivation -- I had not known about this isomorphism.
— xnor



4

Python 2, 26 23 21 bytes

lambda x,y:y+x*7**y&7

Try it online! Port of my answer to Cayley Table of the Dihedral Group D3. Edit: Saved 3 bytes thanks to @NieDzejkob. Saved 2 bytes thanks to @xnor for suggesting the and (rather than xnor) operator. Uses the following mapping:

 id | r1 | r2 | r3 | s0 | s1 | s2 | s3 
----+----+----+----+----+----+----+----
 0  | 2  | 4  | 6  | 1  | 3  | 5  | 7  

2
You can replace (-1) with 7 because of modular arithmetic for -3 bytes.
— NieDzejkob

@NieDzejkob Thanks! Shame that alephalpha golfed his answer down from 28 to 22 bytes though...
— Neil

Nice solution! You can cut the parens by changing the operator precedence: y+x*7**y&7
— xnor

@xnor Thanks, I'm ahead of alephalpha again!
— Neil

3

TI-BASIC, 165 bytes

Ans→L₁:{.12345678,.23417865,.34126587,.41238756,.58671342,.67583124,.75862413,.86754231→L₂:For(I,1,8:10fPart(.1int(L₂(I)₁₀^(seq(X,X,1,8:List▶matr(Ans,[B]:If I=1:[B]→[A]:If I-1:augment([A],[B]→[A]:End:[A](L₁(1),L₁(2

Input is a list of length two in Ans.
Output is the number at the (row, column) index in the table.

There could be a better compression method which would save bytes, but I'll have to look into that.

Examples:

{1,2
           {1 2}
prgmCDGF1B
               2
{7,4
           {7 4}
prgmCDGF1B
               5

Explanation:
(Newlines have been added for readability.)

Ans→L₁                              ;store the input list into L₁
{.123456 ... →L₂                    ;store the compressed matrix into L₂
                                    ; (line shortened for brevity)
For(I,1,8                           ;loop 8 times
10fPart(.1int(L₂(I)₁₀^(seq(X,X,1,8  ;decompress the "I"-th column of the matrix
List▶matr(Ans,[B]                   ;convert the resulting list into a matrix column and
                                    ; then store it into the "[B]" matrix variable
If I=1                              ;if the loop has just started...
[B]→[A]                             ;then store this column into "[A]", another matrix
                                    ; variable
If I-1                              ;otherwise...
augment([A],[B]→[A]                 ;append this column onto "[A]"
End
[A](L₁(1),L₁(2                      ;get the index and keep it in "Ans"
                                    ;implicit print of "Ans"

Here's a 155 byte solution, but it just hardcodes the matrix and gets the index.
I found it to be more boring, so I didn't make it my official submission:

Ans→L₁:[[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:Ans(L₁(1),L₁(2

Note: TI-BASIC is a tokenized language. Character count does not equal byte count.


Couldn't you shave like one byte by using 0-7 to 1-8
— ASCII-only

I could, but then I'd have to use two more to add one to each of the matrix's elements. Good thought, however!
— Tau

wrong, you can use any set of characters lol, so you don't havev to use two more
— ASCII-only

that may be true, but TI-BASIC's matrices are 1-indexed. this submission relies on that to get the wanted value (if that's what you're implying. correct me if i'm wrong)
— Tau

ah, forgot about that
— ASCII-only

3

Jelly, 6 bytes

N⁹¡+%8

A dyadic Link accepting the first transform on the right and the second transform on the left which yields the composite transform.

Where the transforms are:

as in question:  1    2    3    4    5    6    7    8
transformation: id  90a  180  90c  hor  ver  +ve  -ve
  code's label:  0    2    4    6    1    5    7    3

Try it online! ...Or see the table mapped back onto the labels in the question.

(The arguments could be taken in the other order using the 6 byter, _+Ḃ?%8)

How?

Each label is the length of a sequence of alternating hor and +ve transforms which is equivalent to the transform (e.g. 180 is equivalent to hor, +ve, hor, +ve).

The composition A,B is equivalent to the concatenation of the two equivalent sequences, and allows simplification to subtraction or addition modulo eight...

Використовуючи 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таким чином, ми можемо взяти отриману довжину послідовності за модулем вісім.

N⁹¡+%8 - Link: B, A
  ¡    - repeat (applied to chain's left argument, B)...
 ⁹     - ...times: chain's right argument, A
N      - ...action: negate  ...i.e. B if A is even, otherwise -B
   +   - add (A)
    %8 - modulo eight

Це також на 1 байт коротше, ніж ця реалізація, використовуючи лексикографічні індекси перестановки:

œ?@ƒ4Œ¿

... однонадійне Посилання, що приймає [first, second], з мітками:

as in question:  1    2    3    4    5    6    7    8
transformation: id  90a  180  90c  hor  ver  +ve  -ve
  code's label:  1   10   17   19   24    8   15    6

3

JavaScript (Node.js) , 22 17 байт

(x,y)=>y+x*7**y&7

Спробуйте в Інтернеті! Порт моєї відповіді на Кейлі Таблиця Діеградної групиD3але гольф вниз, використовуючи пропозиції на мою відповідь Python. Використовується таке відображення:

 id | r1 | r2 | r3 | s0 | s1 | s2 | s3 
----+----+----+----+----+----+----+----
 0  | 2  | 4  | 6  | 1  | 3  | 5  | 7  

Старіші версії JavaScript можуть підтримуватися різними способами для 22-х байт:

(x,y)=>(y&1?y-x:y+x)&7
(x,y)=>y-x*(y&1||-1)&7
(x,y)=>y+x*(y<<31|1)&7

Невелике вдосконалення - збережіть байт за допомогою введення даних, x=>y=>(y&1?y-x:y+x)&7а потім зателефонуйте за допомогою функції f(x)(y).
— Dana


2

В'яз , 42 байти 19 байт

\a b->and 7<|b+a*7^b

Порт версії Nile.js Ніла

Спробуйте в Інтернеті

Попередня версія:

\a b->and 7<|if and 1 a>0 then a-b else a+b

1
Приємна перша відповідь! Я не знаю, як програмувати в Elm, але чи можна видаляти пробіли?
— MilkyWay90

@ MilkyWay90 ні, це одна з головних відмінностей мов на основі ML f x- це виклик функції, як і те, що f(x)означає на мовах, подібних С. І ти не можеш допомогти. Але це може бути дуже приємно і менш захаращено у багатьох сценаріях, що не стосуються гольфу. У Elm немає побітових операторів (як &), тому and x yтут просто звичайний виклик функції.
— Євгеній Малютін

Бачу, дякую за пояснення!
— MilkyWay90

@ MilkyWay90 насправді мені вдалося вирізати один пробіл (і байт), використовуючи трубопровідник <|замість дужок. Дякуємо, що допитали це!
— Євгеній Малютін

Ласкаво просимо! Якщо ви зацікавлені у прийнятті нового рішення, ви можете попросити про допомогу у дев'ятнадцятому байті (нашій чаті для SE). Якщо ви створюєте виклик кодування, ви можете опублікувати його в «Пісочниці» (на мета) і щодня публікувати посилання на запитання на дев'ятнадцятому байті.
— MilkyWay90

1

Пітон, 82 71 байт

0-7

-11 байт завдяки лише ASCII

lambda a,b:int("27pwpxvfcobhkyqu1wrun3nu1fih0x8svriq0",36)>>3*(a*8+b)&7

ТІО



також 76 та -2, оскільки f=їх можна видалити, оскільки це не рекурсивно
— лише ASCII

чекати зриву, це не працює
— лише ASCII


здається, ви могли б краще зробити з int.from_bytesкодуванням без UTF, але ... не впевнені, як це зробити на TIO
— тільки для ASCII

0

Scala , 161 байт

Вибір КОМП'ЮТЕРА як етикетки.

val m="0123456712307645230154763012675446570213574620316574310274651320"
val s="COMPUTER"
val l=s.zipWithIndex.toMap
def f(a: Char, b: Char)=s(m(l(a)*8+l(b))-48)

Спробуйте в Інтернеті!


1
це код гольфу: | ви повинні зробити це якомога коротше
— лише ASCII


Так, я кинув виклик собі перейти зі скалою та справжніми лейблами, а не лише рідними 0-7. Спробуйте його обіграти.
— Петро



0

Scala , 70 байт

Вибір 0-7 власних цілих чисел як міток.

Стиснув матрицю в 32-байтний рядок ASCII, кожна пара чисел n0, n1 в 1 символ c = n0 + 8 * n1 + 49. Починаючи з 49 до того, що у кодованому рядку у нас немає \

(a:Int,b:Int)=>"9K]oB4h]K9Vh4BoVenAJne3<_X<AX_J3"(a*4+b/2)-49>>b%2*3&7

Спробуйте в Інтернеті!




-3

Мова Вольфрама (Mathematica), 7 байт (кодування UTF-8)

#⊙#2&

Чиста функція, яка бере два аргументи. Символ, що ⊙подається тут, як насправді приватний символ Unicode Fethde Mathematica (3 байти), який представляє функціюPermutationProduct .

Mathematica знає про двогранні групи, і вона представляє елементи різних груп як перестановки, написані за допомогою Cyclesкоманди. Наприклад, запуск команди

GroupElements[DihedralGroup[4]]

дає вихід:

{Cycles[{}], Cycles[{{2, 4}}], Cycles[{{1, 2}, {3, 4}}], 
 Cycles[{{1, 2, 3, 4}}], Cycles[{{1, 3}}], Cycles[{{1, 3}, {2, 4}}], 
 Cycles[{{1, 4, 3, 2}}], Cycles[{{1, 4}, {2, 3}}]}

PermutationProduct це функція, що примножує групові елементи, коли пишеться у цій формі.

Оскільки нам дозволяється вибирати власні мітки, ця функція передбачає ці мітки для елементів групи; асоціація між цими мітками та тими, що знаходяться в проблемному дописі, задається:

Cycles[{}] -> 1
Cycles[{{1, 2, 3, 4}}] -> 2
Cycles[{{1, 3}, {2, 4}}] -> 3
Cycles[{{1, 4, 3, 2}}] -> 4
Cycles[{{2, 4}}] -> 5
Cycles[{{1, 3}}] -> 6
Cycles[{{1, 2}, {3, 4}}] -> 7
Cycles[{{1, 4}, {2, 3}}] -> 8

tl; dr Там є вбудований.


8
Мітки повинні бути числами від 0 до 255 або одиничними байтами.
— xnor

Досить справедливо (я радий виявив цю функцію незалежно). Чи можете ви уточнити це в ОП? Зараз він читається як "вибрати власні мітки" (наголошено), а потім пара можливих варіантів ("ви можете ...").
— Грег Мартін

1
О, я бачу, як ти це читаєш; вибачте за те, що ви тут незрозумілі та ведете вас неправильним шляхом. Дозвольте спробувати переробити це.
— xnor
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.