Écrivez un programme pour déterminer si le polygone d'entrée est convexe . Le polygone est spécifié avec une ligne contenant N , le nombre de sommets, puis N lignes contenant les coordonnées x et y de chaque sommet. Les sommets seront listés dans le sens horaire à partir d'un sommet arbitraire.
Exemple 1
contribution
4
0 0
0 1
1 1
1 0
production
convex
exemple 2
contribution
4
0 0
2 1
1 0
2 -1
production
concave
exemple 3
contribution
8
0 0
0 1
0 2
1 2
2 2
2 1
2 0
1 0
production
convex
x et y sont des entiers, N <1000 et | x |, | y | <1000 . Vous pouvez supposer que le polygone d'entrée est simple (aucune des arêtes ne se croise, seules 2 arêtes touchent chaque sommet). Le programme le plus court gagne.
code-golf
math
geometry
decision-problem
Keith Randall
la source
la source
Réponses:
J, 105
Réussit les trois tests ci-dessus.
Edit: (111-> 115) Gérez les points colinéaires en éliminant les angles de pi. A gagné quelques personnages ailleurs.
Edit: (115-> 105) Moins stupide.
Explication pour les J-affaiblis:
(1!:1)3
lire STDIN à EOF. (Je pense.)0&".;._2
est un bel idiome pour analyser ce type d'entrée.j./"1}.
couper la première ligne d'entrée (N 0) et convertir les paires en complexes.(,2&{.)
virer les deux premiers points à la fin de la liste.3(f)\
applique f à une fenêtre coulissante de longueur 3 (3 points pour un angle)[:-/12 o.-@-/@}.,-/@}:
est un verbe qui transforme chacun des 3 points en un angle entre -pi et pi.-@-/@}.,-/@}:
produit (p1 - p2), (p3 - p2). (Rappelez-vous que ce sont des complexes.)12 o.
donne un angle pour chaque complexe.[:-/(...)
donne la différence des deux angles.(o.1)([:>-.~)(o.2)|
mod 2 pi, élimine les angles de pi (segments droits) et compare à pi (supérieur à, inférieur à, n'a pas d'importance à moins que les points soient supposés être enroulés dans une direction).1=#=
si tous ces résultats de comparaison 1 ou 0 (avec auto-classification. Cela semble stupide.)echo>('concave';'convex'){~
impression convexe.la source
Python - 149 caractères
la source
Ruby 1,9,
147133130124123la source
scala: 297 caractères
la source
def main(a:...
au lieu dedef main(args:...
.