Triângulos Heronianos Quase Equilateriais

14

Um Quase Equilátero Heronian triângulo é um triângulo com comprimentos inteiros da forma n-1, ne, n+1e também tem uma área inteiro. Os primeiros são:

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

Missão : Gere o programa mais curto que produza o ntriplo. (Dica: esta é uma sequência conhecida).

O vencedor será selecionado em 2 de maio de 2014.

Kyle Kanos
fonte
Pelo que vale, isso é equivalente a uma das equações de Pell mais amplamente estudadas.
Peter Taylor
3
Eu realmente não entendo os votos negativos. Esta é uma tarefa bastante simples, mas não vejo nenhum problema com a pergunta. Mas tenho que dizer (como canhoto) que a restrição é uma das mais estranhas e fáceis de cumprir que já vi.
Level River St
2
@steveverrill, embora eu não tenha diminuído o voto, optei por não votar por causa da restrição inútil. Suspeito que os votos próximos também sejam por causa da restrição: aposto que menos de 10% da população mundial usa o mesmo layout de teclado que Kyle.
Peter Taylor
2
Eu gostei da @KyleKanos restrição, mesmo que as pessoas canhotas nojo me
ardnew
2
@ardnew De todos os lugares, este é um dos menos prováveis ​​que eu esperaria por tais comentários: P
Digital Trauma

Respostas:

6

APL, 15 14 caracteres

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

A mesma abordagem da solução de alefalpha , mas usa floor em vez do termo de correção.

Obrigado ao algoritmshark por apontar que o operador de comutação salva um caractere.

Howard
fonte
1
(⍳3)salva um caractere 0 1 2e tenho certeza de que você pode usar o Commute para fazer isso ⎕*⍨2+√3e salvar outro.
algorithmshark
@algorithmshark Obrigado por essas idéias. Infelizmente, ⍳3produz 1 2 3e, portanto, é um caractere mais longo.
Howard
8

Mathematica, 26, 22, 16 18 caracteres

{0,1,2}+⌊(2+√3)^n⌋
alefalpha
fonte
Golfe um pouco demais: não funcionará na forma atual (veja aqui ).
22414 Howard
5

GolfScript ( 24 21 caracteres)

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

Recebe entrada em stdin, fornece saída para stdout no formato

[3 4 5]

Demonstração online

Observe que eu assumi que o 0º elemento da sequência é [1 2 3](com a área 0), o que eu acho que é consistente com o OEIS A003500 .

Com agradecimentos a Howard por uma economia de 3 caracteres.

Peter Taylor
fonte
Usar (.).)]é dois caracteres mais curto. Além disso, se você começar, 2 4poderá substituir\; com ;e salvar um adicional.
21414 Howard
@ Howard, eu originalmente tinha 2 4e tratado [3 4 5]como o elemento 0, por isso estou envergonhado por não ter descoberto essa maneira alternativa de explorar o deslocamento. Obrigado.
Peter Taylor
2

GNU dc , 30 19 bytes

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

Ele usa o mesmo truque que a resposta da APL do @ Howard, portanto, apenas um termo deve ser calculado. Recebe entrada para n do stdin.

Resultado:

$ 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
fonte
1

Python 77

Uma implementação bastante detalhada em 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
fonte
1
Devemos substituir Npor um valor? Seu programa não pede nenhuma entrada.
precisa saber é o seguinte
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)

Isso usa uma solução recursiva, aproveitando o fato de que (citação da Wikipedia ):

Os valores subsequentes de n podem ser encontrados multiplicando o valor anterior por 4 e subtraindo o valor anterior a esse (52 = 4 × 14 - 4, 194 = 4 × 52 - 14 etc.)

golfer9338
fonte
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 uma função recursiva fque retorna o enésimo termo e uma funçãog que retorna uma matriz contendo o triplo correspondente.

JavaScript - 41 caracteres

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

Espera que o termo a ser calculado seja armazenado na variável global xe produz o triplo para o console.

MT0
fonte
1

CJam, 13 bytes

3,3mq))ri#if+p

A primeira versão do CJam é 10 dias mais antiga que esse desafio, mas não sei se todos os recursos que estou usando estavam presentes naquela época. O desafio está oficialmente fechado de qualquer maneira, então ...

Teste aqui.

Explicação

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
fonte