Triángulos Heronianos Casi Equilateriales

14

Un Casi equilátero Heronian triángulo es un triángulo con longitudes enteros de la forma n-1, ny n+1y también tiene el área de número entero. Los primeros son:

 3,  4,  5 ->    6
13, 14, 15 ->   84
51, 52, 53 -> 1170

Misión : Generar el programa más corto que genere el ntriple. (Sugerencia: esta es una secuencia conocida).

El ganador será seleccionado el 2 de mayo de 2014.

Kyle Kanos
fuente
Por lo que vale, esto es equivalente a una de las ecuaciones de Pell más ampliamente estudiadas.
Peter Taylor
3
Realmente no entiendo los votos negativos. Esta es una tarea bastante simple, pero no veo ningún problema con la pregunta. Pero tengo que decir (como zurdo) que la restricción es una de las más raras y fáciles de cumplir que he visto.
Level River St
2
@steveverrill, aunque no voté en contra, elegí no hacerlo debido a la restricción inútil. Sospecho que los votos cerrados también se deben a la restricción: apuesto a que menos del 10% de la población mundial usa la misma distribución de teclado que Kyle.
Peter Taylor
2
Me gustó la @KyleKanos de restricción, a pesar de que las personas zurdas Me das asco
ardnew
2
@ardnew De todos los lugares, este es uno de los menos probables que esperaría tales comentarios manuales: P
Digital Trauma

Respuestas:

6

APL, 15 14 caracteres

0 1 2+⌊⎕*⍨2+√3

El mismo enfoque que la solución de alephalpha pero usa piso en lugar del término de corrección.

Gracias a Algoritmshark por señalar que el operador de viaje ahorra un carácter.

Howard
fuente
1
(⍳3)guarda un char 0 1 2, y estoy bastante seguro de que puedes usar Commute para hacerlo ⎕*⍨2+√3y guardar otro.
algorithmshark
@algorithmshark Gracias por esas ideas. Lamentablemente ⍳3cede 1 2 3y por lo tanto es un char más largo.
Howard
8

Mathematica, 26, 22, 16 18 caracteres

{0,1,2}+⌊(2+√3)^n⌋
alephalpha
fuente
Demasiado golf: no funcionará en la forma actual (ver aquí ).
Howard
5

GolfScript ( 24 21 caracteres)

2 4@~{.4*@-}*;.(\.)]p

Toma entrada en stdin, da salida a stdout en el formulario

[3 4 5]

Demostración en línea

Tenga en cuenta que he asumido que el elemento 0 de la secuencia es [1 2 3](con área 0), lo que creo que es coherente con OEIS A003500 .

Gracias a Howard por un ahorro de 3 caracteres.

Peter Taylor
fuente
El uso (.).)]es dos caracteres más cortos. Por otra parte, si se comienza con 2 4que puede reemplazar \;con ;y guardar una adicional.
Howard
@Howard, originalmente tenía 2 4y traté [3 4 5]como el elemento 0, así que me da vergüenza no haber descubierto esa forma alternativa de explotar el desplazamiento. Gracias.
Peter Taylor
2

GNU dc , 30 19 bytes

9k3v2+?^0k1/p1+p1+p

Utiliza el mismo truco que la respuesta APL de @ Howard, por lo que solo se debe calcular un término. Toma entrada para n desde stdin.

Salida:

$ dc -e '9k3v2+?^0k1/p1+p1+p' <<< 1
3
4
5
$ dc -e '9k3v2+?^0k1/p1+p1+p' <<< 2
13
14
15
$ dc -e '9k3v2+?^0k1/p1+p1+p' <<< 3
51
52
53
$ 
Trauma digital
fuente
1

Python 77

Una implementación bastante detallada en Python

[(a-1,a,a+1)for a in(int((2+3**.5)**t+(2-3**.5)**t+.1)for t in range(N))][-1]
Abhijit
fuente
1
¿Se supone que debemos reemplazar Ncon un valor? Su programa no solicita ninguna entrada.
golfista9338
1

Python 3, 83 caracteres

f=lambda t:4*f(t-1)-f(t-2)if t>2 else(4,14)[t-1];n=f(int(input()));print(n-1,n,n+1)

Esto utiliza una solución recursiva, aprovechando el hecho de que (cita de Wikipedia ):

Los valores subsiguientes de n se pueden encontrar multiplicando el valor anterior por 4, luego restando el valor anterior a ese (52 = 4 × 14 - 4, 194 = 4 × 52 - 14, etc.)

golfista9338
fuente
1

JavaScript (ECMAScript 6) - 52 caracteres

f=x=>x?--x?4*f(x)-f(x-1):4:2
g=x=>[a=f(x)-1,a+1,a+2]

Define una función recursiva fque devuelve el enésimo término y una función gque devuelve una matriz que contiene el triple correspondiente.

JavaScript: 41 caracteres

for(a=2,b=4;--x;)b=-a+4*(a=b);[a-1,a,a+1]

Espera que el término a calcular se almacene en la variable global xy envía el triple a la consola.

MT0
fuente
1

CJam, 13 bytes

3,3mq))ri#if+p

La primera versión de CJam es 10 días más antigua que este desafío, pero no sé si todas las características que estoy usando han estado presentes en ese momento. Sin embargo, el desafío está oficialmente cerrado, así que ...

Pruébalo aquí.

Explicación

3mq            e# Push √3.
   ))          e# Increment twice.
     ri        e# Read input and convert to integer.
       #       e# Raise 2+√3 to that power.
        i      e# Convert to integer, truncating the result.
         3,    e# Push [0 1 2]
           f+  e# Add the previous number to each of these.
             p e# Pretty-print the result.
Martin Ender
fuente