Neredeyse Equilaterial Heronian Üçgenleri


14

Bir neredeyse Eşkenar Heronian üçgen formunun tam sayı uzunlukları ile bir üçgen n-1, nve n+1hem de tam sayı alanı vardır. İlk birkaç tanesi:

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

Görev : Bu üçlüyü çıkaran en kısa programı oluşturun n. (İpucu: bu bilinen bir dizidir).

Kazanan 2 Mayıs 2014'te seçilecek.


Değeri için, bu daha geniş çapta incelenmiş Pell denklemlerinden birine eşdeğerdir.
Peter Taylor

3
Downvotları gerçekten anlamıyorum. Bu oldukça basit bir görev ama soru ile ilgili herhangi bir sorun görmüyorum. Ancak şunu söylemeliyim ki (sol elini kullanan bir kişi olarak), kısıtlamanın şimdiye kadar gördüğüm en garip ve en kolay yöntemlerden biri olduğunu söyleyebilirim.
Level River St

2
@steveverrill, downvote olmasam da anlamsız kısıtlama nedeniyle upvote etmemeyi seçtim. Yakın oyların da kısıtlamadan kaynaklandığından şüpheleniyorum: Dünya nüfusunun% 10'undan daha azının Kyle ile aynı klavye düzenini kullandığına bahse girerim.
Peter Taylor

2
solak insanlar beni tiksinmesine rağmen @KyleKanos kısıtlamasını sevdim
ardnew

2
@ardnew Tüm yerlerden, bu tür handist yorumları beklediğimden en az biri: P
Digital Trauma

Yanıtlar:


6

APL, 15 14 karakter

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

Alephalpha'nın çözümü ile aynı yaklaşım, ancak düzeltme terimi yerine zemin kullanır.

İşe gidip gelme operatörünün bir karakter kaydettiğine işaret ettiği için algoritma paylaşımına teşekkür ederiz .


1
(⍳3)bir karakter kaydettiğinden 0 1 2eminim ve gidip ⎕*⍨2+√3bir başkasını kaydetmek için Commute'u kullanabilirsiniz .
algorithmmshark

@algorithmshark Bu fikirler için teşekkür ederim. Ne yazık ki ⍳3verim 1 2 3ve dolayısıyla bir karakter daha uzundur.
Howard

8

Mathematica, 26, 22, 16 18 karakter

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

Biraz fazla golf: mevcut formda çalışmaz ( buraya bakın ).
Howard

5

GolfScript ( 24 21 karakter)

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

Stdin üzerine girdi alır, stdout'a çıktı verir

[3 4 5]

Çevrimiçi demo

Dizinin 0 öğesinin [1 2 3](0 alanıyla) olduğunu varsaydığım ve OEIS A003500 ile tutarlı olduğunu düşünüyorum .

Howard'a 3 karakterlik tasarruf için teşekkürler .


Kullanmak (.).)]iki karakter daha kısadır. Eğer başlamak Ayrıca, eğer 2 4size yerini alabilir \;ile ;ve ilave biri kaydet.
Howard

@Howard, başlangıçta 0. element olarak 2 4davrandım ve tedavi [3 4 5]ettim, bu yüzden ofseti kullanmak için bu alternatif yolu fark etmemekten utanıyorum. Teşekkürler.
Peter Taylor

2

GNU dc , 30 19 bayt

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

Bu @ Howard'ın APL cevabı ile aynı numarayı kullanır, bu yüzden sadece bir terim hesaplanmalıdır. Stdin'den n için girdi alır.

Çıktı:

$ 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

Python'da oldukça ayrıntılı bir uygulama

[(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
NBir değerle değiştirmemiz gerekiyor mu? Programınız herhangi bir girdi istemiyor.
golfer9338

1

Python 3, 83 karakter

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)

Bu, ( Wikipedia'dan alıntı ) gerçeğinden yararlanarak özyinelemeli bir çözüm kullanır :

Sonraki n değerleri, bir önceki değerin 4 ile çarpılması ve ardından bir önceki değerin çıkarılmasıyla bulunabilir (52 = 4 × 14 - 4, 194 = 4 × 52 - 14, vb.)


1

JavaScript (ECMAScript 6) - 52 Karakter

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

Yinelemeli işlevi tanımlar fn döner inci terimi ve bir işlev gkarşılık gelen üç içeren bir dizi döner.

JavaScript - 41 Karakter

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

Hesaplanacak terimin global değişkende saklanmasını bekler ve xkonsolun üçlü değerini verir.


1

CJam, 13 bayt

3,3mq))ri#if+p

CJam'ın ilk sürümü bu meydan okumadan 10 gün daha eski, ancak kullandığım tüm özelliklerin o zamanlar mevcut olup olmadığını bilmiyorum. Zorluk yine de resmen kapalı, bu yüzden ...

Burada test edin.

açıklama

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.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.