Özel etiketlerle dihedral grup D4 kompozisyon


14

Dihedral grup , karenin simetri grubudur , yani bir kareyi dönüşler ve yansımalar yoluyla kendisine dönüştüren hareketlerdir. 8 elemandan oluşur: 0, 90, 180 ve 270 derecelik dönüşler ve yatay, dikey ve iki diyagonal eksen boyunca yansımalar.D4

D4'ün 8 elemanı kareye etki ediyor.

Resimler Larry Riddle'ın bu güzel sayfasından .

Bu zorluk şu hareketleri oluşturmakla ilgilidir: iki hareket verildiğinde, bunları birbiri ardına yapmaya eşdeğer olan hareketin çıktısını alın. Örneğin, hamle 7 ve ardından hamle 4 yapmak hamle 5 ile aynıdır.

Kompozisyon örneği

Sırayı 4'e ve sonra 7'ye taşımak için sıralamanın değiştirilmesinin, bunun yerine hamle 6'ya neden olduğunu unutmayın.

Sonuçlar aşağıda sıralanmıştır; bu grubunun Cayley tablosu . Örneğin, girişler çıktıyı üretmelidir .D47,45

12345678123456781234567823418756341265874123786557681324685731427685421385762431

Meydan okuma

Amacınız bu işlemi olabildiğince az bayt olarak uygulamaktır, ancak koda ek olarak, 1'den 8'e kadar olan hareketleri temsil eden etiketleri de seçersiniz. Etiketler 0 ile 255 arasında veya 8 adede 8 farklı sayı olmalıdır. kod noktalarının temsil ettiği bayt karakterler.

seçtiğiniz 8 etiketten ikisi verilecektir ve dihedral grubundaki bileşimlerine karşılık gelen etiketi .D4

Misal

Diyelim ki 1'den 8'e kadar hamleler için C, O, M, P, U, T, E, R karakterlerini seçtiniz. Ardından, kodunuz bu tabloyu uygulamalıdır.

COMPUTERCOMPUTERCOMPUTEROMPCREUTMPCOTUREPCOMERTUUETRCMOPTRUEMCPOETRUPOCMRUETOPMC

E ve P girişleri verildiğinde, U çıktısını almalısınız. Girişleriniz her zaman C, O, M, P, U, T, E, R harflerinden ikisidir ve çıktılarınız her zaman bu harflerden biri olmalıdır.

Kopyalama için metin tablosu

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.zihin detaylandırıyor mu? Durduğunda, matrisi koduma sabitleyebilir ve puanımla sayılmadığını iddia edebilirim.
Benjamin Urquhart

2
@BenjaminUrquhart Kodunuzun uzunluğunun sadece kodunuzun uzunluğunu olduğunu söylemeye çalışıyordum ve çok haneli etiketler seçmenin ekstra bir maliyeti olmadığını söyleyebilirim. Görünüşe göre bu çizgi daha da kafa karıştırıcı, bu yüzden kaldıracağım.
xnor

Yanıtlar:


10

Ruby , 18 bayt

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

Ungolfed

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

Çevrimiçi deneyin!

Aşağıdaki kodlama numaralarını 0 ila 7 kullanır

Koda özgü yerel olarak:

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

Soru başına sırayla

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

açıklama

/doğrultusunda bir flip temsil y=xve |y ekseni bir kapağı ifade etmektedir.

Bu iki çizgide dönüşümlü olarak ters çevirerek D4 grubunun simetrilerinden herhangi birini üretmek mümkündür. Örneğin /bunu saat yönünün tersine 90 derecelik bir dönüş olan |verir /|.

Toplam ardışık döndürme sayısı aritmetik manipülasyon için çok uygun bir gösterim sağlar.

İlk hareket bir döndürme ise, döndürme sayısını ekleyebiliriz:

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

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

İlk hamle bir yansıma ise, yan yana bazı özdeş yansımalarımız /ve |sembollerimiz var. Yansıtma kendinden ters olduğu için bu çevirmeleri tek tek iptal edebiliriz. Bu yüzden bir hamleyi diğerinden çıkarmamız gerekiyor

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
Modüler aritmetik nedeniyle ~0ile değiştirebilirsiniz 7.
NieDzejkob

Harika yöntem ve açıklama! Çevirmelerin iptal etme şekli, etiketlerin neden toplama veya çıkarma işlemlerini gerçekten netleştirdiğini gösterir.
xnor

7

Wolfram Dili (Mathematica) , 31 bayt

