Depuis http://en.wikipedia.org/wiki/Triangle :
Écrivez un programme qui prend trois tuples de coordonnées 2D (cartésiennes) et classe la forme décrite par ces trois points.
Dans presque tous les cas, ces points décrivent un triangle de types différents. Dans certains cas dégénérés, les points décrivent soit un point singulier, soit une ligne droite. Le programme déterminera laquelle des balises suivantes s'applique à la forme décrite:
- Point (3 points coïncident)
- Ligne (3 points se situent sur une ligne droite - pas plus de 2 points peuvent être co-incidents)
- Equilatéral (3 côtés égaux, 3 angles égaux)
- Isocèle (2 côtés égaux, 2 angles égaux)
- Scalène (0 côtés égaux, 0 angles égaux)
- Droite (1 angle exactement π / 2 (ou 90 °))
- Oblique (0 angle exactement π / 2 (ou 90 °))
- Obtuse (1 angle> π / 2 (ou 90 °))
- Aigu (3 angles <π / 2 (ou 90 °))
Notez que pour certaines formes décrites, plusieurs des balises ci-dessus s'appliqueront. Par exemple, tout angle droit sera également isocèle ou scalène.
Contribution
- Le programme peut lire les 3 coordonnées d'entrée de STDIN, de la ligne de commande, des variables d'environnement ou de la méthode qui convient à la langue de votre choix.
- L'entrée coordonnée peut être formatée mais convient à la langue de votre choix. On peut supposer que tous les numéros d'entrée sont bien formés par rapport aux types de données que vous finissez par utiliser.
- Rien ne peut être supposé sur l'ordre des coordonnées d'entrée.
Sortie
- Le programme sortira sur STDOUT, une boîte de dialogue ou toute autre méthode d'affichage convenant à la langue de votre choix.
- La sortie affichera toutes les balises applicables à la forme décrite par les coordonnées d'entrée.
- Les balises peuvent être sorties dans n'importe quel ordre.
Autres règles
- Les bibliothèques / API trigonométriques de votre langue sont autorisées, mais toutes les API qui calculent spécifiquement les types de triangle sont interdites.
- Lors de la détermination de l'égalité des angles ou des longueurs des côtés, vous finirez probablement par comparer des valeurs à virgule flottante. Deux de ces valeurs doivent être considérées comme «égales» si l'une est à moins de 1% de l'autre.
- Des «failles» standard qui ne sont plus drôles
- Il s'agit de code-golf , donc la réponse la plus courte en octets l'emporte.
Exemples
Input Output
(1,2) (1,2) (1,2) Point
(1,2) (3,4) (5,6) Line
(0,0) (1,1) (2,0) Isosceles Right
(0,0) (2,1) (10,1) Scalene Oblique Obtuse
Réponses:
C (451 octets)
Utilise uniquement des longueurs et des pentes carrées.
Non golfé (et opérateur ternaire remplacé par if / else):
Format d'entrée (via stdin): xyxyxy
ex. 0 0 1 1 2 0 pour Isocèle Droite
la source
./triangle <<< "1 2 1 2 1 2"
doit être utilisé, avec les guillemets.C, 333
J'ai laissé l'espace vide pour le moment. Cela fonctionne mais pourrait probablement faire avec du rangement et du golf. Mathématiques similaires à
@es1024
la réponse, mais utilise une boucle et des tableaux. Format d'entréex y x y x y
Variables
t[]
stocke à la fois l'entrée et les carrés des longueurs. À la fin du programme, il ressemble au tableau ci-dessous (l'augmentation du nombre d'itérations de la boucle conduirait à une répétition indéfinie des longueurs au carré.) Au début de la boucle, des carrés de longueurs (ordures car toutes les données ne sont pas disponibles ) sont stockés inutilement dans les cellules 1,3 et 5, mais sont rapidement remplacés par Lesscanf.
données utiles sont écrites dansz,b,c
ahds
lorsquei
= 9,11,13 (t[i]
ett[i-2]
sont accessibles.)g[]
a été ajouté tard pour conserver les valeurs dx et dy nécessaires au calcul de la pente. Les seules cellules utilisées sont de 6 à 9 (0 à 5 ne sont pas fiables car toutes les données ne sont pas disponibles lorsqu'elles sont écrites.) Sig[6]/g[7]==g[8]/g[9]
les pentes de 2 lignes sont égales et que le triangle n'est qu'une ligne (ou un point). L'équation est réorganisé dans le programme pour éviter la division.r
est une valeur intermédiaire utilisée pour la quadraturez
compte le nombre de côtés de longueur zéro. Il a un décalage de +3 car la boucle lit 3 cellules videst[]
.c
compte le nombre de côtés de longueur identique. Il a également un décalage de +3. Notez que le côtéa
est écritt[]
deux fois afin de pouvoir vérifier a = b, b = c, c = a.b
est la plus grande longueur d'un côté, au carré.s
est la somme des carrés de tous les côtés.Notez que la comparaison des longueurs des côtés A ^ 2 + B ^ 2 + C ^ 2 avec 2 * B ^ 2 revient à comparer A ^ 2 + C ^ 2 avec B ^ 2 (il suffit de soustraire B ^ 2 des deux côtés). si B ^ 2 = A ^ 2 + C ^ 2 c'est un triangle rectangle. si B ^ 2 est supérieur, il est obtus, s'il est plus petit, il est aigu.
la source
Golfscript (175 octets)
Vous pouvez le tester ici (set de test inclus).
Format d'entrée:
Version commentée:
REMARQUE:
La raison pour laquelle mon code ne contient aucune sortie "équilatérale" est la suivante:
la source
Mathematica (
313307 caractères)Golfé:
Non golfé:
Le format d'entrée est une liste de points sur lesquels la fonction est appelée:
la source