Étant donné une liste de coordonnées entières, trouvez l'aire du plus grand polygone convexe que vous pouvez construire à partir de la liste de telle sorte que -
- chaque sommet est dans la liste
- aucun élément de la liste n'est contenu dans le polygone.
Exemple:
(0, 0) (8, 0) (0, 1) (3, 1) (7, 1) (1, 2) (5, 2) (9, 2) (2, 3) (5, 3) (7, 3) (3, 4) (5, 5) (11, 5)
Visualisé:
o o
o o o
o o o
o o o
o
o o
Le plus grand polygone convexe que vous pouvez créer est le suivant:
o
o o
o o
o o
o
o
D'une superficie de 12.
Vous pouvez prendre la liste des coordonnées dans n'importe quel format raisonnable et devez afficher (d'une manière appropriée pour la langue de votre choix) la zone du plus grand polygone convexe, arrondie à pas moins de 2 chiffres après la virgule décimale.
De plus, vous devez utiliser une sorte d'algorithme, et pas simplement forcer brutalement tous les sous-ensembles de points. Pour appliquer cela, votre programme doit résoudre une liste de 50 sommets en moins d'une minute sur un PC moderne.
Le code le plus court en octets gagne.
Réponses:
Javascript ES6, 738 octets
Voici une version ES5 ou moins qui devrait fonctionner dans la plupart des navigateurs et des nœuds sans peaufiner: 827 octets
Le code renvoie une fonction anonyme. En tant que paramètre, il prend un tableau de points, comme
[[0,1],[2,3],[4,5]]
. Pour l'utiliser, vous pouvez le placervar f=
avant, ou si vous souhaitez l'utiliser à partir de la ligne de commande, ajoutez(process.argv[2].replace(/ /g,'').slice(1,-1).split(')(').map((x)=>x.split(',')))
à la fin et appelez-le commenode convpol.js '(1,2)(3,4)(5,6)'
Merci pour le défi! Comme il n'y a pas d'implémentation de référence, je ne peux pas prouver que c'est correct, mais c'est cohérent au moins pour les permutations de la liste de points. Je ne pensais presque pas que cela allait fonctionner, car les versions avec le code de débogage, même désactivées, étaient beaucoup trop lentes avec une augmentation exponentielle du temps. J'ai quand même décidé de jouer au golf et j'étais ravi de voir qu'il était tombé à moins de 2 secondes pour 50 points sur ma machine. Il peut calculer environ 130 points en 1 minute.
L'algorithme est similaire au balayage Graham , sauf qu'il doit rechercher des coques convexes vides partout.
Explication
Voici un aperçu de haut niveau du fonctionnement de l'algorithme. La viande de cet algorithme recherche simplement des boucles convexes dans le sens antihoraire qui ne renferment pas de point. La procédure ressemble à ceci:
De plus, à titre d'optimisation, nous enregistrons la paire initiale de la chaîne comme vérifiée, de sorte que toute recherche ultérieure après avoir vu cette paire n'importe où dans la chaîne peut immédiatement arrêter la recherche, car le plus grand polygone avec cette paire a déjà été trouvé.
Cet algorithme ne devrait jamais trouver un polygone deux fois, et je l'ai vérifié expérimentalement.
la source
===
et!==
avec==
et!=
, mais je ne pouvais pas être sûr sans comprendre votre code ...(x,i)=>p.i==i
(13 caractères) est un peu plus long quex=>p===x
(8 caractères) même après optimisation.