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,ctiene área
sqrt(s*(s-a)*(s-b)*(s-c))
donde s=(a+b+c)/2es 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
adonde encuentra todas las tuplas de tres enteros entre1ya(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). Cede0si 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 soloFalsees 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,[...]!!0se ahorrarían 3 bytestake 1[..].Intenta todos los triples
tde posibles longitudes laterales, cada uno desde1el áreaa. La fórmula de Heron se usa para verificar si el área coincide con(s-0)(s-x)(s-y)(s-z)==a*adondes=(x+y+z)/2estásum t/2. El producto(s-0)(s-x)(s-y)(s-z)se expresa como unproductelemento 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.findconList.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.Sqrty comparar el valor resultante conA * A?1.0..A [...] 1.0..A [...] 1.0..Acon1.0..A [...] a..A [..] b..Aque 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
ael área de entrada.^aes el rango de números del 0 ala - 1.[X] ^a xx 3reduce, por producto cruzado, tres copias de ese rango, produciendo todos los trillizos de(0, 0, 0)a(a - 1, a - 1, a - 1).firsttriplete 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 con0antepuesto:(0, x, y, z)..sum / 2es la mitad del perímetro (una cantidad que se nombrasen la expresión habitual de la fórmula de Heron)..sum / 2 «-« (0, |$_)es la resta del hiperoperadorsa 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
!!0al 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 1al 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
ncomo parámetro.fuente
Wolfram Language (Mathematica) , 59 bytes
Pruébalo en línea!
fuente