맞춤 라벨이 포함 된이면 체 그룹 D4 구성


14

2 면체 그룹 는 사각형 의 대칭 그룹 , 즉 회전과 반사를 통해 사각형을 자체로 변환하는 동작입니다. 0, 90, 180, 270도 회전, 가로, 세로 및 두 개의 대각선 축에 걸친 반사로 구성됩니다.D4

사각형에 작용하는 D4의 8 가지 요소.

이미지는 Larry Riddle 의이 아름다운 페이지 에 있습니다.

이 과제는 이러한 움직임을 구성하는 것입니다. 두 번의 움직임이 주어지면 하나씩 이동하는 것과 같은 움직임을 출력합니다. 예를 들어, 이동 7 다음에 이동 4를 수행하는 것은 이동 5를 수행하는 것과 같습니다.

구성 예

순서를 4로 이동 한 다음 7을 이동하면 대신 6이 이동합니다.

결과는 다음과 같습니다. 그룹 의 Cayley 테이블 입니다 . 예를 들어, 입력 는 출력 생성해야합니다 .D47,45

12345678123456781234567823418756341265874123786557681324685731427685421385762431

도전

이 작업은 가능한 한 적은 바이트로이 작업을 구현하는 것이지만 코드 외에도 1에서 8까지의 이동을 나타내는 레이블선택 해야합니다. 레이블은 0에서 255 사이의 8 개의 고유 숫자 또는 8 개의 숫자 여야합니다. 코드 포인트가 나타내는 바이트 문자

코드에는 선택한 8 개의 레이블 중 2 되며, 2 면체 그룹 의 구성에 해당하는 레이블을 출력해야합니다 .D4

1에서 8까지의 이동에 대해 문자 C, O, M, P, U, T, E, R을 선택했다고 가정 해보십시오. 그런 다음 코드에서이 테이블을 구현해야합니다.

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.정교한 마음? 그대로, 매트릭스를 코드로 하드 ​​코딩하고 점수에 맞지 않는다고 주장 할 수 있습니다.
벤자민 Urquhart

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
당신은 교체 할 수 있습니다 ~07인해 모듈러 산술의.
NieDzejkob

훌륭한 방법과 설명! 뒤집기가 취소되는 방식은 왜 레이블이 더하거나 빼는 지 분명하게 해줍니다.
xnor

7

Wolfram Language (Mathematica) , 31 바이트

정수 0,5,2,7,1,3,6,4 를 레이블로 사용합니다.

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

온라인으로 사용해보십시오!

설명:

다면체 그룹 D4 는 필드 F2 대해 3 도의 단위 삼각 행렬 그룹과 동형입니다 .

D4U(3,2):={(1ab01c001)a,b,cF2}.

그리고 우리는

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

비트 단위로 쉽게 작성할 수 있습니다.


꽤 파생 된 것입니다-저는이 동형에 대해 알지 못했습니다.
xnor



4

파이썬 2 , 26 23 21 바이트

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

andxnor

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

2
당신은 대체 할 수 (-1)와 함께 7-3 바이트 때문에 모듈러 산술의.
NieDzejkob

@NieDzejkob 감사합니다! alephalpha가 28 바이트에서 22 바이트로 자신의 답변을 골프로 부끄러운 줄 알았지 만 ...
Neil

좋은 해결책! 연산자 우선 순위를 변경하여 y+x*7**y&7
파 렌스를

@ xnor 감사합니다, 나는 다시 alephalpha를 앞서고 있습니다!
Neil

3

TI-BASIC, 165 바이트

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

입력은의 길이가 2 인 목록입니다 Ans.
출력은 (row, column)테이블 의 인덱스에 있는 숫자 입니다.

바이트를 절약 할 수있는 더 나은 압축 방법이있을 수 있지만이 부분을 살펴 봐야합니다.

예 :

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

설명 :
(가독성을 위해 줄 바꿈이 추가되었습니다.)

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"

다음은 155 바이트 솔루션이지만 매트릭스를 하드 코딩하고 인덱스를 가져옵니다.
더 지루하다는 것을 알았으므로 공식 제출물로 만들지 않았습니다.

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

참고 : TI-BASIC은 토큰 화 된 언어입니다. 문자 수는 바이트 수와 같지 않습니다 .


당신은 사용하여 한 바이트처럼 면도를 할 수 없습니다 0-71-8
ASCII 전용

나는 할 수 있지만 매트릭스 요소 각각에 하나를 추가하려면 두 개를 더 사용해야합니다. 그러나 좋은 생각!
Tau

잘못, 당신은 모든 문자 집합을 사용할 수 있습니다, 그래서 당신은 두 가지를 더 사용할 필요가 없습니다
ASCII 전용

