Considérons le triangle équilatéral standard, avec des nœuds étiquetés à l'aide de coordonnées barycentriques :
Nous pouvons transformer ce triangle à 3 nœuds en un triangle à 6 nœuds en ajoutant une nouvelle ligne de 3 sommets (un de plus que ce qui était présent sur un côté du triangle d'origine à 3 nœuds), supprimer tous les bords internes (mais pas les nœuds internes) et normaliser les coordonnées:
Répéter le processus pour passer d'un triangle à 6 nœuds à un triangle à 10 nœuds, ajouter une ligne de 4 sommets (là encore, un de plus que ce qui était présent sur un côté du triangle d'origine à 6 nœuds), supprimer tous les bords internes (mais pas les nœuds internes ) et renormaliser les coordonnées:
Ce processus peut être répété indéfiniment. Le but de ce défi est donné un nombre entier N
représentant le nombre de fois que ce processus a été effectué, sortie tous les nœuds pour le triangle associé en coordonnées barycentriques.
Contribution
Votre programme / fonction doit prendre en entrée un seul entier non négatif N
représentant le nombre de fois où ce processus a été appliqué. Notez que pour N=0
, vous devez sortir le triangle d'origine avec 3 nœuds.
L'entrée peut provenir de n'importe quelle source (paramètre de fonction, stdio, etc.).
Production
Votre programme / fonction doit sortir tous les nœuds en coordonnées barycentriques normalisées. L'ordre des nœuds n'a pas d'importance. Un nombre peut être spécifié sous forme de fraction (réduction de fraction non requise) ou nombre à virgule flottante. Vous pouvez également générer des vecteurs "à l'échelle" pour spécifier un nœud. Par exemple, les 3 sorties suivantes sont équivalentes et autorisées:
0.5,0.5,0
1/2,2/4,0
[1,1,0]/2
Si vous utilisez une sortie en virgule flottante, votre sortie doit être précise à 1% près. La sortie peut être vers n'importe quel récepteur souhaité (stdio, valeur de retour, paramètre de retour, etc.). Notez que même si les coordonnées barycentriques sont uniquement déterminées par seulement 2 nombres par nœud, vous devez sortir les 3 nombres par nœud.
Exemples
Les exemples de cas sont formatés comme suit:
N
x0,y0,z0
x1,y1,z1
x2,y2,z2
...
où la première ligne est l'entrée N
, et toutes les lignes suivantes forment un nœud x,y,z
qui doit être dans la sortie exactement une fois. Tous les nombres sont donnés sous forme de nombres à virgule flottante approximatifs.
0
1,0,0
0,1,0
0,0,1
1
1,0,0
0,1,0
0,0,1
0.5,0,0.5
0.5,0.5,0
0,0.5,0.5
2
1,0,0
0,1,0
0,0,1
0.667,0,0.333
0.667,0.333,0
0.333,0,0.667
0.333,0.333,0.333
0.333,0.667,0
0,0.333,0.667
0,0.667,0.333
3
1,0,0
0.75,0,0.25
0.75,0.25,0
0.5,0,0.5
0.5,0.25,0.25
0.5,0.5,0
0.25,0,0.75
0.25,0.25,0.5
0.25,0.5,0.25
0.25,0.75,0
0,0,1
0,0.25,0.75
0,0.5,0.5
0,0.75,0.25
0,1,0
Notation
C'est le golf de code; le code le plus court en octets gagne. Des échappatoires standard s'appliquent. Vous pouvez utiliser n'importe quel module intégré souhaité.
[1,2,3]/6
?Réponses:
CJam (22 octets)
Il s'agit d'un bloc (fonction) anonyme qui prend
N
la pile et laisse un tableau de tableaux de doubles sur la pile. Démo en ligneDissection
la source
Haskell, 53 octets
la source
Python 3, 87 octets
Il s'agit en fait d'un commentaire sur la solution de TheBikingViking mais je n'ai pas assez de réputation pour les commentaires.
On peut économiser quelques octets en itérant uniquement sur les variables
i,j
et en utilisant le fait qu'elles s'ajoutent à la troisièmen+1
.la source
Mathematica,
4443 octetsIl s'agit d'une fonction sans nom prenant un seul argument entier. La sortie est une liste de listes de fractions exactes (réduites).
Génère tous les 3-tuples de multiples
1/(N+1)
compris entre 0 et 1, inclus, puis sélectionne ceux dont la somme est 1 (comme requis par les coordonnées barycentriques).la source
05AB1E , 10 octets
Explication
Essayez-le en ligne
la source
¤
consomme le tableau, pourquoi/
divise-t-il le tableau par cela? Est-ce qu'il "se souvient" de la dernière valeur surgie et l'utilise si nécessaire?¤
est l'une des rares commandes qui n'apparaissent pas et ne consomment pas de la pile. Il pousse le dernier élément de la liste tout en laissant la liste sur la pile.MATL , 17 octets
Essayez-le en ligne!
Explication
L'approche est la même que dans les autres réponses:
[0, 1/(n+1), 2/(n+1), ..., 1]
, oùn
est l'entrée;1
.Plus précisement:
la source
Méduse ,
3733 octetsMerci à Zgarb d'avoir économisé 4 octets.
Essayez-le en ligne!
Comme mes réponses CJam de Mathematica et Peter, cela génère un ensemble de tuples candidats, puis ne sélectionne que ceux qui totalisent 1. Je ne suis pas encore entièrement satisfait de la disposition, et je me demande si je peux enregistrer quelques octets avec des crochets ou des fourches, mais je vais devoir examiner cela plus tard.
la source
Perl 6:
5040 octetsRenvoie une séquence de listes à 3 éléments de nombres rationnels (exacts).
Explication:
$_
Paramètre implicitement déclaré du lambda.
0, 1/($_ + 1) ... 1
Utilise l'opérateur de séquence
...
pour construire la séquence arithmétique qui correspond aux valeurs de coordonnées possibles.[X] EXPR xx 3
Prend le produit cartésien de trois copies d'EXPR, c'est-à-dire génère tous les 3-tuples possibles.
grep *.sum == 1, EXPR
Filtrez les tuples avec une somme de 1.
la source
Rubis, 62
Je serais surpris si cela ne pouvait pas être amélioré:
En prenant les conseils latents dans le puzzle, cela calcule les options du deuxième nœud en fonction du premier et du troisième nœud en soustrayant les deux premiers.
la source
Brachylog , 24 octets
Essayez-le en ligne!
la source
Python 3, 106 octets
Une fonction qu'ils saisit via un argument et imprime une liste de listes de flottants dans STDOUT.
Python n'est pas bon dans les produits cartésiens ...
Comment ça fonctionne
Essayez-le sur Ideone
la source
En fait , 15 octets
Cela utilise un algorithme similaire à celui de la réponse Python de TheBikingViking . Suggestions de golf bienvenues. Essayez-le en ligne!
Non golfé:
la source
Rubis,
7774 octetsUne autre réponse utilisant l'algorithme de la réponse Python de TheBikingViking . Suggestions de golf bienvenues.
Un autre algorithme de 74 octets basé sur la réponse Ruby de Not that Charles .
la source
JavaScript (Firefox 30-57),
8881 octetsRenvoie un tableau de tableaux de nombres à virgule flottante. Edit: 7 octets enregistrés en calculant directement la troisième coordonnée. J'ai essayé d'éliminer le
if
en calculanty
directement la plage de mais cela a coûté un octet supplémentaire:la source
[x/n,y/n/z/n]
, avez-vous oublié une virgule?