Tarefa: Dada a área de um triângulo, encontre um triângulo heroniano com essa área. Qualquer triângulo heroniano com a área especificada é permitido.
Um triângulo heroniano é um triângulo com lados inteiros e área inteira . Pela fórmula de Heron, um triângulo com comprimentos laterais a,b,c
tem área
sqrt(s*(s-a)*(s-b)*(s-c))
onde s=(a+b+c)/2
é metade do perímetro do triângulo. Isso também pode ser escrito como
sqrt((a+b+c)*(-a+b+c)*(a-b+c)*(a+b-c)) / 4
Se esse triângulo não existir, imprima com um valor consistente de falsey.
Entrada: Um número inteiro positivo único que representa a área do triângulo.
Saída: Quaisquer três comprimentos laterais para um triângulo ou um valor falso.
Exemplos:
Input -> Output
6 -> 3 4 5
24 -> 4 15 13
114 -> 37 20 19
7 -> error
Este é o código de golfe, a resposta mais curta em bytes ganha.
Respostas:
Geléia ,
1716 bytes-1 byte graças a Erik, o outgolfer (use o quick,
¥
)Aplicação de força bruta da fórmula de Heron.
Experimente online! (atinge o tempo limite dos anos 60 para o caso de testes 114. Leva 3m 30s localmente - verifica 114 3 = 1.481.544 triplos)
Quão?
Uma verdadeira solução de golfe - dada uma área,
a
ela encontra todas as tuplas de três números inteiros entre1
ea
(mesmo com triângulos repetidos e sem área), obtém sua área e filtros para aqueles com a área desejada (ela nem pára assim que um é encontrado, ele atravessa todos eles e aparece o primeiro resultado depois). Rende0
se não existir.fonte
ç
comÇ⁼¥
e remover a segunda linha inteiramente.JavaScript (ES7),
10910210098 bytesRetorna uma matriz de 3 números inteiros ou
false
. Como a resposta da geléia , isso é bruto, forçando a fórmula de Heron.Casos de teste
Mostrar snippet de código
Versão recursiva, 83 bytes
Retorna uma matriz de 3 números inteiros ou gera um erro de recursão. Infelizmente, ele só funciona para pequenas entradas.
Demo
Mostrar snippet de código
fonte
Haskell , 69 bytes
Experimente online!
Emite um singleton de uma lista de três lados de triângulo, como
[[3.0,4.0,5.0]]
. Entradas impossíveis dão[]
. Tecnicamente, somente oFalse
Falsey é para Haskell, mas como o Haskell exige que todas as saídas possíveis sejam do mesmo tipo, ele não pode ser usado. Se um erro pudesse ser usado como Falsey,[...]!!0
economizaria 3 bytestake 1[..]
.Tenta todos os triplos
t
de possíveis comprimentos laterais, variando de acordo1
com a áreaa
. A fórmula de Heron é usada para verificar se a área corresponde a(s-0)(s-x)(s-y)(s-z)==a*a
ondes=(x+y+z)/2
estásum t/2
. O produto(s-0)(s-x)(s-y)(s-z)
é expresso como aproduct
com elementos retirados0:t
, ou seja, o triplo e o 0.fonte
F #,
170156152 bytesExperimente online!
"Ungolfed"
Se não houver resultados, o programa falhará. Se isso não for desejado, eu tenho que substituir
List.find
porList.filter
(+2 bytes), que produzirá uma lista vazia caso nada seja encontrado ouList.tryFind
(+3 bytes), retornando None, caso nenhum triângulo tenha sido encontrado.Eu sempre acho que uma versão F # golfada ainda é razoável legível.
fonte
System.Math.Sqrt
comparar o valor resultante comA * A
?1.0..A [...] 1.0..A [...] 1.0..A
por1.0..A [...] a..A [..] b..A
deve economizar alguns bytes e acelerar um pouco (se funcionar; eu tenho uma experiência F # mínima).Python 2 (PyPy) ,
131123118 bytesExperimente online!
Embora isso também funcione no CPython, o PyPy é muito mais rápido e pode calcular o triângulo para 114 no limite de tempo no TIO.
Tempos da minha máquina:
fonte
Pitão - 23 bytes
Que imprime um valor verdadeiro / falso, ou
que imprime todas as soluções possíveis e é terrivelmente lento para entradas grandes. Coloque 'h' no início para imprimir apenas um.
Explicação:
Tente
fonte
Perl 6 , 54 bytes
Pesquisa por força bruta de todos os lados possíveis até um a menos que
a
a área de entrada.^a
é o intervalo de números de 0 aa - 1
.[X] ^a xx 3
reduz, por produto cruzado, três cópias dessa faixa, produzindo todos os trigêmeos de(0, 0, 0)
até(a - 1, a - 1, a - 1)
.first
trigêmeo de forma que a área do triângulo com esses lados seja iguala
, usando a fórmula de Heron .Dentro do bloco de código fornecido para
first
:$_
é o trigêmeo. Ligue(x, y, z)
aqui.(0,|$_)
é o mesmo trio, mas com0
prefixado:(0, x, y, z)
..sum / 2
é metade do perímetro (uma quantidade nomeadas
na expressão usual da fórmula de Heron)..sum / 2 «-« (0, |$_)
é o hiperoperador de subtraçãos
à esquerda e(0, x, y, z)
à direita, dando(s - 0, s - x, s - y, s - z)
.[*]
depois reduz esse quadrupleto com multiplicação, fornecendo o quadrado da área.a * a ==
procura uma área quadrada igual ao quadrado da área especificada.Se nenhum trigêmeo for encontrado,
Nil
(que é falsey) será retornado.fonte
Haskell , 76 bytes
Isso gera uma lista de listas contendo todos os tamanhos integrais possíveis que geram a área correta por força bruta (exibindo a lista vazia, se não houver). A ressalva é que os produz como duplicados por causa dessa divisão no meio, mas sua parte fracionária é sempre 0.
Se você, por algum motivo, não aguenta isso,
Isso produzirá as respostas como uma lista de listas inteiras para
8977 bytes no total ou131 bytes extras. (Graças a Neil)Se você precisar / desejar apenas o primeiro elemento que acabou de colocar
!!0
no final, fornecerá apenas o primeiro elemento se houver números que se apliquem e um erro se não houver nenhum por mais 3 bytes e,take 1
no início, pegará o primeiro elemento sem errar por Mais 6 bytes.Experimente online!
fonte
TI-Basic,
7069 bytesExibe os três comprimentos laterais, se houver um triângulo, gera um erro de sintaxe, se não houver (graças ao
/
no final).-1 byte graças ao comentário de Sean em uma resposta diferente
fonte
Mathematica, 77 bytes
com o Resolver do mathematica
Mathematica, 117 bytes
força bruta
fonte
Area@SSSTriangle[a,b,c]
.Na verdade , 22 bytes
Experimente online!
Explicação:
fonte
Casio Basic, 123 bytes
Solução padrão de força bruta. 122 bytes para o código, 1 byte para especificar
n
como parâmetro.fonte
Wolfram Language (Mathematica) , 59 bytes
Experimente online!
fonte