Tâche: Étant donné l'aire d'un triangle, trouvez un triangle héronien avec cette zone. Tout triangle héronien avec la zone spécifiée est autorisé.
Un triangle héronien est un triangle avec des côtés entiers et une zone entière . Selon la formule de Heron, un triangle avec des longueurs de côtés a,b,c
a une aire
sqrt(s*(s-a)*(s-b)*(s-c))
où s=(a+b+c)/2
est la moitié du périmètre du triangle. Cela peut également s'écrire
sqrt((a+b+c)*(-a+b+c)*(a-b+c)*(a+b-c)) / 4
Si aucun triangle de ce type n'existe, sortez avec une valeur de falsey cohérente.
Entrée: Un entier positif unique représentant l'aire du triangle.
Sortie: trois longueurs de côté pour un tel triangle OU une valeur erronée.
Exemples:
Input -> Output
6 -> 3 4 5
24 -> 4 15 13
114 -> 37 20 19
7 -> error
Des échappatoires standard s'appliquent
C'est le golf de code, la réponse la plus courte en octets gagne.
Réponses:
Gelée ,
1716 octets-1 octet grâce à Erik le outgolfer (utilisez le quick,
¥
)Application de force brute de la formule de Heron.
Essayez-le en ligne! (atteint le délai d'expiration des années 60 pour le cas de 114 tests. Prend 3m 30 localement - il vérifie 114 3 = 1 481 544 triplets)
Comment?
Une vraie solution de golf - étant donné une zone,
a
il trouve tous les tuples de trois entiers entre1
eta
(même avec des triangles répétés et ceux sans zone), obtient leur zone et des filtres pour ceux avec la zone souhaitée (elle ne s'arrête même pas dès que on en trouve un, il les parcourt tous et fait apparaître le premier résultat par la suite). Cède0
s'il n'en existe pas.la source
ç
parÇ⁼¥
et retirer entièrement la deuxième ligne.JavaScript (ES7),
10910210098 octetsRenvoie un tableau de 3 entiers ou
false
. Comme la réponse de Jelly , c'est la force brute forçant la formule de Heron.Cas de test
Afficher l'extrait de code
Version récursive, 83 octets
Renvoie un tableau de 3 entiers ou renvoie une erreur de récursivité. Malheureusement, cela ne fonctionne que pour les petites entrées.
Démo
Afficher l'extrait de code
la source
Haskell , 69 octets
Essayez-le en ligne!
Sort un singleton d'une liste de trois côtés de triangle comme
[[3.0,4.0,5.0]]
. Les entrées impossibles donnent[]
. Techniquement seulementFalse
Falsey pour Haskell, mais comme Haskell requiert que toutes les sorties possibles soient du même type, il ne peut pas être utilisé. Si une erreur pouvait être utilisée comme Falsey,[...]!!0
elle économiserait 3 octetstake 1[..]
.Essaie tous les triplets
t
de longueurs de côtés possibles allant de1
la zonea
. La formule de Heron est utilisée pour vérifier si la zone correspond via(s-0)(s-x)(s-y)(s-z)==a*a
oùs=(x+y+z)/2
estsum t/2
. Le produit(s-0)(s-x)(s-y)(s-z)
est exprimé comme unproduct
avec des éléments pris0:t
, c'est-à-dire le triple ainsi que 0.la source
F #,
170156152 octetsEssayez-le en ligne!
"Ungolfed"
Si aucun résultat n'est trouvé, le programme sera défectueux. Si cela n'est pas souhaité, je dois remplacer
List.find
parList.filter
(+2 octets) qui produira une liste vide au cas où rien ne serait trouvé ouList.tryFind
(+3 octets), en retournant None au cas où aucun triangle n'aurait été trouvé.Je trouve toujours qu'une version F # golfée est toujours assez lisible.
la source
System.Math.Sqrt
et comparer la valeur résultante àA * A
?1.0..A [...] 1.0..A [...] 1.0..A
par1.0..A [...] a..A [..] b..A
devrait vous faire économiser quelques octets et vous accélérer un peu (si cela fonctionne; j'ai une expérience F # très minimale).Python 2 (PyPy) ,
131123118 118 octetsEssayez-le en ligne!
Bien que cela fonctionne également sur CPython, PyPy est beaucoup plus rapide et est capable de calculer le triangle pour 114 dans la limite de temps sur TIO.
Horaires de ma machine:
la source
Pyth - 23 octets
Qui imprime une valeur véridique / fausse, ou
qui imprime toutes les solutions possibles et est horriblement lent pour les grandes entrées. Mettez 'h' au début pour n'en imprimer qu'un.
Explication:
Essayez-le
la source
Perl 6 , 54 octets
Recherche de force brute de tous les côtés possibles jusqu'à un de moins que
a
la zone d'entrée.^a
est la plage de nombres de 0 àa - 1
.[X] ^a xx 3
réduit, par produit croisé, trois copies de cette gamme, produisant tous les triplets de(0, 0, 0)
à(a - 1, a - 1, a - 1)
.first
triplet de telle sorte que l'aire du triangle avec ces côtés soit égalea
, en utilisant la formule de Heron .Dans le bloc de code donné à
first
:$_
est le triplet. Appeler(x, y, z)
ici.(0,|$_)
est le même triplet mais avec0
préfixé:(0, x, y, z)
..sum / 2
est la moitié du périmètre (une quantité qui est nommées
dans l'expression habituelle de la formule de Heron)..sum / 2 «-« (0, |$_)
est l'hyperopératrice de soustraction avecs
à gauche et(0, x, y, z)
à droite, donnant(s - 0, s - x, s - y, s - z)
.[*]
réduit ensuite ce quadruplet avec multiplication, donnant le carré de la zone.a * a ==
recherche une zone carrée égale au carré de la zone donnée.Si aucun triplet n'est trouvé,
Nil
(ce qui est falsey) est retourné.la source
Haskell , 76 octets
Cela génère une liste de listes contenant toutes les tailles intégrales possibles qui génèrent la zone correcte via la force brute (sortie de la liste vide s'il n'y en a pas). La mise en garde étant qu'il les sort sous forme de doubles en raison de cette division au milieu, mais leur partie fractionnaire est toujours 0.
Si pour une raison quelconque, vous ne pouvez pas accepter cela,
Cela produira les réponses sous forme de liste de listes entières pour
8977 octets au total ou131 octets supplémentaires. (Merci à Neil)Si vous avez besoin / ne voulez que le premier élément en le mettant
!!0
à la fin, vous ne recevrez que le premier élément s'il y a des nombres qui s'appliquent et une erreur s'il n'y en a pas pendant 3 octets de plus ettake 1
au début prendra le premier élément sans l'erreur pour 6 octets de plus.Essayez-le en ligne!
la source
TI-Basic,
7069 octetsAffiche les trois longueurs des côtés s'il y a un triangle, lance une erreur de syntaxe s'il n'y en a pas (grâce
/
à la fin).-1 octet grâce au commentaire de Sean sur une réponse différente
la source
Mathematica, 77 octets
avec Mathve's Solve
Mathematica, 117 octets
Force brute
la source
Area@SSSTriangle[a,b,c]
.En fait , 22 octets
Essayez-le en ligne!
Explication:
la source
Casio Basic, 123 octets
Solution standard de force brute. 122 octets pour le code, 1 octet à spécifier
n
comme paramètre.la source
Wolfram Language (Mathematica) , 59 octets
Essayez-le en ligne!
la source