Grupa dwuścienna jest grupą symetrii kwadratu, to znaczy ruchami, które przekształcają kwadrat w siebie poprzez obroty i odbicia. Składa się z 8 elementów: obrotu o 0, 90, 180 i 270 stopni oraz odbić w poprzek osi poziomej, pionowej i dwóch przekątnych.
Wszystkie zdjęcia pochodzą z tej uroczej strony autorstwa Larry Riddle'a.
Wyzwanie polega na skomponowaniu tych ruchów: biorąc pod uwagę dwa ruchy, wygeneruj ruch, który jest równoważny z wykonaniem ich jeden po drugim. Na przykład wykonanie ruchu 7, po którym następuje ruch 4, jest tym samym, co wykonanie ruchu 5.
Zauważ, że zmiana kolejności na ruch 4, a następnie ruch 7 powoduje ruch 6.
Wyniki zestawiono w tabeli poniżej; to jest stół Cayleya grupy . Na przykład dane wejściowe powinny dawać wynik .
Wyzwanie
Twoim celem jest wdrożenie tej operacji w jak najmniejszej liczbie bajtów, ale oprócz kodu wybierasz także etykiety reprezentujące ruchy od 1 do 8. Etykiety muszą mieć 8 różnych liczb od 0 do 255 , lub 8 -bajtowe znaki, które reprezentują ich punkty kodowe.
Twój kod otrzyma dwie etykiety z 8, które wybrałeś i musi wypisać etykietę odpowiadającą ich składowi w dwuściennej grupie .
Przykład
Powiedzmy, że wybrałeś znaki C, O, M, P, U, T, E, R odpowiednio dla ruchów od 1 do 8. Następnie kod powinien implementować tę tabelę.
Biorąc pod uwagę wejścia E i P, powinieneś wypisać U. Twoje dane wejściowe będą zawsze składały się z dwóch liter C, O, M, P, U, T, E, R, a twoja informacja wyjściowa powinna zawsze być jedną z tych liter.
Tabela tekstowa do kopiowania
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.
opracowywanie myśli? W tej chwili mogę na stałe zakodować matrycę w moim kodzie i twierdzić, że nie liczy się ona do mojego wyniku.Odpowiedzi:
Rubinowy , 18 bajtów
Nie golfił
Wypróbuj online!
Wykorzystuje następujące numery kodowe od 0 do 7
Aby natywny dla kodu:
W porządku według pytania
Wyjaśnienie
/
reprezentuje przewrót w liniiy=x
i|
reprezentuje przewrót w osi y.Jest to możliwe, w celu wytworzenia dowolnego symetrii grupy D4 naprzemian odbijania w tych dwóch liniach, na przykład
/
, a następnie|
daje/|
który jest obrót o 90 stopni w kierunku przeciwnym.Całkowita liczba kolejnych rzutów daje bardzo dogodną reprezentację do manipulacji arytmetycznych.
Jeśli pierwszym ruchem jest obrót, możemy po prostu dodać liczbę przewrotów:
Jeśli pierwszy ruch jest odbiciem, okaże się, że mamy identyczne odbicia
/
i|
symbole obok siebie. Ponieważ odbicie jest odwrotne do siebie, możemy anulować te przerzuty jeden po drugim. Musimy więc odjąć jeden ruch od drugiegoźródło
~0
z7
powodu arytmetyki modułowej.Wolfram Language (Mathematica) , 31 bajtów
Używając liczb całkowitych0 , 5 , 2 , 7 , 1 , 3 , 6 , 4 jako etykiet.
Wypróbuj online!
Wyjaśnienie:
Grupa Dihedralre4 jest izomorficzny w unitriangular grupy matrycy na trzecim stopniu polafa2) :
I mamy
które można łatwo zapisać w operacjach bitowych.
źródło
Wolfram Language (Mathematica) , 51 bajtów
Wypróbuj online!
Korzystanie z etykiet
{228, 57, 78, 147, 27, 177, 198, 108}
.Są
{3210, 0321, 1032, 2103, 0123, 2301, 3012, 1230}
w bazie 4. Na szczęście 256 = 4 ^ 4.Implementacja niższego poziomu, również 51 bajtów
Wypróbuj online!
źródło
Python 2 , 22 bajty
Wypróbuj online!
źródło
Python 2 ,
262321 bajtówWypróbuj online! Port mojej odpowiedzi dla Cayley Table of the Dihedral Groupre3) . Edycja: Zapisano 3 bajty dzięki @NieDzejkob. Zaoszczędzono 2 bajty dzięki @xnor za sugerowanie
and
(raczej niżxnor
) operatora. Wykorzystuje następujące mapowanie:źródło
(-1)
z7
powodu modułowej arytmetyki dla -3 bajtów.y+x*7**y&7
TI-BASIC, 165 bajtów
Dane wejściowe to lista długości dwóch cali
Ans
.Dane wyjściowe to liczba pod
(row, column)
indeksem w tabeli.Mogłaby istnieć lepsza metoda kompresji, która oszczędziłaby bajty, ale będę musiał to sprawdzić.
Przykłady:
Objaśnienie:
(Dla ułatwienia dodano nowe linie).
Oto 155 bajtów rozwiązanie, ale po prostu koduje matrycę i pobiera indeks.
Uważam, że jest to bardziej nudne, więc nie uczyniłem tego moim oficjalnym oświadczeniem:
Uwaga: TI-BASIC jest językiem tokenizowanym. Liczba znaków nie jest równa liczbie bajtów.
źródło
0-7
do1-8
Galaretka , 6 bajtów
Diadadic Link akceptujący pierwszą transformację po prawej stronie i drugą transformację po lewej stronie, która daje transformację złożoną.
Gdzie są transformacje:
Wypróbuj online! ... Lub zobacz tabelę odwzorowaną z powrotem na etykiety w pytaniu .
(Argumenty można przyjmować w innej kolejności przy użyciu 6 bajtów,
_+Ḃ?%8
).W jaki sposób?
Każda etykieta ma długość sekwencji na przemian
hor
i+ve
transformacji, która jest równoważna transformacji (np.180
Jest równoważna zhor, +ve, hor, +ve
).Kompozycja
A,B
jest równoważna konkatenacji dwóch równoważnych sekwencji i umożliwia uproszczenie odejmowania lub dodawania modulo osiem ...Na
7, 4
przykładzie tego pytania mamy+ve, 90c
:hor, +ve, hor, +ve, hor, +ve, hor , hor, +ve, hor, +ve, hor, +ve
... ale skoro
hor, hor
toid
mamy:hor, +ve, hor, +ve, hor, +ve , +ve, hor, +ve, hor, +ve
... a ponieważ
+ve, +ve
toid
mamy:hor, +ve, hor, +ve, hor , hor, +ve, hor, +ve
... i możemy powtórzyć te anulowania w celu: ..
hor
równoważnego do odjęcia długości (
7-6=1
).Gdy anulowanie nie jest możliwe, dodajemy tylko długości (np→ →
90a, 180
2+4=6
90c
).Na koniec zauważmy, że sekwencja długości ósemkowej
id
pozwala nam wziąć wynikową długość modulo osiem.Jest także o 1 bajt krótszy niż ta implementacja za pomocą indeksów permutacyjnych leksykograficznych:
... monadyczny link akceptujący
[first, second]
, z etykietami:źródło
JavaScript (Node.js) ,
2217 bajtówWypróbuj online! Port mojej odpowiedzi dla Cayley Table of the Dihedral Groupre3) ale grałem w golfa, korzystając z sugestii zawartych w mojej odpowiedzi w języku Python. Wykorzystuje następujące mapowanie:
Starsze wersje JavaScript mogą być obsługiwane na wiele sposobów dla 22 bajtów:
źródło
x=>y=>(y&1?y-x:y+x)&7
a następnie wywołaj funkcję za pomocąf(x)(y)
.Rdza , 16 bajtów
Wypróbuj online!
Port odpowiedzi Pythona na alephalpha. Ale krócej.
źródło
Wiąz ,
42 bajty19 bajtówWersja Neode 's Node.js
Wypróbuj online
Poprzednia wersja:
źródło
f x
jest wywołaniem funkcji, podobnie jak to, cof(x)
oznacza w językach podobnych do C. I nic na to nie poradzę. Ale może być naprawdę przyjemny i mniej zagracony w wielu scenariuszach innych niż golf. Wiąz nie ma operatorów bitowych (takich jak &), więc tutajand x y
jest tylko zwykłe wywołanie funkcji.<|
zamiast nawiasu. Dzięki za przesłuchanie!Python,
8271 bajtów0-7
-11 bajty dzięki ASCII tylko
TIO
źródło
f=
można je usunąć, ponieważ nie jest rekurencyjneint.from_bytes
kodowaniem innym niż UTF, ale ... nie jestem pewien, jak to zrobić na TIOScala , 161 bajtów
Wybór KOMPUTERA jako etykiet.
Wypróbuj online!
źródło
Scala , 70 bajtów
Wybór 0-7 natywnych liczb całkowitych jako etykiet.
Skompresowano macierz na 32-bajtowy ciąg ASCII, każda para liczb n0, n1 na 1 znak c = n0 + 8 * n1 + 49. Począwszy od 49 do tego, że nie mamy \ w zakodowanym ciągu.
Wypróbuj online!
źródło
C # (interaktywny kompilator Visual C #) , 17 bajtów
Port Alpehalpha's Python answer.
Wypróbuj online!
źródło
Perl 6 , 19 bajtów
Rozwiązanie Python dla portu Neila .
Wypróbuj online!
źródło
Wolfram Language (Mathematica), 7 bajtów (kodowanie UTF-8)
Czysta funkcja przyjmująca dwa argumenty. Symbol renderowany tutaj, tak jak w
⊙
rzeczywistości jest prywatnym symbolem Mathematica F3DE (3 bajty), który reprezentuje funkcjęPermutationProduct
.Mathematica wie o grupach dwuściennych i reprezentuje elementy różnych grup jako permutacje, napisane za pomocą
Cycles
polecenia. Na przykład uruchomienie poleceniadaje wynik:
PermutationProduct
to funkcja, która zwielokrotnia elementy grupy, gdy są zapisane w tym formularzu.Ponieważ możemy wybierać własne etykiety, ta funkcja zakłada te etykiety dla elementów grupy; przydział między tymi etykietami a etykietami w stanowisku problemowym jest określony przez:
tl; dr Jest wbudowany.
źródło