Thành phần nhóm D4 của nhà thờ với nhãn tùy chỉnh


14

Nhóm dih thờ D4nhóm đối xứng của hình vuông, đó là các chuyển động biến đổi một hình vuông thành chính nó thông qua các phép quay và phản xạ. Nó bao gồm 8 yếu tố: xoay 0, 90, 180 và 270 độ, và phản xạ trên các trục ngang, dọc và hai trục chéo.

8 yếu tố của D4 hoạt động trên hình vuông.

Những hình ảnh là tất cả từ trang đáng yêu này của Larry Riddle.

Thử thách này là về việc sáng tác các động tác này: đưa ra hai động tác, đưa ra động thái tương đương với thực hiện lần lượt từng bước một. Chẳng hạn, thực hiện di chuyển 7 theo sau di chuyển 4 cũng giống như thực hiện di chuyển 5.

Ví dụ thành phần

Lưu ý rằng chuyển đổi thứ tự để di chuyển 4 sau đó di chuyển 7 tạo ra di chuyển 6 thay thế.

Các kết quả được lập bảng dưới đây; đây là bảng Cayley của nhóm D4 . Vì vậy, ví dụ, đầu vào 7,4 nên tạo đầu ra 5 .

12345678123456781234567823418756341265874123786557681324685731427685421385762431

Thử thách

Mục tiêu của bạn là triển khai thao tác này theo càng ít byte càng tốt, nhưng ngoài mã, bạn cũng chọn các nhãn đại diện cho các bước 1 đến 8. Các nhãn phải có 8 số riêng biệt từ 0 đến 255 hoặc 8 số ký tự -byte điểm mã của họ đại diện.

Mã của bạn sẽ được cung cấp hai trong số các nhãn trong số 8 nhãn bạn đã chọn và phải xuất nhãn tương ứng với thành phần của chúng trong nhóm dih thờ D4 .

Thí dụ

Giả sử bạn đã chọn các ký tự C, O, M, P, U, T, E, R cho các lần di chuyển từ 1 đến 8. Sau đó, mã của bạn nên thực hiện bảng này.

COMPUTERCOMPUTERCOMPUTEROMPCREUTMPCOTUREPCOMERTUUETRCMOPTRUEMCPOETRUPOCMRUETOPMC

Cho đầu vào E và P, bạn nên xuất U. Đầu vào của bạn sẽ luôn là hai trong số các chữ cái C, O, M, P, U, T, E, R và đầu ra của bạn phải luôn là một trong những chữ cái này.

Bảng văn bản để sao chép

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.Tâm xây dựng? Khi nó đứng, tôi có thể mã hóa ma trận vào mã của mình và tuyên bố nó không được tính vào điểm số của tôi.
Benjamin Urquhart

2
@BenjaminUrquhart Tôi đã cố gắng nói độ dài mã của bạn chỉ là độ dài mã của bạn và nói rằng, chọn nhãn nhiều chữ số không tốn thêm bất kỳ chi phí nào. Có vẻ như dòng đó khó hiểu hơn là hữu ích, vì vậy tôi sẽ xóa nó.
xnor

Câu trả lời:


10

Ruby , 18 byte

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

Ung dung

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

Hãy thử trực tuyến!

Sử dụng các số mã sau 0 đến 7

Theo thứ tự nguồn gốc của mã:

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

Theo thứ tự mỗi câu hỏi

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

Giải trình

/đại diện cho một lật trong dòng y=x|đại diện cho một lật trong trục y.

Có thể tạo bất kỳ đối xứng nào của nhóm D4 bằng cách lật xen kẽ trong hai dòng này Ví dụ / tiếp theo là |đưa ra /|một góc quay 90 độ ngược chiều kim đồng hồ.

Tổng số lần lật liên tiếp cung cấp một biểu diễn rất thuận tiện cho thao tác số học.

Nếu di chuyển đầu tiên là một vòng quay, chúng ta chỉ cần thêm số lần lật:

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

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

Nếu di chuyển đầu tiên là một sự phản chiếu, chúng ta thấy chúng ta có một số phản xạ /|biểu tượng giống hệt nhau cạnh nhau. Vì sự phản chiếu là tự nghịch đảo, chúng ta có thể loại bỏ từng cái một. Vì vậy, chúng ta cần phải trừ đi một động thái khác

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
Bạn có thể thay thế ~0bằng 7vì số học mô-đun.
NieDzejkob

Phương pháp tuyệt vời và giải thích! Cách các lần hủy bỏ làm cho nó thực sự rõ ràng tại sao các nhãn thêm hoặc bớt.
xnor

7

Ngôn ngữ Wolfram (Mathicala) , 31 byte

Sử dụng các số nguyên 0,5,2,7,1,3,6,4 làm nhãn.

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

Hãy thử trực tuyến!

Giải trình:

