Triangles héroniens presque équilatéraux

14

Un Presque équilatéral Heronian triangle est un triangle dont les longueurs entières de la forme n-1, net n+1et a également la zone entière. Les premiers sont:

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

Quête : générer le programme le plus court qui génère len triplet. (Indice: il s'agit d'une séquence connue).

Le gagnant sera sélectionné le 2 mai 2014.

Kyle Kanos
la source
Pour ce que ça vaut, cela équivaut à l'une des équations de Pell les plus largement étudiées.
Peter Taylor
3
Je ne comprends pas vraiment les votes négatifs. C'est une tâche assez simple mais je ne vois aucun problème avec la question. Mais je dois dire (en tant que gaucher) que la restriction est l'une des plus étranges et des plus faciles à respecter que j'aie jamais vues.
Level River St
2
@steveverrill, bien que je n'aie pas downvote, j'ai choisi de ne pas upvote en raison de la restriction inutile. Je soupçonne que les votes serrés sont également dus à la restriction: je parie que moins de 10% de la population mondiale utilise la même disposition de clavier que Kyle.
Peter Taylor
2
j'ai aimé la restriction @KyleKanos, même si les gauchers me dégoûtent
ardnew
2
@ardnew De tous les endroits, c'est l'un des moins susceptibles que j'attende de tels commentaires de bricoleur: P
Digital Trauma

Réponses:

6

APL, 15 14 carats

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

Même approche que la solution d' alephalpha mais utilise le plancher au lieu du terme de correction.

Merci à algorithmshark d' avoir souligné que l'opérateur de trajet enregistre un caractère.

Howard
la source
1
(⍳3)enregistre un caractère 0 1 2, et je suis sûr que vous pouvez utiliser Commute pour le faire ⎕*⍨2+√3et en enregistrer un autre.
algorithmshark
@algorithmshark Merci pour ces idées. Malheureusement ⍳3cède 1 2 3et est donc un caractère de plus.
Howard
8

Mathematica, 26, 22, 16 18 caractères

{0,1,2}+⌊(2+√3)^n⌋
alephalpha
la source
Un peu trop de golf: ça ne marchera pas sous la forme actuelle (voir ici ).
Howard
5

GolfScript ( 24 21 caractères)

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

Prend l'entrée sur stdin, donne la sortie à stdout sous la forme

[3 4 5]

Démo en ligne

Notez que j'ai supposé que le 0ème élément de la séquence est [1 2 3](avec la zone 0), ce qui, je pense, est cohérent avec OEIS A003500 .

Merci à Howard pour une économie de 3 caractères.

Peter Taylor
la source
L'utilisation (.).)]est de deux caractères plus courte. De plus, si vous commencez avec 2 4vous pouvez remplacer \;avec ;et enregistrer une supplémentaire.
Howard
@Howard, j'avais à l'origine 2 4et traité [3 4 5]comme le 0ème élément, donc je suis gêné de ne pas avoir repéré cette manière alternative d'exploiter l'offset. Merci.
Peter Taylor
2

GNU dc , 30 19 octets

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

Cela utilise la même astuce que la réponse APL de @ Howard, donc un seul terme doit être calculé. Prend l'entrée pour n de stdin.

Production:

$ 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
$ 
Traumatisme numérique
la source
1

Python 77

Une implémentation assez détaillée 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
la source
1
Sommes-nous censés remplacer Npar une valeur? Votre programme ne demande aucune entrée.
golfer9338
1

Python 3, 83 caractères

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)

Cela utilise une solution récursive, profitant du fait que (citation de Wikipedia ):

Les valeurs suivantes de n peuvent être trouvées en multipliant la valeur précédente par 4, puis en soustrayant la valeur antérieure à celle-là (52 = 4 × 14 - 4, 194 = 4 × 52 - 14, etc.)

golfeur9338
la source
1

JavaScript (ECMAScript 6) - 52 caractères

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

Définit une fonction récursive fqui retourne le n ème terme et une fonction gqui retourne un tableau contenant le triple correspondant.

JavaScript - 41 caractères

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

Attend que le terme à calculer soit stocké dans la variable globale xet renvoie le triple à la console.

MT0
la source
1

CJam, 13 octets

3,3mq))ri#if+p

La première version de CJam est 10 jours plus ancienne que ce défi, mais je ne sais pas si toutes les fonctionnalités que j'utilise étaient présentes à l'époque. Cependant, le défi est officiellement clos, alors ...

Testez-le ici.

Explication

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
la source