Le groupe dièdre est le groupe de symétrie du carré, c'est-à-dire les mouvements qui transforment un carré à lui-même via des rotations et des réflexions. Il se compose de 8 éléments: des rotations de 0, 90, 180 et 270 degrés et des réflexions sur les axes horizontal, vertical et deux diagonaux.
Les images sont toutes issues de cette jolie page de Larry Riddle.
Ce défi consiste à composer ces mouvements: compte tenu de deux mouvements, sortez le mouvement qui équivaut à les faire l'un après l'autre. Par exemple, faire le coup 7 suivi du coup 4 revient au même que faire le coup 5.
Notez que changer l'ordre de déplacer 4 puis déplacer 7 produit le mouvement 6 à la place.
Les résultats sont présentés dans le tableau ci-dessous; c'est la table Cayley du groupe . Ainsi, par exemple, les entrées devraient produire la sortie .
Défi
Votre objectif est d'implémenter cette opération dans le moins d'octets possible, mais en plus du code, vous choisissez également les étiquettes qui représentent les déplacements de 1 à 8. Les étiquettes doivent être constituées de 8 nombres distincts de 0 à 255 , ou les 8 -octets représentent leurs points de code.
Votre code recevra deux des étiquettes parmi les 8 que vous avez choisies et doit sortir l'étiquette qui correspond à leur composition dans le groupe dièdre .
Exemple
Supposons que vous ayez choisi les caractères C, O, M, P, U, T, E, R pour les mouvements 1 à 8 respectivement. Ensuite, votre code doit implémenter cette table.
Étant donné les entrées E et P, vous devez sortir U. Vos entrées seront toujours deux des lettres C, O, M, P, U, T, E, R, et votre sortie devrait toujours être l'une de ces lettres.
Tableau de texte pour la copie
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.
l'esprit d'élaborer? En l'état, je peux coder en dur la matrice dans mon code et prétendre qu'elle ne compte pas dans mon score.Réponses:
Rubis , 18 octets
Non golfé
Essayez-le en ligne!
Utilise les numéros de codage suivants de 0 à 7
Dans l'ordre natif du code:
Pour la question
Explication
/
représente un retournement dans la ligney=x
et|
représente un retournement dans l'axe y.Il est possible de générer n'importe laquelle des symétries du groupe D4 en inversant alternativement ces deux lignes, par exemple
/
suivi de|
donne/|
qui est une rotation de 90 degrés dans le sens inverse des aiguilles d'une montre.Le nombre total de flips consécutifs donne une représentation très pratique pour la manipulation arithmétique.
Si le premier coup est une rotation, on peut simplement ajouter le nombre de flips:
Si le premier mouvement est une réflexion, nous constatons que nous avons des réflexions
/
et des|
symboles identiques les uns à côté des autres. La réflexion étant auto-inverse, nous pouvons annuler ces flips un par un. Nous devons donc soustraire un mouvement de l'autrela source
~0
par en7
raison de l'arithmétique modulaire.Wolfram Language (Mathematica) , 31 octets
Essayez-le en ligne!
Explication:
Et nous avons
qui peut facilement être écrit en opérations au niveau du bit.
la source
Wolfram Language (Mathematica) , 51 octets
Essayez-le en ligne!
À l'aide d'étiquettes
{228, 57, 78, 147, 27, 177, 198, 108}
.Ce sont
{3210, 0321, 1032, 2103, 0123, 2301, 3012, 1230}
en base 4. Heureusement, 256 = 4 ^ 4.Implémentation de niveau inférieur, également 51 octets
Essayez-le en ligne!
la source
Python 2 , 22 octets
Essayez-le en ligne!
la source
Python 2 ,
262321 octetsand
xnor
la source
(-1)
par en7
raison de l'arithmétique modulaire pour -3 octets.y+x*7**y&7
TI-BASIC, 165 octets
L'entrée est une liste de deux pouces de longueur
Ans
.La sortie est le nombre à l'
(row, column)
index dans le tableau.Il pourrait y avoir une meilleure méthode de compression qui permettrait d'économiser des octets, mais je vais devoir y réfléchir.
Exemples:
Explication:
(Des sauts de ligne ont été ajoutés pour plus de lisibilité.)
Voici une solution à 155 octets , mais elle code simplement la matrice et obtient l'index.
Je l'ai trouvé plus ennuyeux, donc je n'en ai pas fait ma soumission officielle:
Remarque: TI-BASIC est un langage à jetons. Le nombre de caractères n'est pas égal au nombre d'octets.
la source
0-7
to1-8
Gelée , 6 octets
Un lien dyadique acceptant la première transformation à droite et la deuxième transformation à gauche qui donne la transformation composite.
Où se trouvent les transformations:
Essayez-le en ligne! ... Ou voyez le tableau retranscrit sur les étiquettes de la question .
(Les arguments peuvent être repris dans l'autre ordre en utilisant le 6 octet,
_+Ḃ?%8
)Comment?
Chaque étiquette est la longueur d'une séquence d'alternances
hor
et de+ve
transformations qui est équivalente à la transformation (par exemple180
est équivalente àhor, +ve, hor, +ve
).La composition
A,B
est équivalente à la concaténation des deux séquences équivalentes, et permet une simplification en soustraction ou addition modulo huit ...En utilisant l'
7, 4
exemple de la question que nous avons+ve, 90c
qui est:hor, +ve, hor, +ve, hor, +ve, hor , hor, +ve, hor, +ve, hor, +ve
... mais depuis
hor, hor
est queid
nous avons:hor, +ve, hor, +ve, hor, +ve , +ve, hor, +ve, hor, +ve
... et depuis
+ve, +ve
est queid
nous avons:hor, +ve, hor, +ve, hor , hor, +ve, hor, +ve
... et nous pouvons répéter ces annulations pour:
hor
..équivalent à la soustraction des longueurs (
7-6=1
).Lorsqu'aucune annulation n'est possible, nous ajoutons simplement les longueurs (comme→ →
90a, 180
2+4=6
90c
).Enfin, notez qu'une séquence de longueur huit est
id
ainsi nous pouvons prendre la longueur de séquence résultante modulo huit.Il est également 1 octet plus court que cette implémentation utilisant des index de permutation lexicographiques:
... un lien monadique acceptant
[first, second]
, avec des étiquettes:la source
JavaScript (Node.js) ,
2217 octetsEssayez-le en ligne! Port de ma réponse à Cayley Table du groupe dièdreré3 mais j'ai joué au golf en utilisant les suggestions de ma réponse Python. Utilise le mappage suivant:
Les anciennes versions de JavaScript peuvent être prises en charge de différentes manières pour 22 octets:
la source
x=>y=>(y&1?y-x:y+x)&7
puis appelez votre fonction en utilisantf(x)(y)
.Rouille , 16 octets
Essayez-le en ligne!
Réponse de Port of alephalpha en Python. Mais plus court.
la source
Orme ,
42 octets19 octetsPort de la version Neil's Node.js
Essayez-le en ligne
La version précédente:
la source
f x
est un appel de fonction, tout comme ce que celaf(x)
signifie dans les langages de type C. Et vous ne pouvez rien y faire. Mais il peut être vraiment agréable et moins encombré dans de nombreux scénarios non golfiques. Elm n'a pas d'opérateurs au niveau du bit (comme &) doncand x y
c'est juste un simple appel de fonction ici.<|
au lieu de parenthèses. Merci d'avoir remis cela en question!Python,
8271 octets0-7
-11 octets grâce à ASCII uniquement
TIO
la source
f=
peut être supprimé car il n'est pas récursifint.from_bytes
un encodage non UTF, mais ... vous ne savez pas comment faire cela sur TIOScala , 161 octets
Choisir ORDINATEUR comme étiquettes.
Essayez-le en ligne!
la source
Scala , 70 octets
Choix de 0 à 7 entiers natifs comme étiquettes.
Compression de la matrice en chaîne ASCII de 32 octets, chaque paire de nombres n0, n1 en 1 caractère c = n0 + 8 * n1 + 49. À partir de 49, nous n'avons pas \ dans la chaîne codée.
Essayez-le en ligne!
la source
C # (Visual C # Interactive Compiler) , 17 octets
Réponse de Port of alpehalpha en Python.
Essayez-le en ligne!
la source
Perl 6 , 19 octets
Port de la solution Python de Neil .
Essayez-le en ligne!
la source
Wolfram Language (Mathematica), 7 octets (encodage UTF-8)
Une fonction pure prenant deux arguments. Le symbole rendu ici
⊙
est en fait le symbole Unicode privé F3DE de Mathematica (3 octets), qui représente la fonctionPermutationProduct
.Mathematica connaît les groupes dièdres et représente les éléments de divers groupes sous forme de permutations, écrits à l'aide de la
Cycles
commande. Par exemple, exécuter la commandedonne la sortie:
PermutationProduct
est la fonction qui multiplie les éléments de groupe lorsqu'elle est écrite sous cette forme.Puisque nous sommes autorisés à choisir nos propres étiquettes, cette fonction suppose ces étiquettes pour les éléments du groupe; L'association entre ces étiquettes et celles du poste problématique est donnée par:
tl; dr Il y a un intégré.
la source