Le problème : comptez le nombre de trous dans un polygone connecté. La connectivité du polygone est garantie par la condition que chaque triangle de la triangulation d'entrée partage au moins 1 côté avec un autre triangle et qu'il n'y ait qu'un seul ensemble de triangles connectés.
L'entrée est une liste L
de n
points dans le plan et une liste T
de 3 tuples avec des entrées de 0...n-1
. Pour chaque élément T
du tuple (t_1,t_2,t_3)
représente les trois sommets (de la liste L
) d'un triangle dans la triangulation. Notez qu'il s'agit d'une triangulation au sens de «triangulation polygonale» , car il n'y aura jamais deux triangles dans T
ce chevauchement. Une stipulation supplémentaire est que vous n'aurez pas à assainir l'entrée L
et à T
ne pas contenir de répétitions.
Exemple 1 : Si L = {{0,0},{1,0},{0,1},{1,2}}
et T = {{0,1,2},{1,2,3}}
alors le polygone spécifié a un nombre de trous de 0.
Exemple 2 : Si L = {{0,0},{1,0},{2,0},{2,1},{2,2},{1,2},{0,2},{0,1},{.5,.5},{1.5,.5},{1.5,1.5},{.5,1.5}}
et T = {{5,6,11},{5,10,11},{4,5,10},{3,8,10},{2,3,9},{2,8,9},{1,2,8},{0,1,8},{0,8,11},{0,7,11},{6,7,11},{3,4,10}}
alors l'entrée polygonale devrait donner une sortie de 2.
La tâche consiste à écrire le programme (ou la fonction) le plus court qui prend L
et T
comme entrée et renvoie le nombre de trous. Le «gagnant» sera reconnu comme l'entrée avec le moins de caractères (date de fin provisoire le 1er juin).
Exemple de formatage d'entrée (notez l'indexation 0):
0,0
1,0
0,1
1,2
0,1,2
1,2,3
T=1,2,3/1,2,4/5,6,7/5,6,8
,. Chaque triangle partage un bord avec un autre triangle, mais la triangulation est déconnectéeT=1,2,3/1,4,5
est connecté mais pas connecté en périphérie)Réponses:
GolfScript (23 caractères)
Suppose le format d'entrée à l'aide de la notation de tableau GolfScript et des coordonnées entre guillemets (ou intégrales). Par exemple
( Équivalent en ligne )
ou
( Équivalent en ligne )
la source
Python, 71
Ce qui suit est un programme (pas une fonction ) qui calcule le nombre souhaité.
Exemple d'utilisation:
la source
APL, 36
La fonction prend
L
comme argument de gauche etT
comme droite.Par exemple:
Explication, allant de droite à gauche:
⍴⍺,⍵
concatène les deux vecteurs d'entrée et renvoie leur longueur (V + F
)¨⍵
applique la fonction de gauche à chaque élément de l'argument de droite et renvoie le résultat⍵,⍵
renvoie le bon argument concaténé avec lui-même3 2⍴
façonne l'argument vecteur en trois paires. Dans ce cas, il associe les premier et deuxième, troisième et premier, et deuxième et troisième éléments du vecteur.,/
joint l'argument vecteur ensemble⍵[⍋⍵]
trie le bon argument∪/
filtre tous les doublons⍴⊃
transforme un scalaire imbriqué en vecteur et en renvoie la longueur.E
)1
est explicite (j'espère ...)La fonction entière retourne alors
1+E-(V+F)
, ou1-(F+V-E)
.la source
Mathematica, 93 (pas encore beaucoup joué au golf)
(Espaces ajoutés pour plus de clarté)
Essai:
la source
Erosion
)?Ruby, 239 caractères (227 corps)
notez que je ne considère que la topologie. Je n'utilise en aucune façon les positions des sommets.
appelant (attend T au format Mathematica ou JSON):
Tester:
la source
Mathematica
76 73 72 6762Après beaucoup d'expérimentation, j'ai réalisé que l'emplacement précis des sommets n'était pas un problème, j'ai donc représenté le problème avec les graphiques. Les invariants essentiels, le nombre de triangles, d'arêtes et de sommets sont restés invariants (à condition d'éviter le croisement de lignes).
Il y avait deux types de "triangles" internes dans le graphique: ceux qui étaient là étaient vraisemblablement un visage, c'est-à-dire un triangle "rempli", et ceux où il n'y en avait pas. Le nombre de faces internes n'avait aucune relation avec les arêtes ou les sommets. Cela signifiait que creuser des trous dans des graphiques entièrement "remplis" ne réduisait que le nombre de faces. J'ai joué systématiquement avec des variations entre les triangles, en gardant une trace des faces, des sommets et des bords. Finalement, j'ai réalisé que le nombre de trous était toujours égal à 1 - #faces - # vertices + #edges. Cela s'est avéré être 1 moins la caractéristique d'Euler (que je ne connaissais que dans le contexte des polyèdres réguliers (bien que la longueur des bords n'ait clairement aucune importance).
La fonction ci-dessous renvoie le nombre de trous lorsque les sommets et triangles sont entrés. Contrairement à ma soumission précédente, elle ne repose pas sur la numérisation d'une image. Vous pouvez le considérer comme 1 - la caractéristique d'Euler, c'est-à-dire 1 - (F + V -E) où
F
= #faces,V
= # sommets,E
= # bords. La fonction renvoie le nombre de trous,1 - (F + V -E)
étant donné les faces réelles (triangles) et les sommets.On peut facilement montrer que la suppression de tout triangle à l'extérieur du complexe n'a aucun effet sur la caractéristique d'Euler, qu'il partage un ou deux côtés avec d'autres triangles.
Remarque: les minuscules
v
seront utilisées à la place de cellesL
de la formulation d'origine; c'est-à-dire qu'il contient les sommets eux-mêmes (pas V, le nombre de sommets)f
est utilisé pour laT
formule originale; c'est-à-dire qu'il contient les triangles, représentés comme le triple ordonné des indices de vertex.Code
(Merci à M. Wizard d'avoir rasé 5 caractères en éliminant la règle de remplacement.)
Exemple 1
v = {{0, 0}, {1, 0}, {0, 1}, {1, 2}}; f = {{0, 1, 2}, {1, 2, 3}};
Zéro trou.
Exemple 2
v = {{0, 0}, {1, 0}, {2, 0}, {2, 1}, {2, 2}, {1, 2}, {0, 2}, {0, 1} , {.5, .5}, {1.5, .5}, {1.5, 1.5}, {.5, 1.5}}; f = {{5, 6, 11}, {5, 10, 11}, {4, 5, 10}, {3, 8, 10}, {2, 3, 9}, {2, 8, 9} , {1, 2, 8}, {0, 1, 8}, {0, 8, 11}, {0, 7, 11}, {6, 7, 11}, {3, 4, 10}};
Ainsi, 2 trous sont dans l'exemple 2.
la source
MorphologicalEulerNumber[]
). Mma 9.01, Win XP.MorphologicalEulerNumber
nécessite parfois une image; il refuse d'accepter un objet graphique. Dans ces cas, la taille du trou et la résolution sont critiques (voir codegolf.stackexchange.com/questions/8706/… ). Mais ici, il fonctionne directement avec l'objet Graphics, qui contient explicitement tous les sommets. J'ai imaginé (ou espéré) qu'il utiliserait une approche qui ne dépendrait pas de l'image. Je souhaite savoir comment il a tenté de résoudre le problème. Peut-être qu'un peu de spéléologie dans le code source de la fonction clarifiera les choses.Python, 107
J'ai réalisé que prendre les paires directement était plus court que
from itertools import*
et tapercombinations()
. Pourtant, j'ai également remarqué que ma solution reposait sur les faces triangulaires d'entrée dont les sommets étaient répertoriés dans un ordre cohérent. Par conséquent, les gains en nombre de caractères ne sont pas si importants.Python, 115
Approche caractéristique d'Euler, la verbosité des outils semble impossible à éviter. Je me demande s'il serait moins cher d'utiliser une technique plus directe pour faire des paires de sommets.
Exemple d'utilisation:la source