Un autre défi facile pour vous.
Ta tâche
Écrivez un programme ou une fonction qui prend l'entrée, qui contient 3 paires de coordonnées x et y et calcule l'aire du triangle formé à l'intérieur. Pour ceux qui ne se souviennent pas comment le calculer, vous pouvez le trouver ici .
Exemple:
1,2,4,2,3,7 # input as x1,y1,x2,y2,x3,y3
7.5 # output
À voir chez Wolfram Alpha
Quelques considérations:
- L'entrée sera six entiers positifs de base 10.
- Vous pouvez supposer que l'entrée est dans un format raisonnable .
- Les points formeront toujours un triangle valide.
- Vous pouvez supposer que l'entrée est déjà stockée dans une variable telle que
t
. - Le code le plus court en octets gagne!
Edit: Pour éviter toute confusion, j'ai simplifié la façon dont l'entrée doit être traitée sans compromettre aucun des codes actuels.
N'oubliez pas que votre programme / fonction doit sortir une zone valide, donc il ne peut pas donner un nombre négatif en sortie
[[1, 2], [4, 2], [3, 7]]
) dansT
?[1 2;4 2;3 7]
(en utilisant la syntaxe Julia)?Réponses:
CJam,
1816 octetsEssayez-le en ligne dans l' interpréteur CJam .
Idée
Comme mentionné sur Wikipedia , l'aire du triangle
[[0 0] [x y] [z w]]
peut être calculée comme|det([[x y] [z w]])| / 2 = |xw-yz| / 2
.Pour un triangle générique
[[a b] [c d] [e f]]
, nous pouvons traduire son premier sommet à l'origine, obtenant ainsi le triangle[[0 0] [c-a d-b] [e-a f-b]]
, dont l'aire peut être calculée par la formule ci-dessus.Code
la source
Mathematica, 27 octets
la source
Partition[t,2]
, qui correspond à2/
dans CJam. ;)JavaScript (ES6) 42
.44.Modifier le format d'entrée modifié, je peux enregistrer 2 octets
Une fonction anonyme qui prend le tableau comme paramètre et renvoie la valeur calculée.
Testez l'exécution de l'extrait ci-dessous dans un navigateur compatible EcmaScript 6.
la source
The input will be a vector with six base 10 positive integers.
Julia, 32 octets
Construit une matrice des termes appropriés d'un produit croisé, utilise
det
pour obtenir la valeur résultante, prend la valeur absolue pour traiter les négatifs, puis divise par 2 car c'est un triangle et non un parallélogramme.la source
Matlab / Octave, 26 octets
Je n'en savais rien jusqu'ici =)
la source
Java,
7988 octetsUtilise simplement la formule de base, rien de spécial.
Edit: J'ai oublié de prendre la valeur absolue :(
la source
return(t[0]*(t[3]...
devrait suffire, non?Minkolang 0,8 , 34 octets
Quelqu'un veut de l'oeuf
n0g
?Explication
Très simple. Utilise la formule
|(x2-x1)(y3-y1) - (x3-x1)(y2-y1)|/2
.la source
JayScript , 58 octets
Déclare une fonction anonyme:
Exemple:
la source
Rubis, 45
la source
PHP - 68
8889octetsMerci à Martjin pour quelques bons conseils!
Pour l'utiliser, créez un fichier
area.php
avec ce contenu, la ligne supplémentaire répond à l' hypothèse que les données sont enregistrées dans unet
partie variable des spécifications, et le ␍ à la fin ajoute un retour chariot afin que la sortie soit agréable et séparée:Fournissez ensuite les coordonnées sur la ligne de commande
x₁ y₁ x₂ y₂ x₃ y₃
, par exemplela source
t
."$a
->$t
, supprimer l'$a=$argv;
enregistrement 9 octets<?php echo
par<?=
, en économisant encore 7 octetsregister_globals=On
dans votrephp.ini
fichier (par défaut). En savoir plus sur php.net/manual/en/security.globals.phpPyth,
3430 octetsEssayez-le en ligne.
Fonctionne en calculant abs (a * (df) + c * (fb) + e * (bd)) / 2 à partir de l'entrée a, b, c, d, e, f.
la source
R, 37 octets
Convertit le vecteur de coordonnées en une matrice et colle sur une rangée de 1.
Calcule le déterminant et divise par 2.
Renvoie le résultat absolu. Si la commande était toujours dans le sens horaire,
abs
elle ne serait pas requise.la source
Python 2,
484750 octetsTrès simple; suit l'équation standard:
Les autres approches, tout aussi simples, sont plus longues:
L'accès de Python à une fonction déterminée se fait par numpy .
Merci à muddyfish pour 1 octet et xnor pour avoir attrapé une erreur.
la source
0
de2.0
de congé2.
abs
pour rendre la réponse positive.PHP, 77
Sur la base de la réponse de @Yimin Rong, j'ai senti que je pouvais l'améliorer de quelques octets en utilisant
list()
plutôt que directement$argv
pour abréger certaines variables. Aussiecho
pas non plus besoin d'espace s'il y a un délimiteur entre l'écho et la chose en écho.echo$variable;
,,echo(4+2);
etecho'some string';
sont également valables alors queechofunction($variable)
confond PHP.D'un autre côté, j'ai également ajouté
abs()
pour être mathématiquement précis, car certaines combinaisons de sommets ont produit une "zone négative"Vous pouvez l'exécuter via CLI
la source
AWK - 51
42octetsAWK n'a pas intégré,
abs
donc en utilisantsqrt(x^2)
pour remplacer.Enregistrer sous
area.awk
et utiliser sousecho x₁ y₁ x₂ y₂ x₃ y₃ | awk -f area.awk
, par exemplela source
PowerShell, 70 octets
Utilise la même formule standard que les autres solutions. Par la question, suppose que le tableau est pré-rempli, par exemple
$t=(1,2,4,2,3,7)
. Mais ouf , la syntaxe$
et[]
tue-t-elle celui-ci ...la source
$
et[]
m'a inspiré pour essayer une solution AWK qui, par longueur, n'est pas non compétitive!dc , 52 octets
Suppose que l'entrée est dans le registre
t
comme:x1 y1 x2 y2 x3 y3
avecx1
en haut det
la pile.1 2 4 2 3 7stStStStStSt #puts coordinates into register t (closest thing dc has to variables) 1kLtLtsaLtsbLtdscLtltrlalclbltla-*sd-*se-*leld++2/p 7.5
Cela utilise la formule suivante pour la zone:
(x1(y2-y3) + x2(y3-y1) + x3(y1 - y2))/2
Et pour une ventilation rapide du processus:
1k Lt Lt sa Lt sb Lt d sc Lt lt r
: définissez la précision décimale à 1 place, déplacez des parties de la pile danst
la pile principale et déplacez diverses parties de la pile principale vers d'autres registres pour le stockage (d
duplique le haut de la pile principale,r
inverse les deux éléments supérieurs de la pile principale,L/l
déplacez / copie du registre donné au principal,s
déplace le haut de la pile principale vers le registre donné)Principale:
y3 x3 y2 x1
a:,
y1
b:,x2
cy2
:, t:y3
la lc lb lt la
: Copier la partie supérieure des piles de registresa
,c
,b
,t
, eta
de la pile principale dans cet ordrePrincipale:
y1 y3 x2 y2 y1 y3 x3 y2 x1
a:,
y1
b:,x2
cy2
:, t:y3
- * sd
: Calculate((y3-y1)*x2)
et le résultat mis end
(registresa
,b
,c
ett
ne sont plus utilisés donc je vais les déposer dans la liste des piles maintenant)Principale:
y2 y1 y3 x3 y2 x1
ré:
((y3-y1)*x2)
- * se - *
: calculer((y1-y2)*y3)
et((y2-x3)*x1)
; stocker l'ancien danse
et laisser ce dernier sur la pile principalePrincipale:
((y2-x3)*x1)
d:,
((y3-y1)*x2)
e:((y1-y2)*y3)
le ld + +
: copier le haut du registree
etd
dans la pile principale, calculer la somme des 2 valeurs de pile supérieures (repousser le résultat dans la pile principale) deux foisPrincipale:
(((y3-y1)*x2)+((y1-y2)*y3)+((y2-x3)*x1))
d:,
((y3-y1)*x2)
e:((y1-y2)*y3)
2 /
: poussez 2 sur la pile principale, divisez les 2ème valeurs de la pile par la 1ère (d
ete
ne sont plus utilisées, supprimez-les de la liste des piles)Principale:
(((y3-y1)*x2)+((y1-y2)*y3)+((y2-x3)*x1))/2
En réorganisant la valeur sur la pile, nous pouvons voir qu'elle est équivalente à la formule en haut de cette explication:
(x1(y2-y3) + x2(y3-y1) + x3(y1 - y2))/2
p
: Imprimer le haut de la pile principale pour la sortie.la source