差分ピラミッドを視覚化する


15

差分ピラミッドは、新しい対角線が最後の対角線の要素間の差の絶対値であるピラミッドです。たとえば、配列で始まる場合

2 5 4 9 3 4

次に、これらを対角列に配置します。

     2
      5
       4
        9
         3
          4

次に、次の対角線を塗りつぶします。この配列の連続する要素間の絶対的な違いは次のとおりです。

3 1 5 6 1

それが次の対角線です。

     2
    3 5
     1 4
      5 9
       6 3
        1 4

ピラミッドが塗りつぶされるまで繰り返します。

     2
    3 5
   2 1 4
  2 4 5 9
 1 3 1 6 3
0 1 4 5 1 4

チャレンジ

範囲内の正の整数のリストを指定[0, 9]すると、その特定の配列の差分ピラミッドのこのASCIIアート表現を生成します。入力には、少なくとも2つの要素が含まれることが保証されています。これらの番号は、適切な形式で取得できます。(配列/リスト/それを何と呼んでも、文字列、コマンドライン引数など)各行の末尾のスペースと最大1つの末尾の改行が許可されます。

テストIO

[1, 2, 3, 4, 5, 6, 7, 8, 9]

        1
       1 2
      0 1 3
     0 0 1 4
    0 0 0 1 5
   0 0 0 0 1 6
  0 0 0 0 0 1 7
 0 0 0 0 0 0 1 8
0 0 0 0 0 0 0 1 9

[4, 7]

 4
3 7

[3, 3, 3]

  3
 0 3
0 0 3

[1, 3, 6, 3, 4, 9]

     1
    2 3
   1 3 6
  1 0 3 3
 1 2 2 1 4
1 0 2 4 5 9


[8, 7, 3, 2, 4, 5, 9, 1, 6]

        8
       1 7
      3 4 3
     0 3 1 2
    2 2 1 2 4
   0 2 0 1 1 5
  0 0 2 2 3 4 9
 1 1 1 1 1 4 8 1
0 1 0 1 0 1 3 5 6

いつものように、これはコードゴルフなので、標準の抜け穴が適用され、バイト単位の最短回答が勝ちます!


触発され、このOEIS、この推測

回答:


8

ゼリー、16 バイト

IA$ṖпUṚz”@ṚGḟ”@

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

バックグラウンド

違いの生成は非常に簡単です。入力用

[1, 2, 3, 4, 5, 6, 7, 8, 9]

IA$Ṗп (要素が複数ある場合の増分の絶対値)は、次の不規則な2D配列を生成します。

[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 1, 1, 1, 1, 1, 1, 1]
[0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0]
[0, 0, 0]
[0, 0]
[0]

Uの順序と行の順序を逆にして、次を生成します。

[0]
[0, 0]
[0, 0, 0]
[0, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0]
[1, 1, 1, 1, 1, 1, 1, 1]
[9, 8, 7, 6, 5, 4, 3, 2, 1]

ここで、行と列を転置してz”@、転置前にすべての行を同じ長さにパディングします。結果は次のとおりです。

[0, 0, 0, 0, 0, 0, 0, 1, 9]
[@, 0, 0, 0, 0, 0, 0, 1, 8]
[@, @, 0, 0, 0, 0, 0, 1, 7]
[@, @, @, 0, 0, 0, 0, 1, 6]
[@, @, @, @, 0, 0, 0, 1, 5]
[@, @, @, @, @, 0, 0, 1, 4]
[@, @, @, @, @, @, 0, 1, 3]
[@, @, @, @, @, @, @, 1, 2]
[@, @, @, @, @, @, @, @, 1]

行を反転すると

[@, @, @, @, @, @, @, @, 1]
[@, @, @, @, @, @, @, 1, 2]
[@, @, @, @, @, @, 0, 1, 3]
[@, @, @, @, @, 0, 0, 1, 4]
[@, @, @, @, 0, 0, 0, 1, 5]
[@, @, @, 0, 0, 0, 0, 1, 6]
[@, @, 0, 0, 0, 0, 0, 1, 7]
[@, 0, 0, 0, 0, 0, 0, 1, 8]
[0, 0, 0, 0, 0, 0, 0, 1, 9]

