37

リストのリストを生成 (または印刷、私は気にしません)可能な限り最小限のコード行で、サイズ Nのパスカルの三角形を生成します!

これが私の試みです(トリックを使用して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]
  • 次の要素は次の方法で取得されます。
  • 前のリストを取得して 2 つのリストを作成します。1 つは先頭に 0 をパディングし、もう 1 つは最後にパディングします。
    • たとえば、2 番目のステップでは、取り[1]、作成[0,1]し、[1,0]
  • 2 つの新しいリストを要素ごとに合計する
    • たとえば、新しいリスト[(0,1),(1,0)]を作成し、合計でマップします。
  • n回繰り返すだけです。

使用法 (かなりの印刷で、実際には code-golf xD から):

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
4

23 に答える 23

17

Kウィキペディア)、15文字:

p:{x{+':x,0}\1}

出力例:

  p 10
(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
 1 10 45 120 210 252 210 120 45 10 1)

また、簡単に説明できます。

p:{x {+':x,0} \ 1}
   ^ ^------^ ^ ^
   A    B     C D
  • p暗黙のパラメータを取る関数xです。

  • p(C)無名関数を(B)x回(A)1(D)から開始して展開します。

  • 匿名関数は、単純にリストxを取得し、値の隣接する各ペア( )0を追加して結果を返します。たとえば、から始めて、ペアを追加し、を与えます。+':(1 2 1)(1 2 1 0)(1 1+2 2+1 1+0)(1 3 3 1)


更新:別の2文字を削るK4に適応。参考までに、元のK3バージョンは次のとおりです。

p:{x{+':0,x,0}\1}
于 2009-08-07T00:12:34.037 に答える
15

J、APL ファミリーの別の言語、9 文字:

p=:!/~@i.

これは、J の組み込みの「組み合わせ」動詞を使用します。

出力:

   p 10
1 1 1 1 1  1  1  1  1   1
0 1 2 3 4  5  6  7  8   9
0 0 1 3 6 10 15 21 28  36
0 0 0 1 4 10 20 35 56  84
0 0 0 0 1  5 15 35 70 126
0 0 0 0 0  1  6 21 56 126
0 0 0 0 0  0  1  7 28  84
0 0 0 0 0  0  0  1  8  36
0 0 0 0 0  0  0  0  1   9
0 0 0 0 0  0  0  0  0   1
于 2009-08-07T11:22:37.227 に答える
12

Cで69C:

f(int*t){int*l=t+*t,*p=t,r=*t,j=0;for(*t=1;l<t+r*r;j=*p++)*l++=j+*p;}

次のように使用します。

int main()
{
#define N 10
    int i, j;
    int t[N*N] = {N};

    f(t);

    for (i = 0; i < N; i++)
    {
        for (j = 0; j <= i; j++)
            printf("%d ", t[i*N + j]);
        putchar('\n');
    }
    return 0;
}
于 2009-08-07T00:59:26.923 に答える
9

F# : 81 文字

let f=bigint.Factorial
let p x=[for n in 0I..x->[for k in 0I..n->f n/f k/f(n-k)]]

説明: 私は怠け者で、Haskell や K のプログラマーほど賢くはありません。そのため、単純なルートを採用しました。パスカルの三角形の各要素は、行 n と列 k を使用して一意に識別できます。ここで、各要素の値は次のとおりです。n!/(k! (n-k)!.

于 2009-08-07T00:58:59.527 に答える
7

Python: 75 文字

def G(n):R=[[1]];exec"R+=[map(sum,zip(R[-1]+[0],[0]+R[-1]))];"*~-n;return R
于 2009-08-07T00:43:41.007 に答える
4

短いプロローグ バージョン (164 ではなく 112):

n([X],[X]).
n([H,I|T],[A|B]):-n([I|T],B),A is H+I.
p(0,[[1]]):-!.
p(N,[R,S|T]):-O is N-1,p(O,[S|T]),n([0|S],R).
于 2009-11-17T10:12:07.307 に答える
3

別の刺し傷(python):

def pascals_triangle(n):
    x=[[1]]
    for i in range(n-1):
        x.append(list(map(sum,zip([0]+x[-1],x[-1]+[0]))))
    return x
于 2011-01-16T18:27:23.677 に答える
2

VBA/VB6 (書式付き 392 文字)

Public Function PascalsTriangle(ByVal pRows As Integer)

Dim iRow As Integer
Dim iCol As Integer
Dim lValue As Long
Dim sLine As String

  For iRow = 1 To pRows
    sLine = ""
    For iCol = 1 To iRow
      If iCol = 1 Then
        lValue = 1
      Else
        lValue = lValue * (iRow - iCol + 1) / (iCol - 1)
      End If
      sLine = sLine & " " & lValue
    Next
    Debug.Print sLine
  Next

End Function
于 2009-08-18T20:11:56.530 に答える
2

スキーム — 100 文字の圧縮バージョン

(define(P h)(define(lir)(if(> ih)'()(cons r(l(1+ i)(map +(cons 0 r)(append r '(0)))))) (l1'(1)))

これは、より読みやすい形式 (269 文字) です。

(定義 (パスカルの高さ)
  (define (次の行の行)
    (マップ +
         (短所0行)
         (追加行 '(0))))

  (define (iter i 行)
    (if (> i 身長)
        '()
        (短所行
              (イター (1+ i)
                    (次の行)))))

  (iter 1 '(1)))
于 2009-08-13T21:21:12.623 に答える
2

PHP 100 文字

$v[]=1;while($a<34){echo join(" ",$v)."\n";$a++;for($k=0;$k<=$a;$k++)$t[$k]=$v[$k-1]+$v[$k];$v=$t;}
于 2012-04-04T14:57:43.347 に答える
1

私は数年前にこの C++ バージョンを書きました:

#include <iostream>
int main(int,char**a){for(int b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0;b<atoi(a[1]);(d|f|h)>1?e*=d>1?--d:1,g*=f>1?--f:1,i*=h>1?--h:1:((std::cout<<(i*g?e/(i*g):1)<<" "?d=b+=c++==b?c=0,std::cout<<std::endl?1:0:0,h=d-(f=c):0),e=d,g=f,i=h));}
于 2009-08-07T10:23:23.557 に答える
1

VBA、122 文字:

Sub p(n)
For r = 1 To n
l = "1"
v = 1
For c = 1 To r - 1
v = v / c * (r - c)
l = l & " " & v
Next
Debug.Print l
Next
End Sub
于 2010-04-01T14:17:45.007 に答える
1

プロローグでの別の試み(私はxDを練習しています)、短すぎず、164cだけです:

s([],[],[]).
s([H|T],[J|U],[K|V]):-s(T,U,V),K is H+J.
l([1],0).
l(P,N):-M is N-1,l(A,M),append(A,[0],B),s(B,[0|A],P).
p([],-1).
p([H|T],N):-M is N-1,l(H,N),p(T,M).

説明:

  • s = 要素ごとにリストを合計する
  • l = 三角形の N 番目の行
  • p = サイズ N の三角形全体
于 2009-08-07T14:01:10.190 に答える
1

ルビー、83c:

def p(n);n>0?(m=p(n-1);k=m.last;m+[([0]+k).zip(k+[0]).map{|x|x[0]+x[1]}]):[[1]];end

テスト:

irb(main):001:0> def p(n);n>0?(m=p(n-1);k=m.last;m+[([0]+k).zip(k+[0]).map{|x|x[0]+x[1]}]):[[1]];end
=> nil
irb(main):002:0> p(5)
=> [[1], [1, 1], [1, 2, 1], [1, 3, 3, 1], [1, 4, 6, 4, 1], [1, 5, 10, 10, 5, 1]]
irb(main):003:0> 
于 2009-08-07T01:36:49.533 に答える
1

組み込み関数の名前が短い場合は、はるかに短くなる可能性がある別のpythonソリューション... 106文字。

from itertools import*
r=range
p=lambda n:[[len(list(combinations(r(i),j)))for j in r(i+1)]for i in r(n)]
于 2009-09-09T13:20:01.493 に答える
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)

于 2009-08-07T00:25:27.740 に答える
0

Perlバージョン(シバンなしで139文字)

@p = (1,1);
while ($#p < 20) {
    @q =();
    $z = 0;
    push @p, 0;
    foreach (@p) {
        push @q, $_+$z;
        $z = $_
    }
    @p = @q;
    print "@p\n";
}

出力は121から始まります

于 2009-08-10T06:33:00.857 に答える
0

Perl、63 文字:

for(0..9){push@z,1;say"@z";@z=(1,map{$z[$_-1]+$z[$_]}(1..$#z))}
于 2009-10-08T11:51:44.340 に答える
0

PHP、115 文字

$t[][]=1;
for($i=1;$i<$n;++$i){
$t[$i][0]=1;
for($j=1;$j<$i;++$j)$t[$i][$j]=$t[$i-1][$j-1]+$t[$i-1][$j];
$t[$i][$i]=1;}

print_r() が出力配列を正しい順序で表示するかどうか気にしない場合は、次のように 113 文字に削ることができます。

$t[][]=1;
for($i=1;$i<$n;++$i){
$t[$i][0]=$t[$i][$i]=1;
for($j=1;$j<$i;++$j)$t[$i][$j]=$t[$i-1][$j-1]+$t[$i-1][$j];}
于 2009-09-08T21:55:37.433 に答える
0

古いスレッドですが、今日の別のフォーラムでの挑戦に応えてこれを書きました:

def pascals_triangle(n):
    x=[[1]]
    for i in range(n-1):
        x.append([sum(i) for i in zip([0]+x[-1],x[-1]+[0])])
    return x

for x in pascals_triangle(5):
    print('{0:^16}'.format(x))

      [1]       
     [1, 1]     
   [1, 2, 1]    
  [1, 3, 3, 1]  
[1, 4, 6, 4, 1]
于 2011-01-14T00:36:35.467 に答える
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";
  }
}
于 2009-12-03T09:24:14.460 に答える