Lorsque vous enfoncez un ensemble de clous dans une planche de bois et enroulez une bande de caoutchouc autour d'eux, vous obtenez une coque convexe .
Votre mission, si vous décidez de l'accepter, est de trouver la coque convexe d'un ensemble donné de points 2D.
Certaines règles:
- Écrivez-le comme une fonction, les coordonnées de la liste du point (dans n'importe quel format que vous voulez) est l'argument
- La sortie doit être la liste des points de la coque convexe répertoriés dans le sens horaire ou antihoraire, en commençant par l'un d'eux
- La liste de sortie peut être dans n'importe quel format raisonnable où les coordonnées de chaque point peuvent être clairement distinguées. (Par exemple, PAS une liste unidimensionnelle {0,1, 1,3, 4, ...})
- Si trois points ou plus dans un segment de la coque convexe sont alignés, seuls les deux extrêmes doivent être conservés sur la sortie
Exemples de données:
Échantillon 0
Contribution:
{{1, 1}, {2, 2}, {3, 3}, {1, 3}}
Production:
{{3, 3}, {1, 3}, {1, 1}}
(Les chiffres sont juste illustratifs)
Échantillon 1
Contribution:
{{4.4, 14}, {6.7, 15.25}, {6.9, 12.8}, {2.1, 11.1}, {9.5, 14.9},
{13.2, 11.9}, {10.3, 12.3}, {6.8, 9.5}, {3.3, 7.7}, {0.6, 5.1}, {5.3, 2.4},
{8.45, 4.7}, {11.5, 9.6}, {13.8, 7.3}, {12.9, 3.1}, {11, 1.1}}
Production:
{{13.8, 7.3}, {13.2, 11.9}, {9.5, 14.9}, {6.7, 15.25}, {4.4, 14},
{2.1, 11.1}, {0.6, 5.1}, {5.3, 2.4}, {11, 1.1}, {12.9, 3.1}}
Échantillon 2
Contribution:
{{1, 0}, {1, 1}, {1, -1}, {0.68957, 0.283647}, {0.909487, 0.644276},
{0.0361877, 0.803816}, {0.583004, 0.91555}, {-0.748169, 0.210483},
{-0.553528, -0.967036}, {0.316709, -0.153861}, {-0.79267, 0.585945},
{-0.700164, -0.750994}, {0.452273, -0.604434}, {-0.79134, -0.249902},
{-0.594918, -0.397574}, {-0.547371, -0.434041}, {0.958132, -0.499614},
{0.039941, 0.0990732}, {-0.891471, -0.464943}, {0.513187, -0.457062},
{-0.930053, 0.60341}, {0.656995, 0.854205}}
Production:
{{1, -1}, {1, 1}, {0.583004, 0.91555}, {0.0361877, 0.803816},
{-0.930053, 0.60341}, {-0.891471, -0.464943}, {-0.700164, -0.750994},
{-0.553528, -0.967036}}
Les règles de code-golf standard s'appliquent. Pas de bibliothèques de géométrie ad hoc. Le code plus court gagne.
Modifier 1
Nous recherchons ici une réponse algorithmique, pas une routine préprogrammée de recherche de coque convexe comme celle-ci dans MatLab ou celle-ci dans Mathematica
Modifier 2
Répondre aux commentaires et informations supplémentaires:
- Vous pouvez supposer que la liste d'entrée contient le nombre minimum de points qui vous convient. Mais vous devez garantir un traitement approprié des (sous-) ensembles alignés.
- Vous pouvez trouver des points répétés dans la liste d'entrée
- Le nombre maximum de points ne doit être limité que par la mémoire disponible
- Re "virgule flottante": vous devez être capable de traiter des listes d'entrée avec des coordonnées décimales comme celles données dans les échantillons. Vous pouvez le faire en utilisant une représentation en virgule flottante
.
Réponses:
Ruby, 168 caractères
Ce code rubis utilise également l'algorithme d'emballage cadeau. La fonction
C
accepte un tableau de points et renvoie la coque convexe en tant que tableau.Exemple:
la source
Mathematica 151
travail en coursessai:
la source
CoffeeScript, 276:
Si la fonction n'a pas besoin d'être accessible, supprimez-la
f=
pour raser deux autres caractères.L'entrée / sortie est un tableau unique de points, chaque point étant défini par les
x,y
propriétés. Le tableau d'entrée est modifié, ainsi que renvoyé (si ce dernier n'est pas requis, supprimez les deux derniers caractères).Une explication peut être ajoutée ultérieurement.
Suite de tests (ne fonctionnera pas dans oldIE):
environnement de test suggéré: http://coffeescript.org/
la source
{{1, 1}, {2, 2}, {3, 3}, {1, 3}}
et il est revenu[{"x" : 1, "y" : 1, "r" : 0}, {"x" : 1, "y" : 3, "r" : 0}, "x" : 2, "y" : 2, "r" : 0.78..}]
alors que je pense que la bonne réponse est une permutation de{{3, 3}, {1, 3}, {1, 1}}
Python,
209 205195Utilise un algorithme d'emballage cadeau. Le résultat commence par le point le plus à gauche et passe dans le sens antihoraire.
Exemple:
h([(1, 1), (2, 2), (3, 3), (1, 3)])
retourne[(1, 3), (1, 1), (3, 3)]
la source
print
pour obtenir la sortie?the output list can be in any reasonable format
était suffisamment claire. Pensez-vous que cela doit être explicitement déclaré?h([(0, 1), (0,1), (0.1 , 1)])
me donne[(0, 1), (0.10000000000000001, 1)]