Etiket olarak tam sayılarını kullanma .0,5,2,7,1,3,6,4

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

Çevrimiçi deneyin!

Açıklama:

Dihedral grubu D4 alanın üzerine derecesi üç unitriangular matris grubu izomorf F2 :

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

Ve bizde

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

Bitsel işlemlerle kolayca yazılabilir.


Güzel bir türetme - Bu izomorfizmi bilmiyordum.
xnor



4

Python 2 , 26 23 21 bayt

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
-3 baytlık modüler aritmetik nedeniyle (-1)ile değiştirebilirsiniz 7.
NieDzejkob

@NieDzejkob Teşekkürler! Utanç alephalpha ... 28 ila 22 bayt dan olsa aşağı onun cevabını golfed o
Neil

Güzel çözüm! Operatör önceliğini değiştirerek parensleri kesebilirsiniz:y+x*7**y&7
xnor

@xnor Teşekkürler, yine alephalpha'nın önündeyim!
Neil

3

TI-BASIC, 165 bayt

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

Girdi iki inç uzunluğunda bir listedir Ans.
Çıktı, (row, column)tablodaki dizindeki sayıdır .

Baytları kurtaracak daha iyi bir sıkıştırma yöntemi olabilir, ancak buna bakmam gerekecek.

Örnekler:

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

Açıklama:
(Okunabilirlik için yeni satırlar eklendi.)

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"

İşte 155 baytlık bir çözüm, ancak sadece matrisi kodlar ve dizini alır.
Daha sıkıcı buldum, bu yüzden resmi sunumum olmadı:

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

Not: TI-BASIC tokenize bir dildir. Karakter sayısı bayt sayısına eşit değil .


Eğer kullanarak tek byte gibi tıraş Could 0-7için1-8
ASCII okunur

Yapabilirdim, ama sonra matrisin öğelerinin her birine bir tane eklemek için iki tane daha kullanmam gerekirdi. Ancak iyi düşünülmüş!
Tau

yanlış, lol herhangi bir karakter kümesi kullanabilirsiniz, bu yüzden iki daha kullanmak zorunda kalmazsınız
sadece ASCII-sadece

bu doğru olabilir, ancak TI-BASIC matrisleri 1 indekslidir. Bu teslim istenen değeri elde etmek için dayanır (eğer bunu ima ediyorsanız. yanılıyorsam beni düzelt)
Tau

ah, unuttum
sadece ASCII-sadece

3

Jöle , 6 bayt

N⁹¡+%8

Bileşik dönüşümü sağlayan sağdaki ilk dönüşümü ve soldaki ikinci dönüşümü kabul eden ikili bağlantı.

Dönüşümler nerede:

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

Çevrimiçi deneyin! ... Ya da sorudaki etiketlerle eşlenmiş tabloya bakın.

(Argümanlar 6 byter kullanılarak diğer sırada alınabilir, _+Ḃ?%8)

Nasıl?

Her etiket, dönüşümle eşdeğer olan (örneğin , eşdeğer ) bir dönüşüm horve +vedönüşüm dizisinin uzunluğudur .180hor, +ve, hor, +ve

Kompozisyon A,B, iki eşdeğer sekansın birleştirilmesine eşdeğerdir ve çıkarma veya toplama modulo sekiz için basitleştirmeye izin verir ...

Sorunun 7, 4örneğini kullanarak +ve, 90c:
hor, +ve, hor, +ve, hor, +ve, hor , hor, +ve, hor, +ve, hor, +ve

çünkü ... ama hor, horolan idelimizdeki:
hor, +ve, hor, +ve, hor, +ve , +ve, hor, +ve, hor, +ve

çünkü ... ve +ve, +veolan idelimizdeki:
hor, +ve, hor, +ve, hor , hor, +ve, hor, +ve

... ve bu iptalleri şu şekilde tekrarlayabiliriz:
hor
.. uzunlukların çıkarılmasına eşdeğerdir ( 7-6=1).

90a, 180 2+4=6 90c

Son olarak, idsonuçta elde edilen sekans uzunluğu modülo sekizini alabilmemiz için sekiz uzunluklu bir sekans olduğuna dikkat edin .

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

Sözlüksel permütasyon indeksleri kullanılarak bu uygulamadan 1 bayt daha kısadır :

œ?@ƒ4Œ¿

... [first, second]etiketli monadic Link kabul ediyor :

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 bayt

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

D3

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

JavaScript'in eski sürümleri 22 bayt için çeşitli şekillerde desteklenebilir:

