几乎等平的苍鹭三角形


14

一个几乎等边海伦三角形是与以下形式的整数长度的三角形n-1nn+1并且还具有整数区域。前几个是:

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

任务:生成最短的程序,输出该n三元组。(提示:这是一个已知序列)。

获奖者将于2014年5月2日入选。


就其价值而言,它等效于研究更广泛的佩尔方程之一。
彼得·泰勒

3
我不太了解下降表决。这是一个相当简单的任务,但我认为该问题没有任何问题。但我必须说(作为左撇子),这种限制是我见过的最奇怪和最容易遵守的限制之一。
级圣河

2
@steveverrill,尽管我没有投票,但由于没有意义的限制,我还是选择不投票。我怀疑亲密的投票也是由于这种限制:我敢打赌,全世界不到10%的人口使用与凯尔相同的键盘布局。
彼得·泰勒

2
我喜欢限制@KyleKanos,即使惯用左手的人令我讨厌
ardnew 2014年

2
@ardnew在所有地方中,这是我最不希望看到这样的手写评论的地方之一:P
Digital Trauma

Answers:


6

APL,15 14个字符

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

alephalpha的解决方案相同的方法,但是使用floor而不是更正项。

感谢algorithmshark指出通勤者节省了一个字符。


1
(⍳3)保存一个char结束0 1 2,我很确定您可以使用Commute使其⎕*⍨2+√3保存并保存另一个。
algorithmhark

@algorithmshark谢谢您的建议。不幸的是,⍳3产量高出1 2 3一个字符。
2014年

8

数学,26,22,16 18个字符

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

打高尔夫球有点过多:它不能以当前形式使用(请参阅此处)。
霍华德

5

GolfScript(24 21个字符)

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

在stdin上接受输入,以以下形式将输出提供给stdout

[3 4 5]

在线演示

请注意,我假设序列的第0个元素是[1 2 3](区域0),我认为与OEIS A003500一致。

感谢霍华德节省了3个字符。


使用(.).)]要短两个字符。此外,如果您从头开始,则2 4可以替换\;;并保存另外的一个。
霍华德

@Howard,我最初2 4将其[3 4 5]视为第0个元素,因此我很尴尬,没有发现利用偏移量的另一种方法。谢谢。
彼得·泰勒

2

GNU dc30 19字节

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

这使用与@Howard 的APL答案相同的技巧,因此仅需计算一项。从标准输入中获取n的输入。

输出:

$ 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中相当详细的实现

[(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
我们应该N用一个值代替吗?您的程序不要求任何输入。
golfer9338

1

Python 3,83个字符

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)

这利用了一个递归解决方案,利用了以下事实(引自Wikipedia):

n的后续值可以通过将前一个值乘以4,然后减去该值之前的值来找到(52 = 4×14-4,194 = 4×52-14,等等)。


1

JavaScript(ECMAScript 6)-52个字符

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

定义一个f返回第n 项的递归函数和一个g返回包含相应三元组的数组的函数。

JavaScript-41个字符

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

期望将要计算的项存储在全局变量中x,并将三元组输出到控制台。


1

CJam,13个字节

3,3mq))ri#if+p

CJam的第一个版本比此挑战要早10天,但是我不知道我当时使用的所有功能是否都已经存在。无论如何,挑战已经正式结束,所以...

在这里测试。

说明

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.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.