Nhóm Dih thờ D4 là đẳng cấu với nhóm ma trận đơn vị bậc ba trên trườngF2 :

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

Và chúng ta có

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

có thể dễ dàng được viết trong các hoạt động bitwise.


Một dẫn xuất khá - tôi đã không biết về sự đồng hình này.
xnor



4

Python 2 , 26 23 21 byte

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

D3andxnor

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

2
Bạn có thể thay thế (-1)bằng 7vì số học mô-đun cho -3 byte.
NieDzejkob

@NieDzejkob Cảm ơn! Thật xấu hổ khi alephalpha đánh golf câu trả lời của mình xuống từ 28 đến 22 byte mặc dù ...
Neil

Giải pháp tốt đẹp! Bạn có thể cắt các parens bằng cách thay đổi quyền ưu tiên của toán tử:y+x*7**y&7
xnor

@xnor Cảm ơn, tôi đi trước alephalpha một lần nữa!
Neil

3

TI-BASIC, 165 byte

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

Đầu vào là một danh sách có độ dài hai trong Ans.
Đầu ra là số tại(row, column) chỉ mục trong bảng.

Có thể có một phương pháp nén tốt hơn sẽ tiết kiệm byte, nhưng tôi sẽ phải xem xét điều đó.

Ví dụ:

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

Giải thích:
(Dòng mới đã được thêm vào để dễ đọc.)

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"

Đây là một giải pháp 155 byte , nhưng nó chỉ mã hóa ma trận và lấy chỉ mục.
Tôi thấy nó nhàm chán hơn, vì vậy tôi đã không biến nó thành bài dự thi chính thức của mình:

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

Lưu ý: TI-BASIC là ngôn ngữ được mã hóa. Số lượng ký tự không bằng số byte.


Bạn không thể cạo như một byte bằng cách sử dụng 0-7để1-8
ASCII chỉ

Tôi có thể, nhưng sau đó tôi phải sử dụng hai cái nữa để thêm một cho mỗi phần tử của ma trận. Suy nghĩ tốt, tuy nhiên!
Tàu

sai, bạn có thể sử dụng bất kỳ bộ ký tự nào lol, vì vậy bạn không phải sử dụng thêm hai
ký tự

điều đó có thể đúng, nhưng ma trận của TI-BASIC là 1 chỉ mục. đệ trình này dựa vào đó để có được giá trị mong muốn (nếu đó là điều bạn đang ám chỉ. hãy sửa tôi nếu tôi sai)
Tau

à, quên mất điều đó
ASCII - chỉ

3

Thạch , 6 byte

N⁹¡+%8

Một liên kết dyadic chấp nhận biến đổi đầu tiên ở bên phải và biến đổi thứ hai ở bên trái tạo ra biến đổi tổng hợp.

Trường hợp các biến đổi là:

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

Hãy thử trực tuyến! ... Hoặc xem bảng được ánh xạ trở lại vào nhãn trong câu hỏi .

(Các đối số có thể được thực hiện theo thứ tự khác bằng cách sử dụng 6 byter, _+Ḃ?%8 )

Làm sao?

Mỗi nhãn là độ dài của một chuỗi xen kẽ hor+vebiến đổi tương đương với biến đổi (ví dụ: 180tương đương vớihor, +ve, hor, +ve ).

Thành phần A,B này tương đương với phép nối của hai chuỗi tương đương và cho phép đơn giản hóa phép trừ hoặc cộng tám ...

Sử dụng 7, 4ví dụ của câu hỏi, chúng tôi có +ve, 90c:
hor, +ve, hor, +ve, hor, +ve, hor , hor, +ve, hor, +ve, hor, +ve

...nhưng kể từ khi hor, horidchúng ta có:
hor, +ve, hor, +ve, hor, +ve , +ve, hor, +ve, hor, +ve

...và kể từ khi +ve, +veidchúng ta có:
hor, +ve, hor, +ve, hor , hor, +ve, hor, +ve

... và chúng ta có thể lặp lại những lần hủy này để:
hor
tương đương với phép trừ độ dài ( 7-6=1).

90a, 180 2+4=6 90c ).

Cuối cùng, lưu ý rằng một chuỗi có độ dài tám là id để chúng ta có thể lấy chiều dài chuỗi tám kết quả.

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

Nó cũng ngắn hơn 1 byte so với triển khai này bằng cách sử dụng các chỉ mục hoán vị từ vựng:

œ?@ƒ4Œ¿

... chấp nhận một liên kết đơn [first, second], với nhãn:

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 byte

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

Hãy thử trực tuyến! Cổng câu trả lời của tôi cho Bảng Cayley của Nhóm Dih thờD3nhưng đánh gôn bằng cách sử dụng các gợi ý về câu trả lời Python của tôi. Sử dụng ánh xạ sau:

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

Các phiên bản cũ hơn của JavaScript có thể được hỗ trợ theo một số cách cho 22 byte:

