L’objectif de ce défi est de produire une animation d’un système d’ entraînement par chaîne , composé d’un ensemble de pignons reliés entre eux par une chaîne .
Exigences générales
Votre programme recevra une liste de pignons , spécifiés en (x, y, radius)
triplets. Le système d’entraînement par chaîne résultant est constitué de ces pignons, reliés entre eux par une chaîne tendue fermée passant au-dessus de chacun d’eux, dans l’ordre . Votre objectif est de produire une animation en boucle infinie , montrant le système en mouvement. Par exemple, étant donné l'entrée
(0, 0, 16), (100, 0, 16), (100, 100, 12), (50, 50, 24), (0, 100, 12)
, la sortie devrait ressembler à quelque chose comme
.
Le système de coordonnées doit être tel que l’axe des x pointe vers la droite et l’axe des y vers le haut. Vous pouvez supposer que les rayons sont des nombres pairs supérieurs ou égaux à 8 (nous verrons pourquoi cela compte plus tard.) Vous pouvez également supposer qu'il y a au moins deux pignons et que les pignons ne se croisent pas . Les unitésde l'entrée ne sont pas trop critiques. Tous les exemples et scénarios de test de cette publication utilisent des pixels comme unités d'entrée (ainsi, par exemple, le rayon du pignon central de la figure précédente est de 24 pixels;) essayez de ne pas trop vous écarter de ces unités. Dans la suite du défi, les quantités spatiales sont censées être exprimées dans les mêmes unités que l'entrée - veillez à conserver les proportions! Les dimensions de la sortie doivent être légèrement plus grandes que le cadre de sélection de tous les pignons, suffisamment grandes pour que tout le système soit visible. En particulier, les positions absolues des pignons ne devraient pas affecter la sortie; seules leurs positions relatives doivent (ainsi, par exemple, si nous décalions tous les pignons de l'exemple ci-dessus de la même quantité, la sortie resterait la même.)
La chaîne doit être tangente aux pignons sur lesquels elle passe à tous les points de contact, et directement partout ailleurs. La chaîne doit passer sur les pignons de sorte que les segments de chaîne adjacents (c'est-à-dire les parties de la chaîne situées entre deux pignons qui se rejoignent sur le même pignon) ne se croisent pas .
.
Par exemple, alors que le système de gauche ci-dessus est valide, celui du milieu ne l’est pas, car les deux segments adjacents de la chaîne qui passent au-dessus du pignon inférieur gauche se croisent. Cependant, notez que le bon système est valide, car les deux segments de la chaîne qui se croisent ne sont pas adjacents (ce système est cependant produit par une entrée différente de celle des deux autres).
Pour simplifier les choses (r), vous pouvez supposer qu’aucun pignon ne croise la coque convexe de ses deux pignons voisins, ni les coques convexes de chacun de ses voisins et de leur autre voisin. En d'autres termes, le pignon supérieur du diagramme ci-dessous ne peut croiser aucune des régions ombrées.
Les segments de chaîne peuvent croiser des pignons autres que ceux sur lesquels ils sont passés (comme dans le dernier cas de test). Dans ce cas, la chaîne doit toujours apparaître devant les pignons.
Exigences visuelles
La chaîne devrait consister en une série de maillons de largeurs alternées. La largeur du lien étroit doit être d'environ 2 et la largeur du lien large d' environ 5. La longueur des deux types de liens doit être à peu près égale. La périodede la chaîne, c'est-à-dire la longueur totale d'une paire de liens large / étroite, doit être le nombre le plus proche de 4π qui correspond à un nombre entier de fois dans la longueur de la chaîne. Par exemple, si la longueur de la chaîne est 1 000, sa période doit être de 12,5, soit le nombre le plus proche de 4π (12,566 ...) qui correspond à un nombre entier de fois (80) sur 1 000. Il est important que la période corresponde à un nombre entier de fois dans la longueur de la chaîne, de sorte qu'il n'y ait pas d'artefacts à l'endroit où la chaîne s'enroule.
Un pignon de rayon R devrait être composé de trois parties concentriques: un axe central , qui devrait être un cercle de rayon d'environ 3; le corps du pignon , autour de l'essieu, qui devrait être un cercle de rayon d'environ R - 4.5; et le bord du pignon , autour du corps, qui devrait être un cercle de rayon autour de
R - 1.5. La jante devrait également contenir les dents du pignon , qui devrait avoir une largeur d'environ 4; la taille et l'espacement des dents doivent correspondre à la taille des maillons de la chaîne, afin qu'ils s'emboîtent parfaitement.
La période des dents du pignon, c'est-à-dire la distance entre deux dents consécutives le long de la circonférence du pignon, doit correspondre à la période de la chaîne. Étant donné que la période est d'environ 4π et que le rayon du pignon est garanti, la période doit tenir dans la circonférence du pignon un nombre de fois presque entier, de sorte qu'il ne devrait pas y avoir d'artefacts visibles au point où les dents du pignon s'enroulent.
Vous pouvez utiliser n’importe quelle combinaison de couleurs pour la chaîne, les différentes parties du pignon et l’arrière-plan, dans la mesure où elles se distinguent facilement . L'arrière-plan peut être transparent. Les exemples de ce poste s’appliquent #202020
à la chaîne, #868481
à l’axe et au rebord #646361
du pignon et au corps du pignon.
Exigences d'animation
Le premier pignon de la liste d'entrée doit tourner dans le sens des aiguilles d'une montre ; le reste des pignons doit tourner en conséquence. La chaîne devrait se déplacer à une vitesse d'environ 16π (environ 50) unités par seconde; la cadence de prise de vue dépend de vous, mais l'animation doit être suffisamment fluide.
L'animation doit être bouclée de manière transparente .
Conformité
Certains attributs visuels et certaines proportions ne sont spécifiés intentionnellement que grossièrement - vous n'avez pas à les faire correspondre exactement . La sortie de votre programme ne doit pas nécessairement être une réplique, pixel par pixel, des exemples donnés ici, mais elle devrait être similaire. En particulier, les proportions exactes de la chaîne et des pignons, ainsi que la forme exacte des maillons et des dents de la chaîne, sont flexibles.
Les points les plus importants à suivre sont les suivants:
- La chaîne doit passer sur les pignons, dans l'ordre d'entrée, dans le bon sens.
- La chaîne doit être tangente aux pignons à tous les points de contact.
- Les maillons de la chaîne et les dents des pignons doivent être bien enchevêtrés, au moins jusqu’à corriger l’espacement et la phase.
- L'espacement entre les maillons de la chaîne et les dents des pignons doit être tel qu'il n'y ait pas d'artefacts remarquables à l'endroit où ils s'enroulent.
- Les pignons doivent tourner dans le bon sens.
- L'animation doit être bouclée de manière transparente.
Pour terminer, si, techniquement, l'objectif de ce défi est d'écrire le code le plus court, si vous avez envie de faire preuve de créativité et de produire un résultat plus élaboré, ne vous gênez pas!
Défi
Écrivez un programme ou une fonction en prenant une liste de pignons et en produisant une animation du système de transmission par chaîne correspondante, comme décrit ci-dessus.
Entrée et sortie
Vous pouvez utiliser l' entrée via la ligne de commande , via STDIN , sous forme d' arguments de fonction ou à l'aide d'une méthode équivalente . Vous pouvez utiliser n’importe quel format pratique pour l’entrée, mais assurez-vous de le spécifier dans votre message.
En sortie , vous pouvez afficher l'animation directement , créer un fichier d'animation ( un fichier GIF animé, par exemple) ou une séquence de fichiers image (toutefois, il existe une petite pénalité dans ce cas; voir ci-dessous.) assurez-vous que le nombre d'images est raisonnable (les exemples de cet article utilisent très peu d'images;) le nombre d'images ne doit pas nécessairement être minimal, mais vous ne devez pas produire trop d'images superflues. Si vous produisez une séquence d'images, assurez-vous de spécifier la fréquence d'images dans votre message.
But
C'est du code-golf . La réponse la plus courte , en octets, gagne.
+ 10% de pénalité Si votre programme génère une séquence d'images en sortie, au lieu d'afficher l'animation directement ou de générer un seul fichier d'animation, ajoutez 10% à votre score.
Cas de test
Test 1
(0, 0, 26), (120, 0, 26)
Test 2
(100, 100, 60), (220, 100, 14)
Test 3
(100, 100, 16), (100, 0, 24), (0, 100, 24), (0, 0, 16)
Test 4
(0, 0, 60), (44, 140, 16), (-204, 140, 16), (-160, 0, 60), (-112, 188, 12),
(-190, 300, 30), (30, 300, 30), (-48, 188, 12)
Test 5
(0, 128, 14), (46.17, 63.55, 10), (121.74, 39.55, 14), (74.71, -24.28, 10),
(75.24, -103.55, 14), (0, -78.56, 10), (-75.24, -103.55, 14), (-74.71, -24.28, 10),
(-121.74, 39.55, 14), (-46.17, 63.55, 10)
Test 6
(367, 151, 12), (210, 75, 36), (57, 286, 38), (14, 181, 32), (91, 124, 18),
(298, 366, 38), (141, 3, 52), (80, 179, 26), (313, 32, 26), (146, 280, 10),
(126, 253, 8), (220, 184, 24), (135, 332, 8), (365, 296, 50), (248, 217, 8),
(218, 392, 30)
Réponses:
JavaScript (ES6),
2557191518971681 octetsCe n'est pas vraiment dupe ! c'est minified - en partie à la main - mais ce n'est rien de spécial. Cela pourrait sans doute être plus court si je l'avais plus joué au golf avant de le faire, mais j'ai déjà passé plus de temps à ce sujet.
Edit: Ok, donc j’ai passé plus de temps dessus et j’ai joué davantage au code avant de minifier (très manuellement cette fois). Le code utilise toujours la même approche et la même structure globale, mais malgré cela, j'ai quand même fini par économiser 642 octets. Pas trop mal, si je le dis moi-même. Probablement raté quelques opportunités d’économie d’octets, mais à ce stade, je ne suis même plus sûr de savoir comment cela fonctionne. La seule chose qui diffère en termes de sortie est qu’il utilise maintenant des couleurs légèrement différentes qui pourraient être écrites de manière plus nuancée.
Edit 2 (beaucoup plus tard): 18 octets enregistrés. Merci à ConorO'Brien dans ses commentaires pour avoir souligné l'aveuglantement évident que j'avais totalement manqué.
Edit 3: J'ai donc pensé inverser mon propre code, car, franchement, je ne me souvenais plus comment je l'avais fait et j'ai perdu les versions non golfées. J'ai donc parcouru et trouvai encore 316 octets supplémentaires à économiser en restructurant et en faisant du micro-golf.
La fonction ci-dessus ajoute un élément SVG (y compris des animations) au document. Par exemple pour afficher le 2ème cas de test:
Semble travailler un régal - au moins ici, dans Chrome.
Essayez-le dans l'extrait de code ci-dessous (en cliquant sur les boutons, vous dessinerez chacun des cas de test d'OP).
Afficher l'extrait de code
Le code dessine la chaîne et les dents de l'engrenage en traits interrompus. Il utilise ensuite des
animate
éléments pour animer l'stroke-dashoffset
attribut. L'élément SVG résultant est autonome; il n'y a pas d'animation JS ou de style CSS.Pour que les choses s'alignent bien, la couronne de dents de chaque engrenage est en fait dessinée sous la forme d'une trajectoire composée de deux arcs, de sorte que la trajectoire puisse commencer juste au point tangent où la chaîne se touche. Cela rend beaucoup plus simple de l'aligner.
De plus, il semble y avoir beaucoup d’arrondis lorsqu’on utilise les traits pointillés de SVG. Au moins, c'est ce que j'ai vu; plus la chaîne était longue, plus elle était enchevêtrée dans chaque rapport. Donc, pour minimiser le problème, la chaîne est composée de plusieurs chemins. Chaque chemin consiste en un segment d'arc autour d'un rapport et une ligne droite jusqu'au rapport suivant. Leurs points de décalage sont calculés pour correspondre. La partie "intérieure" fine de la chaîne, cependant, n'est qu'un chemin en boucle, car elle n'est pas animée.
la source
R=g=>...
<g>
, mais directement dans la racine svg. Également trouvé un endroit où vous avez transformé un drapeau à balayage et un grand drapeau à arc du booléen au nombre à l'aide de1*x
, mais vous pouvez utiliser+x
C # 3566 octets
Pas du tout joué au golf, maisça marche (je pense)Ungolfed dans l'historique d'édition.
Utilise Magick.NET pour rendre gif.
La classe P a une fonction F; Exemple:
la source
public
modificateur avant chaque champ de votre classe?using
clauses correspondantes doivent être incluses ou que les types pleinement qualifiés sont utilisés et que la référence à System.Drawing doit être notée. dans la réponse (si cela doit ajouter au score, je ne sais pas). Réponse impressionnante de toute façon.JavaScript (ES6) 1626 octets
Cette solution est le résultat de l'ingénierie inverse de la solution de @ Flambino, je la poste avec son accord.
La version non-golfée:
la source