사실 일 수도 있지만 TI-BASIC의 매트릭스는 1 인덱스입니다. 이 제출 (. 그게 내가 틀렸다면이있는 거 의미가 정정 해줘 무슨 경우) 원하는 값을 얻기 위해 그에 의존
타우

아, 잊어 버렸습니다
ASCII 전용

3

젤리 , 6 바이트

N⁹¡+%8

오른쪽의 첫 번째 변환과 왼쪽의 두 번째 변환을 허용하는 이진 링크는 복합 변환을 생성합니다.

변형이있는 곳 :

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

온라인으로 사용해보십시오! ... 또는 질문의 레이블에 다시 매핑 된 표를 참조하십시오.

(인수는 6 byter를 사용하여 다른 순서로 취할 수 있습니다. _+Ḃ?%8)

어떻게?

각 레이블은 변환 hor+ve동등한 교호 및 변환 시퀀스의 길이입니다 (예 : 180와 동일 hor, +ve, hor, +ve).

이 조성물 A,B은 2 개의 등가 서열의 연결과 동등하며, 모듈로 8을 빼거나 첨가하는 것을 단순화시킨다.

질문의 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, +veid우리는 :
hor, +ve, hor, +ve, hor , hor, +ve, hor, +ve

...과 같은 취소를 반복 할 수 있습니다 :
hor
.. 길이 빼기 ( 7-6=1)와 같습니다.

90a, 180 2+4=6 90c

마지막으로, 길이 8의 시퀀스 id는 결과 시퀀스 길이 모듈로 8을 취할 수 있습니다.

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

자바 스크립트 (Node.js) , 22 17 바이트

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

 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

Neil의 Node.js 버전 포트

온라인으로 사용해보십시오

이전 버전:

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

1
좋은 첫 답변! Elm에서 프로그래밍하는 방법을 모르지만 공백을 제거 할 수 있습니까?
MilkyWay90 1

@ MilkyWay90 nope, 그것은 C와 같은 언어에서 의미하는 f x것처럼 함수 호출 인 ML 기반 언어의 주요 차이점 중 하나입니다 f(x). 그리고 당신은 그것을 도울 수 없습니다. 그러나 많은 비 골프 시나리오에서 실제로 멋지고 덜 어수선해질 수 있습니다. Elm에는 &와 같은 비트 연산자가 없으므로 and x y일반 함수 호출입니다.
Evgeniy Malyutin

설명해 주셔서 감사합니다.
MilkyWay90

@ MilkyWay90 실제로, 나는 <|괄호 대신 파이프 연산자 를 사용하여 하나의 공간 (및 바이트)을 잘라 냈습니다 . 질문 해 주셔서 감사합니다!
Evgeniy Malyutin

천만에요! 새로운 솔루션을 만드는 데 관심이 있다면 The Nineteenth Byte (SE 채팅방)에 도움을 요청할 수 있습니다. 코딩 챌린지를 생성하는 경우이를 메타 박스의 샌드 박스에 게시하고 매일 19 번째 바이트에 대한 질문에 대한 링크를 게시 할 수 있습니다.
MilkyWay90

1

파이썬, 82 71 바이트



ASCII 전용으로 0-7 -11 바이트

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

TIO



또한 76 , -2 f=는 재귀 적이 지 않기 때문에 제거 될 수 있기 때문에
ASCII 전용

립 대기, 작동하지 않음
ASCII 전용


당신이 더 잘 할 수있는 것 같습니다 int.from_bytes... 그리고 비 UTF 인코딩,하지만 확실 TIO에 그 작업을 수행하는 방법에
ASCII 전용

0

스칼라 , 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뿐만 아니라 스칼라와 실제 레이블을 사용하려고했습니다. 이길려고합니다.
Peter



0

스칼라 , 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

Wolfram Language (Mathematica), 7 바이트 (UTF-8 인코딩)

#⊙#2&

두 가지 인수를 취하는 순수한 함수. 여기에 렌더링 된 기호 는 실제로 Mathematica의 전용 유니 코드 기호 F3DE (3 바이트)이며 이는 함수를 나타냅니다 PermutationProduct.

Mathematica는 2 면체 그룹에 대해 알고 있으며 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

충분히 공평합니다 (나는이 기능에 관계없이 기쁘게 생각합니다). OP에서 그것을 명확히 할 수 있습니까? 지금은 "자신의 레이블 선택"(강조 표시)과 같이 몇 가지 가능한 선택 ( "당신은 할 수 있습니다 ...")과 같이 읽습니다.
Greg Martin

1
오, 당신이 어떻게 읽고 있는지 봅니다; 여기가 명확하지 않아서 잘못된 길로 안내합니다. 다시 말해 보도록하겠습니다.
xnor
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.