编码高尔夫:生成帕斯卡三角形

37

用尽可能少的代码生成大小为N的 Pascal三角形 的列表(或者打印,我不介意!)

这是我用Python 2.6一个技巧尝试的结果(只需118个字符):

c,z,k=locals,[0],'_[1]'
p=lambda n:[len(c()[k])and map(sum,zip(z+c()[k][-1],c()[k][-1]+z))or[1]for _ in range(n)]

解释:

  • 当长度为0时,列表推导式的第一个元素是[1]
  • 下一个元素是通过以下方式获得的:
  • 取前一个列表并创建两个新列表,一个在开头填充0,另一个在末尾填充0。
    • 例如,对于第二步,我们取[1]并创建[0,1][1,0]
  • 逐个元素将两个新列表相加
    • 例如,我们创建一个新列表[(0,1),(1,0)]并使用sum映射。
  • 重复n次,完成。

用法(带漂亮打印,实际上是出自Code Golf):

result = p(10)
lines = [" ".join(map(str, x)) for x in result]
for i in lines:
    print i.center(max(map(len, lines)))

输出:

             1             
            1 1            
           1 2 1           
          1 3 3 1          
         1 4 6 4 1         
       1 5 10 10 5 1       
      1 6 15 20 15 6 1     
    1 7 21 35 35 21 7 1    
   1 8 28 56 70 56 28 8 1  
1 9 36 84 126 126 84 36 9 1

3
如果这个被关闭了,我会投票支持重新开放。我喜欢代码高尔夫,但我不明白为什么有人对它看不惯。请注意,翻译过程中保留原义,使语言更通俗易懂。 - Kenan Banks
2
也许只是我个人的看法,但是如果你的编程语言无法解析XML文件,我就不会点赞。 - Kenan Banks
3
@fortran,我对两者都很熟悉。我的意思是,专门用于代码高尔夫的语言,例如K和J,在代码高尔夫问题中获得最多的赞,但你永远不会在其他情况下使用它们。比起20个字符的J解决方案,我更加钦佩一个50个字符的C解决方案。 - Kenan Banks
2
@Triptych:K和J不是专门用于代码高尔夫的语言。此外,J似乎有用于XML的模块,例如http://www.jsoftware.com/jwiki/Addons/xml/sax。 - Jimmy
2
@Triptych:那么金融行业一定在进行很多代码高尔夫比赛了:http://kx.com/Customers/end-user-customers.php - earl
显示剩余4条评论
23个回答

0

Perl,63个字符:

for(0..9){push@z,1;say"@z";@z=(1,map{$z[$_-1]+$z[$_]}(1..$#z))}

0

我的C++尝试(378c)。和其他帖子相比还差得远..但我为自己独立解决问题感到骄傲=)

int* pt(int n)
{
  int s=n*(n+1)/2;
  int* t=new int[s];

  for(int i=0;i<n;++i)
    for(int j=0;j<=i;++j)
      t[i*n+j] = (!j || j==i) ? 1 : t[(i-1)*n+(j-1)] + t[(i-1)*n+j];
  return t;
}

int main()
{
  int n,*t;
  std::cin>>n;
  t=pt(n);

  for(int i=0;i<n;++i)
  {
    for(int j=0;j<=i;j++)
      std::cout<<t[i*n+j]<<' ';
    std::cout<<"\n";
  }
}

代码高尔夫的目的是编写尽可能短的程序 xD,请至少尝试删除多余的空格 :-p - fortran
我删除了大部分空格并进行了其他小的更改。 - Stephen Brown

0
以下是一个Scala函数,返回一个List[List[Int]]。没有任何漂亮的打印或其他内容。有什么建议改进吗?(我知道它不够高效,但那不是主要问题,对吧?)。145℃。
def p(n: Int)={def h(n:Int):List[Int]=n match{case 1=>1::Nil;case _=>(0::h(n-1) zipAll(h(n-1),0,0)).map{n=>n._1+n._2}};(1 to n).toList.map(h(_))}

或者也许:
def pascal(n: Int) = {
  def helper(n: Int): List[Int] = n match {
    case 1 => 1 :: List()
    case _ => (0 :: helper(n-1) zipAll (helper(n-1),0,0)).map{ n => n._1 + n._2 }
  }
  (1 to n).toList.map(helper(_))
}

(我是Scala的新手,所以请对我好一点:D)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接