パスカルの交互三角形


21

パスカルの三角形1、各行を開始し、連続する加算から形成することで生成されます。ここでは、代わりに、乗算と加算を交互に行うことにより三角形を形成します。

我々は、行を開始する1だけで孤独で1。その後、奇数行で加算が行われ、偶数行(1-indexed)で乗算が行われます。追加ステップを実行するとき、三角形の外側のスペースが0sで埋められていると仮定します。乗算ステップを実行するとき、外側が1s で満たされていると仮定します。

7行までの完全な三角形です。*または+その行を生成するために行ったものステップ左側番組に。

1                1
2 *            1   1
3 +          1   2   1
4 *        1   2   2   1
5 +      1   3   4   3   1
6 *    1   3  12  12   3   1
7 +  1   4  15  24  15   4   1

チャレンジ

inputが与えられると、この三角形のth番目の行をn出力しnます。

ルール

  • 代わりに0インデックスを選択することもできますが、上記とまったく同じ三角形が生成されるように、加算行と乗算行がフリップフロップする必要があることに注意してください。これを行うことを選択した場合は、提出物に明記してください。
  • 入力と出力は、言語のネイティブ整数型に適合すると仮定できます。
  • 入力と出力は、任意の便利な形式で指定できます
  • 完全なプログラムまたは機能のいずれかが受け入れられます。関数の場合、出力する代わりに出力を返すことができます。
  • 可能であれば、他の人があなたのコードを試すことができるように、オンラインテスト環境へのリンクを含めてください!
  • 標準的な抜け穴は禁止されています。
  • これはので、通常のゴルフルールがすべて適用され、最短のコード(バイト単位)が勝ちます。

多くの出力のうちの2つの可能な例を示す:リスト、またはスペースで区切られた文字列。

4
[1, 2, 2, 1]

8
"1 4 60 360 360 60 4 1"

2
@totallyhumanいいえ、stdoutに必要なのはnth行だけです。
AdmBorkBork

回答:



7

パイソン297の 93 86 81 78バイト

Rodのおかげで-4バイト。Halvard Hummelのおかげで-10バイト。

f=lambda n:n and[[i+j,i*j][n%2]for i,j in zip([n%2]+f(n-1),f(n-1)+[n%2])]or[1]

0インデックス。

オンラインでお試しください!


1
よくやった私は(はるかに)長いアプローチを持っていた。まだゴルフをする時間がありませんでしたが。
ミスターXcoder

1
私はそれmap([int.__add__ ,int.__mul__][i%2],[i%2]+a,a+[i%2])がうまくいくと思う(テストしなかった)
ロッド


1
いいえ、これは再帰的です。名前を含める必要があります。
ミスターXcoder


5

ゼリー17 12バイト

µ×+LḂ$?Ḋ1;µ¡

これは、STDINから入力を受け取る完全なプログラム(またはniladicリンク)です。

オンラインでお試しください!

使い方

µ×+LḂ$?Ḋ1;µ¡  Main link. No arguments. Implicit argument: 0

          µ¡  Start a monadic chain and apply the ntimes quick to the previous one.
              This reads an integer n from STDIN and executes the previous chain n
              times, with initial argument 0, returning the last result.
µ             Start a monadic chain. Argument: A (array or 0)
       Ḋ          Dequeue; yield A without its first element.
   LḂ$?           If the length of A is odd:
 ×                    Multiply A and dequeued A.
                  Else:
  +                   Add A and dequeued A.
        1;        Prepend a 1 to the result.

5

パイソン296の89 87バイト

s=a=[1]
for i in range(1,input()):a=s+[[k+l,k*l][i%2]for k,l in zip(a[1:],a)]+s
print a

オンラインでお試しください!



@totallyhumanありがとうございます。私はそれをロールバックしました...-
officialaimm

1
突然、execメソッドをリードして:D
デッドポッサム

1
87バイト、宣言[1]
ミスターXcoder

3

CJam、25バイト

{1a\{2%!_2$+\{.*}{.+}?}/}

0インデックス。

オンラインでお試しください!

説明

これは、スタックから番号を取得し、結果をスタックに残す匿名ブロックです。

1a                        Push [1].
  \                       Bring the number to the top.
   {                 }/   For reach number 0 .. arg-1, do:
    2%!                    Push 0 if even, 1 if odd.
       _                   Copy that.
        2$+                Copy the list so far and prepend the 0 or 1 to it.
           \               Bring the 0 or 1 back to the top.
            {.*}{.+}?      If 1, element-wise multiplication. If 0, element-wise addition.

