Étant donné une liste ordonnée de 2 points cartésiens 2D ou plus, affichez une valeur vraie si le chemin se touche ou s'auto-intersecte; sinon, émettez une valeur falsifiée si elle ne se touche pas ou ne s'auto-intersecte pas.
Vous pouvez supposer que les points consécutifs de la liste sont distincts.
Exemples:
(0,0), (1,0) -> falsey
(0,0), (1,0), (0,0) -> truthy
(0,0), (1,0), (1,1), (0,0) -> truthy
(0,0), (2,0), (1,1), (1,-1) -> truthy
(0,0), (10,0), (0,1), (10,1), (0,2), (10,2) -> falsey
Notez que toutes les coordonnées que j'ai données ici sont des entiers. Vous pouvez prendre en charge les entrées coordonnées de tout ce que vous voulez parmi {entier, décimal, rationnel, virgule flottante, ...}. Mais vos calculs d'implémentation doivent donner les bonnes réponses pour toutes les entrées données.
Réponses:
Python 2 ,
315309298382380372 octetsEssayez-le en ligne!
Utilise l'algorithme d' ici , combiné avec cette réponse SO pour les segments colinéaires.
Modifier: corrigé pour les segments de ligne continuant dans la même direction (par exemple
(0,0),(1,0),(2,0)
) en supprimant le point central, (résultant en(0,0),(2,0)
).la source
*((n*N>0)+(m*M>0)<1)
->*(n*N<=0>=m*M)
.Eukleides ,
154148 octetsFonction nommée
i
qui, a passé un ensemble de points, renvoie 0 ou 1. Les points-virgules et les sauts de ligne sont interchangeables pour terminer une commande, je viens de regrouper quelques éléments pour garder le code visiblement court car nous ne sommes pas habitués à la lisibilité code ici de toute façon.Eukleides est un langage de géométrie plane principalement pour la sortie graphique, mais aussi avec des capacités programmatiques décentes. Je pensais que ce serait génial pour cette tâche, mais quelques choses m'ont frustré. Tout d'abord, il convient de noter que les ensembles à Eukleides sont essentiellement des tableaux de points et, le cas échéant, sont rendus sous forme de chemins constitués de segments de ligne connectés. Eukleides prend en charge la génération itérative d'ensembles via des loci, semblable à une boucle for qui crée un ensemble dans le processus. Si j'avais pu utiliser un locus, cela aurait réduit les octets, mais apparemment Eukleides n'aime pas référencer un locus partiellement formé de l'intérieur.
L'autre grande frustration était que si, apparemment, deux segments de ligne identiques sont l'un sur l'autre,
intersection
ne renvoie qu'un seul point incriminé (ce qui est logique, je suppose, il y aurait des intersections infinies). Ma méthode consiste essentiellement à construire le chemin un pas en arrière et à tester le prochain segment de ligne pour les intersections avec le chemin. En raison du comportement d'intersection susmentionné, je vérifie séparément si le point se trouve ou non sur le chemin.Modifier : Coupez 1 octet en réorganisant l'
or
instruction pour permettre la suppression d'un espace avantor
; 5 octets de plus en changeant ceif
bloc en opération ternaire.Cas de test:
la source