(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

Küçük iyileştirme - girişi körükleyerek bir bayt kaydedin ve x=>y=>(y&1?y-x:y+x)&7ardından işlevinizi arayın f(x)(y).
dana


2

Karaağaç , 42 bayt 19 bayt

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

Neil'ın Node.js sürümünün bağlantı noktası

Çevrimiçi deneyin

Önceki versiyon:

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

1
Güzel ilk cevap! Elm'de nasıl program yapacağımı bilmiyorum, ama boşlukları kaldırmak mümkün mü?
MilkyWay90

@ MilkyWay90 hayır, f xtıpkı f(x)C benzeri dillerde ne anlama geldiği gibi, bir işlev çağrısı olan ML tabanlı dillerin ana farklılıklarından biridir . Ve sen yardım edemezsin. Ancak, golf olmayan birçok senaryoda gerçekten güzel ve daha az dağınık olabilir. Karaağaç bitsel operatörlere sahip değildir (& gibi) and x y, burada sadece basit bir işlev çağrısıdır.
Evgeniy Malyutin

Anladım, açıkladığınız için teşekkürler!
MilkyWay90

@ MilkyWay90 aslında, <|parantez yerine boru operatörü kullanarak bir boşluk (ve bir bayt) kesmeyi başardım . Sorguladığınız için teşekkürler!
Evgeniy Malyutin

Rica ederim! Yeni bir çözüm yapmakla ilgileniyorsanız, Ondokuzuncu Bayttan (SE sohbet odamız) yardım isteyebilirsiniz. Bir kodlama zorluğu oluşturuyorsanız, bunu Sandbox'a (meta olarak) gönderebilir ve her gün Ondokuzuncu Bayt'taki sorunun bağlantısını gönderebilirsiniz.
MilkyWay90

1

Python, 82 71 bayt

0-7

-11 ASCII yalnızca sayesinde bayt

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

TIO



ayrıca 76 ve -2, çünkü f=özyinelemediği için kaldırılabilir
ASCII-yalnızca

rip bekleyin, işe yaramaz
sadece ASCII-


int.from_bytesUTF kodlamasıyla daha iyi yapabileceğiniz gibi görünüyor , ancak ... bunu TIO'da nasıl yapacağınızdan emin değilim
ASCII sadece

0

Scala , 161 bayt

BİLGİSAYAR'ı etiket olarak seçme .

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)

Çevrimiçi deneyin!


1
Bu kod golf: | Mümkün olduğunca kısa yapmalısınız
sadece ASCII-


Evet, kendimi sadece yerli 0-7 ile değil, scala ve gerçek etiketlerle gitmeye zorladım. Yenmeyi dene.
Peter



0

Scala , 70 bayt

Etiket olarak 0-7 yerel tamsayı seçimi.

Matrisi 32 bayt ASCII dizgisine sıkıştırdı, her bir sayı çifti n0, n1 1 karakterine c = n0 + 8 * n1 + 49. 49'dan başlayarak kodlanmış dizede \ yok.

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

Çevrimiçi deneyin!




-3

Wolfram Dili (Mathematica), 7 bayt (UTF-8 kodlaması)

#⊙#2&

İki argüman alan saf bir işlev. Burada gösterilen sembol aslında Mathematica'nın işlevi temsil eden özel Unicode sembolü F3DE (3 bayt) PermutationProduct.

Mathematica, dihedral grupları bilir ve Cycleskomutla yazılan çeşitli grupların elementlerini permütasyon olarak temsil eder . Örneğin, komutu çalıştırmak

GroupElements[DihedralGroup[4]]

çıktı verir:

{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 bu formda yazıldığında grup öğelerini çoğaltan işlevdir.

Kendi etiketlerimizi seçmemize izin verildiğinden, bu işlev grup etiketleri için bu etiketleri varsayar; bu etiketlerle sorunlu yerdekiler arasındaki dernek şu şekilde verilir:

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 Bir yerleşik var.


8
Etiketler 0 ila 255 arasında sayılar veya tek bayt olmalıdır.
xnor

Yeterince adil (ne olursa olsun bu işlevi keşfettiğim için mutluyum). Bunu OP'de açıklayabilir misiniz? Şu anda "kendi etiketlerinizi seçin" (vurgulanmış), ardından birkaç olası seçenek ("siz ...") şeklinde okunur.
Greg Martin

1
Oh, nasıl okuduğunu görüyorum; Burada belirsiz olduğun için ve yanlış yolda ilerlediğin için üzgünüm. Tekrar gözden geçirmeye çalışayım.
xnor
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.