待って2%!いない、奇数ならば1場合でも0をプッシュする必要がありますか?
エソランジングフルーツ


3

Haskell76 72バイト

0インデックス付きソリューション:

(p!!)
p=[1]:[zipWith o(e:l)l++[1]|(l,(o,e))<-zip p$cycle[((*),1),((+),0)]]

オンラインでお試しください!

説明

p 交互の三角形を再帰的に定義し、その基本ケース/最初の要素は [1]

p=[1]:[                                                            ]

次に、前の行(l)を使用して三角形を作成します。それをどうするかを知るには、正しい演算子(o)と対応する中立要素(e)を追跡する必要があります。

                           |(l,(o,e))<-zip p$cycle[((*),1),((+),0)]

これから、行を複製して新しい行を作成し、1つのコピーに対して中立要素を付加し、演算子でzipし、1を追加します。

       zipWith o(e:l)l++[1]

3

R108 98バイト

実際の乗算記号をプラス記号に置き換えることにより、-10バイト。私を許してください。

f=function(n){if(n<3)return(rep(1,n))else{v=f(n-1)};if(n%%2)`*`=`+`;return(c(1,v[3:n-2]*v[-1],1))}

オンラインでお試しください!

一般的な方法(最初にプリミティブをエイリアスした)にはかなり満足していますが、特にn <3の場合の扱いにくい扱いで、多くのボイラープレートにつながる、扱いにくいゴルフはまだあると確信しています。


85バイト。私はあなたのソリューションが大好き`*`=`+`です!とても賢い。私の残りの改善点は、標準的なゴルフ技術です。ご要望に応じて説明させていただきます。)
ジュゼッペ

80バイト。ケースの取り扱いに関するメモからインスピレーションを得ましたn<3
ジュゼッペ

2

17 16バイト

!G₅;1¢e*+
:1Sż⁰t

オンラインでお試しください!

1インデックス付きソリューション。

説明

最初の行はメイン関数で、2行目のヘルパー関数を呼び出します。ヘルパー関数は通常と呼ばれるが、この場合、私が使用しているあふれラベルは抜け殻の特徴:あなたはラインを参照している場合にNと、プログラムでM <Nのラインは、ライン取得Nのmod Mを修飾機能とM / Nが適用されました。2番目の修飾子関数はflipですので、私は使用しています、追加のバイトコストなしでヘルパー関数の引数を反転するしています。

これがヘルパー関数です。

:1Sż⁰t  Takes a function f and a list x.
   ż    Zip preserving elements of longer list
    ⁰   using function f
  S  t  x and its tail,
:1      then prepend 1.

主な機能は次のとおりです。

!G₅;1¢e*+  Takes a number n.
      e*+  2-element list of the functions * and +
     ¢     repeated infinitely.
 G         Left scan this list
  ₅        using the flipped helper function
   ;1      with initial value [1].
!          Get n'th element.

2

C#(.NET Core)143 134 128バイト

Phaezeに 4バイト
Zac Faragherに 5バイト
Kevin Cruijssenに 6バイト

n=>{int[]b={1},c;for(int i=0,j;++i<n;b=c)for(c=new int[i+1],c[0]=c[i]=1,j=0;++j<i;)c[j]=i%2<1?b[j-1]+b[j]:b[j-1]*b[j];return b;}

オンラインでお試しください!

説明:

n =>
{
    int[] b = { 1 }, c;               // Create first layer
    for(int i = 0, j; ++i < n; b = c) // Iterate for every layer, replace last layer with a new one
        for(c = new int[i+1],         // Create new layer
            c[0] = c[i] = 1,          // First and last elements are always 1
            j = 0;
            ++j < i; )                // Replace every element (besides 1st and last)...
                c[j] = i % 2 == 0 ?
                    b[j - 1] + b[j] : // ... with addition...
                    b[j - 1] * b[j];  // ... or multiplication of two from previous layers
    return b;                         // Return latest layer
};

b配列の初期化をに変更できればvar b=new[]{1};、コンパイラーが配列タイプを決定します。
JustinM -復活モニカ

1
最初の層を構築する別の方法はint[]b={1};-11バイト対20のまま、または@Phaezeの提案のように16
Zac Faragher

1
@ZacFaragherとPhaezeありがとう!
グジェゴルツプルワスキ

