Triangoli heroniani quasi equilateri


14

Un quasi equilatero Heronian triangolo è un triangolo con lunghezze interi della forma n-1, ned n+1e ha anche un'area intero. I primi sono:

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

Quest : Genera il programma più breve che genera il ntriplo. (Suggerimento: questa è una sequenza nota).

Il vincitore sarà selezionato il 2 maggio 2014.


Per quello che vale, questo equivale a una delle equazioni di Pell più ampiamente studiate.
Peter Taylor,

3
Non capisco davvero i downvotes. Questo è un compito abbastanza semplice ma non vedo alcun problema con la domanda. Ma devo dire (come mancino) che la restrizione è una delle più strane e facili da rispettare che abbia mai visto.
Level River St

2
@steveverrill, anche se non ho votato a fondo ho scelto di non votare a causa della restrizione inutile. Sospetto che i voti stretti siano anche dovuti alla restrizione: scommetto che meno del 10% della popolazione mondiale utilizza lo stesso layout di tastiera di Kyle.
Peter Taylor,

2
mi è piaciuta la restrizione @KyleKanos, anche se i mancini mi disgustano
ardnew

2
@ardnew Di tutti i posti, questo è uno dei meno probabili che mi sarei aspettato commenti simili: P
Trauma digitale

Risposte:


6

APL, 15 14 caratteri

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

Stesso approccio di alephalpha della soluzione di ma utilizza il pavimento anziché il termine di correzione.

Grazie all'algoritmo condiviso per aver sottolineato che l'operatore pendolare salva un carattere.


1
(⍳3)salva un carattere 0 1 2, e sono abbastanza sicuro che puoi usare Commute per farlo ⎕*⍨2+√3e salvarne un altro.
algoritmo

@algorithmshark Grazie per quelle idee. Sfortunatamente ⍳3cede 1 2 3e quindi è un carattere in più.
Howard,

8

Mathematica, 26, 22, 16 18 caratteri

{0,1,2}+⌊(2+√3)^n⌋

Un po 'troppo golf: non funzionerà nella forma attuale (vedi qui ).
Howard,

5

GolfScript ( 24 21 caratteri)

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

Accetta input su stdin, fornisce output a stdout nel modulo

[3 4 5]

Demo online

Si noti che ho assunto che il nono elemento della sequenza sia [1 2 3](con area 0), che penso sia coerente con OEIS A003500 .

Grazie a Howard per un risparmio di 3 caratteri.


L'uso (.).)]è più breve di due caratteri. Inoltre, se inizi con 2 4puoi sostituirlo \;con ;e salvarne uno aggiuntivo.
Howard,

@Howard, originariamente avevo 2 4e trattato [3 4 5]come il nono elemento, quindi sono imbarazzato di non aver individuato quel modo alternativo di sfruttare l'offset. Grazie.
Peter Taylor,

2

GNU dc , 30 19 byte

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

Questo utilizza lo stesso trucco della risposta APL di @ Howard, quindi deve essere calcolato solo un termine. Riceve input per n da stdin.

Produzione:

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

1

Python 77

Piuttosto un'implementazione dettagliata in 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]

1
Dovremmo sostituire Ncon un valore? Il tuo programma non richiede alcun input.
golfista 933

1

Python 3, 83 caratteri

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)

Questo utilizza una soluzione ricorsiva, sfruttando il fatto che (citazione da Wikipedia ):

I valori successivi di n possono essere trovati moltiplicando il valore precedente per 4, quindi sottraendo il valore precedente a quello (52 = 4 × 14 - 4, 194 = 4 × 52 - 14, ecc.)


1

JavaScript (ECMAScript 6) - 52 caratteri

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

Definisce una funzione ricorsiva fche restituisce l' ennesimo termine e una funzione gche restituisce un array contenente il triplo corrispondente.

JavaScript - 41 caratteri

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

Si aspetta che il termine da calcolare sia archiviato nella variabile globale xe trasmette il triplo alla console.


1

CJam, 13 byte

3,3mq))ri#if+p

La prima versione di CJam è di 10 giorni più vecchia di questa sfida, ma non so se allora tutte le funzionalità che sto usando fossero presenti. La sfida è ufficialmente chiusa comunque, quindi ...

Provalo qui.

Spiegazione

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.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.