Coordonnées de sortie des sommets d'un cube. Ensuite, affichez une liste de douze triangles qui couvriront le cube, chaque triangle étant une liste de trois index de sommet, orientés de manière cohérente. La sortie doit être une chaîne ASCII de nombres décimaux distincts. Ce golf n'a pas d'entrée. Le gagnant est le moins de caractères, où le jeu de caractères est Unicode.
Par exemple, considérons un cube 1x1x1 coincé à 0,0,0. Les huit sommets du cube peuvent être décrits par les coordonnées xyz suivantes sur une grille cartésienne 3D:
x y z = (0,0,1) (1,0,1) (1,1,1) (0,1,1) (0,0,0) (1,0,0) (1,1,0) (0,1,0)
Chaque sommet peut recevoir un index: x y z->index: 0 0 1->0, 1 0 1->1, 1 1 1->2, 0 1 1->3, 0 0 0->4, 1 0 0->5, 1 1 0->6, 0 1 0->7
Considérons maintenant la face supérieure, les sommets indexés de zéro à trois. Les deux triangles de recouvrement peuvent être décrits par trois indices chacun:
[0,1,2] [2,3,0]
Voici une photo de cette face supérieure, vue du dessus du cube:
3_____2
| /|
| / |
| / |
| / |
0_____1
Et voici une vue sous un angle.
3____2
/ __-/|
0/_`__1 |
| | /6
|____|/
4 5
Notez que l'orientation, ou `` enroulement '', de ces deux triangles est `` dans le sens inverse des aiguilles d'une montre '' lorsqu'elle est vue `` à l'extérieur '' du cube en regardant directement la face en question (imaginez visiter chaque sommet comme indiqué, il va dans le sens antihoraire). Imaginez maintenant que cela soit fait pour les six côtés du cube.
vertices: (0,0,1) (1,0,1) (1,1,1) (0,1,1) (0,0,0) (1,0,0) (1,1,0) (0,1,0)
triangles as indices: [0,1,2], [2,3,0], [6,5,4], [4,7,6],
[5,2,1], [2,5,6], [0,3,4], [4,3,7], [2,6,3], [3,6,7], [0,4,1], [1,4,5]
Vous pouvez sortir n'importe quelle taille de cube situé à n'importe quelle coordonnée. Vous pouvez numéroter et ordonner les coordonnées des sommets comme vous le souhaitez. Les indices peuvent être basés sur 0 ou basés sur 1. L'orientation du triangle peut être dans le sens horaire ou antihoraire lorsqu'il est vu de l'extérieur du cube tant qu'il est cohérent pour tous les triangles.
La sortie peut être formatée comme vous le souhaitez, tant que chaque nombre décimal ASCII est séparé par au moins un caractère ASCII non numérique. Par exemple, l'exemple ci-dessus peut également être généré comme suit:
0 0 1 1 0 1 1 1 1 0 1 1 0 0 0 1 0 0 1 1 0 0 1 0
0 1 2 2 3 0 6 5 4 4 7 6 5 2 1 2 5 6 0 3 4 4 3 7 2 6 3 3 6 7 0 4 1 1 4 5
Ce golf est inspiré par divers systèmes et formats graphiques 3D, notamment OpenGL, OBJ, OFF, AMF, CGAL, etc. Ce golf est similaire au golf de Calvin's Hobbies nommé Output a Face on a Numbered Cube , la grande différence étant que vous avez besoin pour sortir vous-même les coordonnées xyz des sommets et afficher les indices des triangles. Merci d'avoir lu.
Par inspiration utilisateur, voici un programme de validation "assistant" en python2 (non-golfy) qui affichera 'ok' ou 'not ok' pour les données de sortie de test dans les variables vertstr et idxstr. Cela ne fonctionne pas parfaitement ... mais il peut attraper des erreurs.
Edit: correction d'une faute de frappe dans l'exemple et de bugs dans le code de validation.
#vertstr = '0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1' #idxstr = '1 2 0 2 1 3 7 5 6 4 6 5 2 4 0 4 2 6 7 3 5 1 5 3 4 1 0 1 4 5 7 6 3 2 3 6' vertstr = '0 0 1 1 0 1 1 1 1 0 1 1 0 0 0 1 0 0 1 1 0 0 1 0' idxstr = '0 1 2 2 3 0 6 5 4 4 7 6 5 2 1 2 5 6 0 3 4 4 3 7 2 6 3 3 6 7 0 4 1 1 4 5' vecteur de classe: def __init __ (auto, v): self.x, self.y, self.z = v [0], v [1], v [2] def __add __ (auto, v): vecteur de retour ([self.x + vx, self.y + vy, self.z + vz]) def __sub __ (auto, v): vecteur de retour ([self.xv.x, self.yv.y, self.zv.z]) def __str __ (auto): retourne str (self.x) + ',' + str (self.y) + ',' + str (self.z) def cross (v1, v2): x = v1.y * v2.z-v2.y * v1.z z = v1.x * v2.y-v2.x * v1.y y = v1.z * v2.x-v2.z * v1.x retourner le vecteur ([x, y, z]) # http://mathforum.org/library/drmath/view/55343.html & http://sympy.org enroulement def (v1, v2, v3, obs): x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4 = v1.x, v1.y, v1.z, v2.x, v2.y, v2.z, v3. x, v3.y, v3.z, obs.x, obs.y, obs.z d = x1 * (y2 * z3 - y2 * z4 - y3 * z2 + y3 * z4 + y4 * z2 - y4 * z3) d = d + y1 * (- x2 * z3 + x2 * z4 + x3 * z2 - x3 * z4 - x4 * z2 + x4 * z3) d = d + z1 * (x2 * y3 - x2 * y4 - x3 * y2 + x3 * y4 + x4 * y2 - x4 * y3) d = d - x2 * y3 * z4 + x2 * y4 * z3 + x3 * y2 * z4 - x3 * y4 * z2 - x4 * y2 * z3 + x4 * y3 * z2 retour d normales normales (v1, v2, v3): va = v2-v1 vb = v3-v2 vc = v1-v3 n1 = croix (va, vb) n2 = croix (vb, vc) n3 = croix (vc, va) retourner [n1, n2, n3] def triplify (str): nums, triples = [], [] pour num dans str.split (''): nums + = [int (num)] pour i dans la plage (0, len (nums), 3): triples + = [[nums [i], nums [i + 1], nums [i + 2]]] retourner des triplets verts = triplify (vertstr) indices = triplifier (idxstr) nsum = vecteur ([0,0,0]) windsum = 0 xs, ys, zs = [], [], [] pour v in verts: xs + = [v [0]] ys + = [v [1]] zs + = [v [2]] #print xs, ys, zs, len (xs) center = Vector ([float (sum (xs)) / len (xs), float (sum (ys)) / len (ys), float (sum (zs)) / len (zs)]] pour le triangle dans les indices: v1 = vecteur (verts [triangle [0]]) v2 = vecteur (verts [triangle [1]]) v3 = vecteur (verts [triangle [2]]) normes = normales (v1, v2, v3) imprimer v1, v2, v3, normes [0], normes [1], normes [2] pour n dans les normes: nsum + = n w = enroulement (v1, v2, v3, centre) imprimer «enroulement», w si w <0: somme de vent- = 1 elif w> 0: somme de vent + = 1 si abs (windsum) == 12: affichez 'winding ok' sinon: imprimer «enroulement pas ok» if (nsum.x == 0 et nsum.y == 0 et nsum.z == 0): affichez 'somme normale ok' sinon: affichez 'somme normale pas ok'