introduction
Un hypercube / tesseract est l'équivalent en 4 dimensions d'un cube normal. Il est fait en prenant un filet de cube, en l'étendant à la 3e dimension, puis - en utilisant la 4e dimension - en le pliant en un hypercube. C'est fondamentalement un cube, où chaque côté est un cube.
Pour créer un hypercube, vous avez besoin de 16 vecteurs 4d (un vecteur avec un x
, un y
, un z
et un w
composant). Ces vecteurs sont les suivants:
A(0, 0, 0, 0); B(1, 0, 0, 0); C(1, 0, 1, 0); D(0, 0, 1, 0); E(0, 1, 0, 0); F(1, 1, 0, 0); G(1, 1, 1, 0); H(0, 1, 1, 0);
I(0, 0, 0, 1); J(1, 0, 0, 1); K(1, 0, 1, 1); L(0, 0, 1, 1); M(0, 1, 0, 1); N(1, 1, 0, 1); O(1, 1, 1, 1); P(0, 1, 1, 1);
L'hypercube a 24 faces. La liste suivante les contient tous (chaque groupe marque un quad):
ABFE, CDHG, BCGF, DAEH, DCBA, FEHG
IJNM, KLPO, JKON, LIMP, LKJI, PMNO
ABJI, DCKL, BCKJ, DAIL, FEMN, GHPO, FGON, EHPM, EAIM, BFNJ, CGOK, HDLP
Avec toutes ces informations, vous avez techniquement un hypercube en code. Pour faire pivoter cela, vous avez besoin de 6 matrices différentes pour chaque plan de rotation, une pour les plans YZ, XZ, XY, XW, YW et ZW. Une fois que vous avez chaque matrice, vous devez multiplier les sommets du cube avec eux.
Les images suivantes montrent la structure de chaque matrice:
Pour la rotation sur le plan YZ:
Pour la rotation sur le plan XZ:
Pour la rotation sur le plan XY:
Pour la rotation sur le plan XW:
Pour la rotation sur le plan YW:
Pour la rotation sur le plan ZW:
Les rotations sont appliquées dans cet ordre.
Après tout cela, vous avez un hypercube tourné. Maintenant, vous devez le dessiner. Vous devez utiliser une projection orthogonale combinée à une projection en perspective d'envoyer (x, y, z, w)
à (2x/(2+z), 2y/(2+z))
.
Contribution
Votre entrée est de 6 entiers compris entre 0 (inclusivement) et 360 (exclusivement). Ceux-ci représentent les rotations en degrés sur les différents plans de rotation de l'hypercube.
Sortie
Votre sortie doit être une seule image contenant l'hypercube. L'affichage peut être une image tramée, une image vectorielle ou un art ASCII. L'image de sortie doit être d'au moins 100 * 100 pixels et le cube doit occuper au moins 50% de l'écran. Tout format de sortie d'image par défaut est autorisé.
Cas de test
0 0 0 0 0 0
0 0 0 0 0 30
30 0 0 0 0 30
0 0 0 30 30 30
45 45 45 0 0 0
45 45 45 45 45 45
Ouvrez les images dans un nouvel onglet, pour les voir en taille réelle.
Règles
- Les règles par défaut s'appliquent
- Les failles standard sont interdites
- Le code le plus court en octets gagne
Réponses:
Octave,
474433429 octetsTourné:
Les matrices de rotation consomment encore beaucoup d'octets, mais le cycle eulérien a très bien fonctionné, réduisant le nombre de sommets visités de
96120 à 33.Les sommets sont générés en prenant la représentation binaire de 4 bits
[0:15]
et en considérant le msb comme la coordonnée x et le lsb la coordonnée w.Edit: La pré-multiplication de toutes les matrices de rotation était un cauchemar, c'est pourquoi je ne l'ai pas utilisé initialement, mais les pré-multiplier par paires a économisé 41 octets.
Maintenant, recherchons la combinaison optimale. :)Multiplier les matrices par trois était pire que pas de pré-multiplication du tout, donc je serai satisfait de l'approche par paire.Sortie:
la source
Postscript
1075732683640631601590545542526514478470Utilise mat.ps et G .
Edit: -343 Génération de vecteurs et circuit eulérien à codage binaire appliqué
voléemprunté à d'autres réponses. Et appliqué des chaînes de jetons binaires de la bibliothèque G.Edit: -49 Redéfini
sin
cos
etneg
à des noms plus courts.Edit: -43 Noms courts définis pour les séquences
0 0
0 1
1 0
.Edit: -9
al
(ie.aload
) Est plus court que(")@
. Factorisé 3 appels àidi
(c.- à -d.idiv
) Au prix d'un ne rien faire1 idiv
.Edit: -30 Bloc de définition implicite appliqué de G.
Edit: -10 Quelques séquences supplémentaires utilisées à trois reprises.
Edit: -45 Supprimez les variables
i
j
k
l
m
n
pour les angles et définissez toujours l'angle actuel car lest
fonctions des angles utilisent la valeur de (global)t
variable. Différez l'exécution de la description de code de la matrice de rotation jusqu'à ce que sat
valeur soit prête.Modifier: -3 Supprimer
<16>$
ie.closepath
. Et un espace.Edit: -16 crochets de matrice de facteur de sortie à partir de vecteurs unitaires dans les matrices de rotation (
J
K
L
etM
). Réappliquer abandonnémo
pourmod
etsu
poursub
.Modifier: -12 En ligne la fonction de projet et de dessin et supprimer (maintenant vide) le dictionnaire englobant.
Edit: -36 Encodé le circuit (c'est-à-dire les visages ) dans une chaîne.
Modifier: -8 Supprimer la définition du tableau de sommets
V
. Au lieu de cela, laissez sur la pile etdup
copies de travail selon les besoins (une fois, au début, et de nouveau à la fin de la boucle). De plus, quelques opérateurs de chaînes de jetons binaires ont été traduits en noms abrégés où le BTS n'a donné aucune économie, tout(I)$
comme maintenantfora
(c.-à-d.forall
).if du
pourrait être(T8)$
, maisif du
est clairement un meilleur choix (c'est le golf , pas l' obscurcissement en soi). Effectuez également lescale
précédenttranslate
, afin que les coordonnées traduites puissent être3
et4
au lieu de300
et400
.Le
3
4
et100
dans la première ligne du deuxième bloc sont des paramètres représentant respectivement centre-x, centre-y et échelle du dessin sur la page (les coordonnées centrales sont mises à l'échelle parscale
). (300 400) est à peu près le centre du papier de format lettre américain (612 792) en unités PS.Si vous pouvez à peu près suivre le post-scriptum, les choses bizarres importantes sont le bloc de procédure implicite et les chaînes d'opérateur codées. Comme le montrent les commentaires dans le fichier de travail ci-dessous, chaque ligne du premier bloc est implicitement nommée par A, B, C, etc. Ainsi, par exemple.
F E D
produirait1 0 0 1 0 0
. Pour les chaînes d'opérateur codées, tout ce qui est un argument$
#
ou@
une séquence d'appels d'opérateur, en utilisant les octets pour sélectionner des opérateurs dans la table des noms de système, PLRM 3ed Annexe F.Ces fonctionnalités et plus sont disponibles pour PostScript avec la bibliothèque G ( inclut désormais également les fonctions mat.ps).Fichier de travail:
Non golfé et légèrement commenté:
Certaines de mes sorties sont des images miroir des exemples de la question.
Pour
gs -- hc.ps 0 0 0 0 0 0
, je reçois:gs -- hc.ps 0 0 0 0 0 30
gs -- hc.ps 30 0 0 0 0 30
gs -- hc.ps 0 0 0 30 30 30
gs -- hc.ps 45 45 45 0 0 0
gs -- hc.ps 45 45 45 45 45 45
Animation bonus que je viens de faire avec ce programme. Cette image correspond à la séquence de rotation 0 30 60 0 i i , où i varie de 0 à 360 par 2.
la source
C # + Unity,
1060845835 octetsC # ≈ Java
Suppose que cette fonction se trouve dans un script placé sur
MainCamera
.Edit:
Merci à @TuukkaX pour les suggestions de sauvegarde de 19 octets enregistrés ~ 200 octets en utilisant le cycle eulérien.
Golfé:
Newlines + indentation + Full shell:
Je ne pouvais pas trouver une formule simple pour construire les matrices de rotation ni les "faces" à dessiner, ce qui coûtait beaucoup d'octets pour coder en dur.J'ai emprunté le cycle eulérien à @beaker. De plus, les modules intégrés Unity sont extrêmement verbeux.Vous pouvez vérifier tous les cas de test en ligne .
la source
0.5f
peut être réduit à.5f
et0.01f
à.01f
. Je pense également que les tableaux entiers peuvent être séparés par une virgule au lieu de direint[]
plusieurs fois.int[,]
. Encore merci.Vector4(0.5f,0.5f,0.5f,0.5f)
qui pourrait être réduit àVector4(.5f,.5f,.5f,.5f)
.Javascript ES6, 584 octets
"Non golfé":
Voyez-le en action (modifié pour tourner en continu):
La fonction renvoie un objet canvas HTML5, vous devez l'ajouter à la page en faisant
document.body.appendChild(f(0,0,0,0,0,0))
par exemple.Actuellement, les rotations sont appliquées dans le désordre, je travaille sur la réorganisation, mais en l'état, cela fait tourner un hypercube correctement.
la source
Mathematica,
453415 octets *Raccourci en utilisant la visite eulérienne et en nettoyant le tout en une seule instruction sans définir de fonctions dans les variables. Cela rend le code plus lent pour une raison quelconque. Je suppose que Mathematica réévalue les fonctions plusieurs fois maintenant qu'elles ne sont pas stockées dans une variable.
* Je compte
°
et==
comme octets simples chacun car ils sont représentés comme un seul caractère dans Mathematica. Je pense que c'est juste car de nombreuses langues utilisent des encodages de caractères étranges.Non golfé avec des commentaires. L'entrée est codée en dur en haut comme
a={30,0,0,0,0,30};
. Je n'ai pas compté cela dans mon score.0 0 0 0 0 30
0 0 0 30 30 30
405 10 -14 -8 -9 205
la source