(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

Cải thiện nhỏ - lưu một byte bằng cách cuộn đầu vào x=>y=>(y&1?y-x:y+x)&7sau đó gọi hàm của bạn bằng cách sử dụng f(x)(y).
dana


2

Elm , 42 byte 19 byte

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

Cổng của phiên bản Node.js của Neil

Dùng thử trực tuyến

Phiên bản trước:

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

1
Câu trả lời đầu tiên tốt đẹp! Tôi không biết cách lập trình trong Elm, nhưng có thể xóa dấu cách không?
MilkyWay90

@ MilkyWay90 không, đó là một trong những khác biệt chính của các ngôn ngữ dựa trên ML f xlà cách gọi hàm, giống như những gì f(x)có nghĩa trong các ngôn ngữ giống như C. Và bạn không thể giúp nó. Nhưng nó có thể thực sự tốt đẹp và ít lộn xộn trong nhiều tình huống không phải là golf. Elm không có toán tử bitwise (như &) nên and x ychỉ là một hàm gọi đơn giản ở đây.
Evgeniy Malyutin

Tôi hiểu rồi, cảm ơn vì đã giải thích!
MilkyWay90

@ MilkyWay90 thực sự, tôi đã quản lý để cắt bỏ một khoảng trắng (và một byte) bằng cách sử dụng toán tử đường ống <|thay vì dấu ngoặc đơn. Cảm ơn bạn đã đặt câu hỏi đó!
Evgeniy Malyutin

Không có gì! Nếu bạn quan tâm đến việc đưa ra một giải pháp mới, bạn có thể hỏi qua The Nineteenth Byte (phòng chat SE của chúng tôi) để được giúp đỡ. Nếu bạn đang tạo một thử thách mã hóa, bạn có thể đăng nó lên The Sandbox (trên meta) và đăng liên kết đến câu hỏi trên The Nineteenth Byte mỗi ngày.
MilkyWay90

1

Python, 82 71 byte

0-7

-11 byte chỉ nhờ ASCII

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

TIO



cũng 76 và -2 vì f=có thể được xóa vì nó không được đệ quy
ASCII - chỉ

chờ rip, nó không hoạt động
ASCII - chỉ


có vẻ như bạn có thể làm tốt hơn với int.from_bytesmã hóa không phải UTF, nhưng ... không chắc làm thế nào để làm điều đó trên TIO
ASCII - chỉ

0

Scala , 161 byte

Chọn MÁY TÍNH làm nhãn.

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)

Hãy thử trực tuyến!


1
đây là mã golf: | bạn phải làm cho nó ngắn nhất có thể
ASCII - chỉ


Vâng, tôi đã thử thách bản thân với scala và nhãn thực sự, không chỉ bản địa 0-7. Hãy cố gắng đánh bại nó.
Peter



0

Scala , 70 byte

Chọn 0-7 số nguyên gốc làm nhãn.

Nén ma trận thành chuỗi ASCII 32 byte, mỗi cặp số n0, n1 thành 1 ký tự c = n0 + 8 * n1 + 49. Bắt đầu từ 49 đến đó chúng ta không có \ trong chuỗi được mã hóa.

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

Hãy thử trực tuyến!




-3

Ngôn ngữ Wolfram (Mathicala), 7 byte (mã hóa UTF-8)

#⊙#2&

Một hàm thuần túy lấy hai đối số. Biểu tượng được hiển thị ở đây thực sự là ký hiệu Unicode riêng của Mathicala F3DE (3 byte), đại diện cho hàm PermutationProduct.

Mathematica biết về các nhóm dih thờ và nó đại diện cho các yếu tố của các nhóm khác nhau dưới dạng hoán vị, được viết bằng Cycleslệnh. Ví dụ: chạy lệnh

GroupElements[DihedralGroup[4]]

mang lại sản lượng:

{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 là hàm nhân các phần tử nhóm khi được viết ở dạng này.

Vì chúng tôi được phép chọn nhãn riêng của mình, nên hàm này giả định các nhãn này cho các thành phần nhóm; sự phân định giữa các nhãn này và các nhãn trong bài viết vấn đề được đưa ra bởi:

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 Có một nội dung.


8
Các nhãn phải là số 0 đến 255 hoặc byte đơn.
xnor

Đủ công bằng (tôi rất vui khi phát hiện ra chức năng này bất kể). Bạn có thể làm rõ điều đó trong OP? Ngay bây giờ, nó đọc như "chọn nhãn của riêng bạn" (nhấn mạnh), sau đó một vài lựa chọn có thể ("bạn có thể ...").
Greg Martin

1
Ồ, tôi thấy cách bạn đọc nó; xin lỗi vì không rõ ràng ở đây và dẫn bạn xuống con đường sai. Hãy để tôi thử nối lại nó.
xnor
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.