1
かなり前からわかっていますが、あと6バイトゴルフできます:n=>{int[]b={1},c;for(int i=0,j;++i<n;b=c)for(c=new int[i+1],c[0]=c[i]=1,j=0;++j<i;)c[j]=i%2<1?b[j-1]+b[j]:b[j-1]*b[j];return b;}。私はcこのように結合しましたint[]b={1},c;。短縮i%2==0しますi%2<1。そして、すべてを中に入れることでループのブラケットを削除しました。
ケビンクルーッセン

すばらしいです!ありがとう@KevinCruijssen
GrzegorzPuławski18年


1

Pyth、22バイト

@FryAmTheEggmanのおかげで大量のバイトを節約できました!最初の解決策は次のとおりです。

u++1@,+VGtG*VGtGlG1Q[1

完全なテストスイート(0インデックス付き)。

Pyth40 38 36 35バイト

これはあまりにも長いと感じます。提案を歓迎します。

K]1VStQ=K++]1m@,sd*hded%N2C,KtK]1;K

スイートをテストする、オンラインで試してください!


reduceの使用ははるかに短いようです。これも最適だとは思いませんが、サブ20は管理可能だと思いますか?
FryAmTheEggman

@FryAmTheEggman改訂履歴をご覧ください。私はreduceで回避策を見つけようとしていると言いましたu(しかしそれを理解できませんでした)。ありがとう!
Mr Xcoder

Pythは内蔵の先頭に追加-APPEND ...持っている希望の場合
氏Xcoder



1

Mathematica、70バイト

Fold[#2@@@Partition[#,2,1,{-1,1},{}]&,{1},PadRight[{},#,{1##&,Plus}]]&

で試してみてください Wolframサンドボックス!残念ながら数学では機能しません。インデックスは0です。

説明:Partition[#,2,1,{-1,1},{}]リストを取り、すべての2要素サブリストに加えて、開始と終了の1要素リストを返します。たとえば、に{1,2,3,4}なり{{1}, {1,2}, {2,3}, {3,4}, {4}}ます。(実質的に)とのPadRight[{},#,{1##&,Plus}]交互のリストを作成します。その長さは入力番号です。次に、esとesを適用したパーティション関数を繰り返し適用して、三角形の行を作成します。1##&TimesPlusFoldPlusTimes




0

TI-Basic(TI-84 Plus CE)、100バイト

Prompt X
{1→M
For(A,2,X
LM→L
A→dim(M
For(B,2,A–1
If A/2=int(A/2
Then
LL(B–1)LL(B→LM(B
Else
LL(B–1)+LL(B→LM(B
End
End
1→LM(dim(LM
End
LM

1-indexed、ユーザーに入力を求めn、Pascalの交互三角形のth行を含むリストを出力します。

ループ中:L Mは現在の行で、L Lは前の行です。

TI-Basicはトークン化された言語ですです。ここで使用されるすべてのトークンは、1バイトのトークンです。

Mを最後からインプレースで変更することで、これをさらにゴルフできると思います。

説明:

Prompt X            # 3 bytes; get user input, store in X
{1→M                # 5 bytes, store the first row into LM
For(A,2,X           # 7 bytes, Loop X-1 times, with A as the counter, starting at 2
LM→L                # 5 bytes, copy list M into list L
A→dim(M             # 5 bytes, extend M by one
For(B,2,A–1         # 9 bytes, for each index B that isn't the first or last...
If A/2=int(A/2      # 10 bytes,    if A is even...
Then                # 2 bytes,     then...
LL(B–1)LL(B→LM(B     # 17 bytes,        the Bth item in this row is the Bth times the (B-1)th of the previous row
Else                # 2 bytes,     else...
LL(B–1)+LL(B→LM(B    # 18 bytes,        the Bth item in this row is the Bth plus the (B-1)th of the previous row
End                 # 2 bytes,     endif
End                 # 2 bytes,  endfor
1→LM(dim(LM         # 9 bytes, the last item is always 1
End                 # 2 bytes, endfor
LM                  # 2 bytes, Implicitly print the final row


0

JavaScript(ES6)、71 69 66バイト

f=n=>n?(p=f(n-1),[...p.map((v,i)=>i--?n%2?v*p[i]:v+p[i]:1),1]):[1]

オンラインでお試しください!

0インデックス。@Arnauldによる
-3バイト

f=n=>n?(p=f(n-1),[...p.map((v,i)=>i--?n%2?v*p[i]:v+p[i]:1),1]):[1]

for (var i = 0; i < 10; ++i) {
  console.log(JSON.stringify(f(i)));
}


1
3進数を使用すると、3バイト節約できますi--?n%2?v*p[i]:v+p[i]
。– Arnauld
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.