2D配列を空白で区切られた文字列に変換するには、組み込みのグリッドアトム(G)を使用します。列をスペースで、行を改行で結合し、次の結果を生成します。

@ @ @ @ @ @ @ @ 1
@ @ @ @ @ @ @ 1 2
@ @ @ @ @ @ 0 1 3
@ @ @ @ @ 0 0 1 4
@ @ @ @ 0 0 0 1 5
@ @ @ 0 0 0 0 1 6
@ @ 0 0 0 0 0 1 7
@ 0 0 0 0 0 0 1 8
0 0 0 0 0 0 0 1 9

行うには残っているすべては、パディング文字を削除してḟ”@、降伏します

        1
       1 2
      0 1 3
     0 0 1 4
    0 0 0 1 5
   0 0 0 0 1 6
  0 0 0 0 0 1 7
 0 0 0 0 0 0 1 8
0 0 0 0 0 0 0 1 9

これは望ましい出力です。



2

J、46 42 39 36バイト

(#\-#)|."_1#{.[:":@|./.<@#2&(|@-/\)]

簡単な実装。各ペア間の連続した差分のテーブルを生成し、入力配列の長さに等しい回数繰り返します。次に、そのテーブルの各対角線を走査して、三角形の行を形成します。残りは、行をピラミッドにフォーマットします。

使用法

   f =: (#\-#)|."_1#{.[:":@|./.<@#2&(|@-/\)]
   f 2 5 4 9 3 4
     2     
    3 5    
   2 1 4   
  2 4 5 9  
 1 3 1 6 3 
0 1 4 5 1 4
   f 4 7
 4 
3 7
   f 8 7 3 2 4 5 9 1 6
        8        
       1 7       
      3 4 3      
     0 3 1 2     
    2 2 1 2 4    
   0 2 0 1 1 5   
  0 0 2 2 3 4 9  
 1 1 1 1 1 4 8 1 
0 1 0 1 0 1 3 5 6

説明

(#\-#)|."_1#{.[:":@|./.<@#2&(|@-/\)]  Input: list A
                         #            Get len(A)
                       <@             Box it
                                   ]  Get A
                          2&(     )   Repeat len(A) times on A initially
                          2      \      Get each iverlapping sublist of size 2
                                /       Reduce it using
                             |@-          The absolute value of the difference

                                      This will form a table where each row contains the
                                      successive differences
              [:     /.               Operate on the diagonals of that table
                   |.                 Reverse each diagonal
                ":@                   Format each into a string
           #                          Get len(A)
            {.                        Take that many from the strings of diagonals
 #\                                   Get the length of each prefix of A
                                      Makes the range [1, 2, ..., len(A)]
    #                                 Get len(A)
   -                                  Subtract the len(A) from each in the prefix range
                                      Makes [-len(A)+1, ..., -1, 0]
      |."_1                           Rotate each string left using each value
                                      A negative rotate left = rotate right
                                      Output the pyramid


1

Python 3、144バイト

def f(x):
 y=[x]
 for i in range(len(x)-1):y+=[['']*-~i+[abs(y[i][j]-y[i][j+1])for j in range(i,len(y[i])-1)]]
 for i in zip(*y):print(*i[::-1])

x引数を介してリストの入力を受け取り、結果をSTDOUTに出力する関数。

使い方

プログラムはリストの入力を受け取りx、ネストされたリストを初期化yy[0] = xます。y(最初にx)の最後のリストの絶対差が生成され、y長さのリストに1達するまでリストとして追加されます。各段階で、リストにはスペースが事前に埋め込まれ、すべてのリストのy長さがと同じになりますx。次に、yは転置され、出力行ごとにタプルが含まれますが、逆になります。転置の各タプルは展開され、反転され、印刷され、STDOUTに差分ピラミッドが残ります。

Ideoneでお試しください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.