Prawie równoboczne trójkąty herońskie

14

Prawie Heronian równoboczny trójkąt jest trójkąt o długości całkowitej z postaci n-1, ni n+1, a także ma powierzchnię całkowitą. Pierwsze kilka to:

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

Zadanie : Wygeneruj najkrótszy program, który generuje ntaki potrójny. (Wskazówka: jest to znana sekwencja).

Zwycięzca zostanie wybrany 2 maja 2014 r.

Kyle Kanos
źródło
Co jest warte, jest to równoważne z jednym z szerzej badanych równań Pell.
Peter Taylor
3
Naprawdę nie rozumiem głosów negatywnych. To dość proste zadanie, ale nie widzę problemu z tym pytaniem. Ale muszę powiedzieć (jako osoba leworęczna), że ograniczenie jest jednym z najdziwniejszych i najłatwiejszych do spełnienia, jakie kiedykolwiek widziałem.
Level River St
2
@steveverrill, chociaż nie głosowałem, zdecydowałem się nie głosować z powodu bezsensownego ograniczenia. Podejrzewam, że bliskie głosy wynikają również z ograniczenia: założę się, że mniej niż 10% światowej populacji używa tego samego układu klawiatury co Kyle.
Peter Taylor
2
podobało mi się ograniczenie @KyleKanos, mimo że ludzie leworęczni mnie obrzydzają
nowy
2
@ardnew Ze wszystkich miejsc, jest to jedno z najmniej prawdopodobne, że spodziewałbym się takich komentarzy handist: P
Digital Trauma

Odpowiedzi:

6

APL, 15 14 postaci

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

To samo podejście, co rozwiązanie alephalpha , ale używa parametru floor zamiast terminu korygującego.

Dziękujemy algorytmshark za wskazanie, że operator dojeżdżający do pracy oszczędza jeden znak.

Howard
źródło
1
(⍳3)zapisuje znak 0 1 2, i jestem prawie pewien, że możesz użyć dojazdy do pracy, aby zrobić to ⎕*⍨2+√3i uratować inny.
algorytmshark
@al algorytmshark Dziękujemy za te pomysły. Niestety ⍳3plonuje, 1 2 3a zatem jest o jeden char dłużej.
Howard
8

Mathematica, 26, 22, 16 18 znaków

{0,1,2}+⌊(2+√3)^n⌋
alephalpha
źródło
Trochę za dużo gry w golfa: nie będzie działać w obecnej formie (patrz tutaj ).
Howard
5

GolfScript ( 24 21 znaków)

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

Pobiera dane wejściowe na standardowe wejście, podaje dane wyjściowe na standardowe wejście w formie

[3 4 5]

Demo online

Zauważ, że założyłem, że 0 elementem sekwencji jest [1 2 3](z obszarem 0), co moim zdaniem jest zgodne z OEIS A003500 .

Dzięki Howard za 3-znakową oszczędność.

Peter Taylor
źródło
Używanie (.).)]jest o dwa znaki krótsze. Ponadto, jeśli zaczniesz z 2 4was może zastąpić \;z ;zaoszczędzisz dodatkowy jeden.
Howard
@Howard, pierwotnie miałem 2 4i traktowałem [3 4 5]jako element 0, więc wstydzę się, że nie zauważyłem tego alternatywnego sposobu wykorzystania przesunięcia. Dzięki.
Peter Taylor
2

GNU dc , 30 19 bajtów

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

Używa tej samej sztuczki co odpowiedź APL @ Howarda, więc należy obliczyć tylko jeden termin. Pobiera dane wejściowe dla n ze standardowego wejścia.

Wynik:

$ 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
$ 
Cyfrowa trauma
źródło
1

Python 77

Całkiem pełna implementacja w Pythonie

[(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
źródło
1
Czy mamy zastąpić Nwartość? Twój program nie prosi o żadne dane wejściowe.
golfer9338
1

Python 3, 83 znaki

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)

Wykorzystuje to rozwiązanie rekurencyjne, wykorzystując fakt, że (cytat z Wikipedii ):

Kolejne wartości n można znaleźć, mnożąc poprzednią wartość przez 4, a następnie odejmując wartość przed tą (52 = 4 × 14–4, 194 = 4 × 52–14 itd.)

golfer9338
źródło
1

JavaScript (ECMAScript 6) - 52 znaki

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

Definiuje funkcję rekurencyjną, fktóra zwraca n- ty termin i funkcjęg która zwraca tablicę zawierającą odpowiedni potrójny.

JavaScript - 41 znaków

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

Oczekuje, że obliczony termin zostanie zapisany w zmiennej globalnej xi wyśle ​​potrójnie do konsoli.

MT0
źródło
1

CJam, 13 bajtów

3,3mq))ri#if+p

Pierwsza wersja CJam jest o 10 dni starsza od tego wyzwania, ale nie wiem, czy wszystkie funkcje, z których korzystam, były wtedy obecne. Mimo to wyzwanie zostało oficjalnie zamknięte, więc ...

Sprawdź to tutaj.

Wyjaśnienie

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
źródło