可视化差异金字塔


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艺术表示形式。确保输入至少包含两个元素。您可以采用任何合理的格式获取这些数字。(数组/列表/无论您叫什么,字符串,命令行参数等)都允许在每一行尾随空格,并且最多可以在尾随新行。

测试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此推测的启发。

Answers:


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,并初始化一个嵌套列表y,使y[0] = x。然后生成y(最初x)中最后一个列表的绝对差,并将其作为列表附加到y直到1达到长度列表为止;在每个阶段,列表都会预先填充空格,以使列表中的所有列表y都具有与相同的长度x。接下来,y进行转置,使其在每个输出行中都包含一个元组,但是相反。转置中的每个元组都被解压缩,反转和打印,将差异金字塔留在STDOUT上。

在Ideone上尝试

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.