Tarea: Dado el área de un triángulo, encuentre un triángulo heroniano con esa área. Se permite cualquier triángulo heroniano con el área especificada.
Un triángulo heroniano es un triángulo con lados enteros y área entera . Por la fórmula de Heron, un triángulo con lados de longitud a,b,c
tiene área
sqrt(s*(s-a)*(s-b)*(s-c))
donde s=(a+b+c)/2
es la mitad del perímetro del triángulo. Esto también se puede escribir como
sqrt((a+b+c)*(-a+b+c)*(a-b+c)*(a+b-c)) / 4
Si no existe tal triángulo, salida con un valor de falsey consistente.
Entrada: Un entero positivo único que representa el área del triángulo.
Salida: Cualquier longitud de tres lados para tal triángulo O un valor falso.
Ejemplos:
Input -> Output
6 -> 3 4 5
24 -> 4 15 13
114 -> 37 20 19
7 -> error
Este es el código de golf, la respuesta más corta en bytes gana.
Respuestas:
Jalea ,
1716 bytes-1 byte gracias a Erik el outgolfer (utiliza el rápido,
¥
)Aplicación de fuerza bruta de la fórmula de Heron.
Pruébalo en línea! (alcanza el tiempo de espera de 60 para el caso de 114 pruebas. Toma 3m 30s localmente - comprueba 114 3 = 1,481,544 triples)
¿Cómo?
Una verdadera solución de golf: dado un área
a
donde encuentra todas las tuplas de tres enteros entre1
ya
(incluso con triángulos repetidos y sin área), obtiene su área y filtros para aquellos con el área deseada (ni siquiera se detiene tan pronto se encuentra uno, los atraviesa a todos y aparece el primer resultado después). Cede0
si no existe ninguno.fuente
ç
conÇ⁼¥
y retire la segunda línea por completo.JavaScript (ES7),
10910210098 bytesDevuelve una matriz de 3 enteros o
false
. Al igual que la respuesta de Jelly , esta es la fuerza bruta que obliga a la fórmula de Heron.Casos de prueba
Mostrar fragmento de código
Versión recursiva, 83 bytes.
Devuelve una matriz de 3 enteros o arroja un error de recursión. Lamentablemente, solo funciona para entradas pequeñas.
Manifestación
Mostrar fragmento de código
fuente
Haskell , 69 bytes
Pruébalo en línea!
Produce un singleton de una lista de tres lados triangulares como
[[3.0,4.0,5.0]]
. Las entradas imposibles dan[]
. Técnicamente soloFalse
es Falsey para Haskell, pero debido a que Haskell requiere que todas las salidas posibles sean del mismo tipo, no se puede usar. Si se pudiera utilizar un error como Falsey,[...]!!0
se ahorrarían 3 bytestake 1[..]
.Intenta todos los triples
t
de posibles longitudes laterales, cada uno desde1
el áreaa
. La fórmula de Heron se usa para verificar si el área coincide con(s-0)(s-x)(s-y)(s-z)==a*a
dondes=(x+y+z)/2
estásum t/2
. El producto(s-0)(s-x)(s-y)(s-z)
se expresa como unproduct
elemento tomado de0:t
, es decir, el triple y el 0.fuente
F #,
170156152 bytesPruébalo en línea!
"Ungolfed"
Si no se encuentran resultados, el programa fallará. Si esto no se desea, tengo que reemplazar
List.find
conList.filter
(+2 bytes) que producirá una lista vacía en caso de que no se encuentre nada oList.tryFind
(+3 bytes), devolviendo Ninguno en caso de que no se encuentre ningún triángulo.Siempre encuentro que una versión F # de golf sigue siendo razonablemente legible.
fuente
System.Math.Sqrt
y comparar el valor resultante conA * A
?1.0..A [...] 1.0..A [...] 1.0..A
con1.0..A [...] a..A [..] b..A
que debe guardar un par de bytes y que la velocidad un poco (si funciona, no tengo muy mínima experiencia # F).Python 2 (PyPy) ,
131123118 bytesPruébalo en línea!
Si bien esto también funciona en CPython, PyPy es mucho más rápido y puede calcular el triángulo para 114 en el límite de tiempo en TIO.
Tiempos de mi máquina:
fuente
Pyth - 23 bytes
Que imprime un valor verdadero / falso, o
que imprime todas las soluciones posibles y es terriblemente lento para entradas grandes. Ponga 'h' al principio para imprimir solo uno.
Explicación:
Intentalo
fuente
Perl 6 , 54 bytes
Búsqueda de fuerza bruta de todos los lados posibles hasta uno menos que
a
el área de entrada.^a
es el rango de números del 0 ala - 1
.[X] ^a xx 3
reduce, por producto cruzado, tres copias de ese rango, produciendo todos los trillizos de(0, 0, 0)
a(a - 1, a - 1, a - 1)
.first
triplete de manera que el área del triángulo con esos lados sea iguala
, usando la fórmula de Heron .Dentro del bloque de código dado a
first
:$_
es el triplete Llámalo(x, y, z)
aquí.(0,|$_)
es el mismo triplete pero con0
antepuesto:(0, x, y, z)
..sum / 2
es la mitad del perímetro (una cantidad que se nombras
en la expresión habitual de la fórmula de Heron)..sum / 2 «-« (0, |$_)
es la resta del hiperoperadors
a la izquierda y(0, x, y, z)
a la derecha, dando(s - 0, s - x, s - y, s - z)
.[*]
luego reduce ese cuadruplete con multiplicación, dando el cuadrado del área.a * a ==
busca un área cuadrada igual al cuadrado del área dada.Si no se encuentra un triplete,
Nil
(que es falsey) se devuelve.fuente
Haskell , 76 bytes
Esto genera una lista de listas que contienen todos los tamaños integrales posibles que generan el área correcta mediante la fuerza bruta (generando la lista vacía si no hay ninguna). La advertencia es que los genera como dobles debido a esa división en el medio, pero su parte fraccionaria siempre es 0.
Si por alguna razón no puedes soportar eso,
Esto generará las respuestas como una lista de listas enteras para
8977 bytes en total o131 bytes adicionales. (Gracias a Neil)Si necesita / desea solo el primer elemento que acaba de poner
!!0
al final le dará solo el primer elemento si hay números que se aplican y un error si no hay ninguno para 3 bytes más ytake 1
al principio tomará el primer elemento sin error para 6 bytes más.Pruébalo en línea!
fuente
TI-Basic,
7069 bytesMuestra las tres longitudes laterales si hay un triángulo, arroja un error de sintaxis si no lo hay (gracias al
/
final).-1 byte gracias al comentario de Sean sobre una respuesta diferente
fuente
Mathematica, 77 bytes
con la resolución de Mathica
Mathematica, 117 bytes
fuerza bruta
fuente
Area@SSSTriangle[a,b,c]
.En realidad , 22 bytes
Pruébalo en línea!
Explicación:
fuente
Casio Basic, 123 bytes
Solución estándar de fuerza bruta. 122 bytes para el código, 1 byte para especificar
n
como parámetro.fuente
Wolfram Language (Mathematica) , 59 bytes
Pruébalo en línea!
fuente