Visualisasikan Piramida Perbedaan

15

Piramida perbedaan adalah piramida di mana setiap diagonal baru adalah nilai absolut dari perbedaan antara unsur-unsur diagonal terakhir. Misalnya, jika kita mulai dengan array

2 5 4 9 3 4

Sekarang, kita mengatur ini dalam kolom diagonal:

     2
      5
       4
        9
         3
          4

Sekarang, kita isi diagonal berikutnya. Perbedaan mutlak antara elemen berturut-turut dari array ini adalah:

3 1 5 6 1

Jadi itu adalah diagonal kita selanjutnya.

     2
    3 5
     1 4
      5 9
       6 3
        1 4

Ulangi sampai piramida diisi:

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

Tantangan

Diberikan daftar bilangan bulat positif dalam kisaran [0, 9], hasilkan representasi ASCII-art dari piramida perbedaan untuk array khusus itu. Input dijamin mengandung setidaknya dua elemen. Anda dapat mengambil angka-angka ini dalam format apa pun yang masuk akal. (Array / daftar / apa pun sebutannya, string, argumen baris perintah, dll.) Mengejar spasi pada setiap baris dan hingga satu baris baru tambahan diizinkan.

Tes 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

Seperti biasa, ini adalah kode-golf, jadi celah standar berlaku, dan jawaban tersingkat dalam byte menang!


Terinspirasi oleh OEIS ini dan dugaan ini .

DJMcMayhem
sumber

Jawaban:

8

Jelly , 16 byte

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

Cobalah online!

Latar Belakang

Menghasilkan perbedaan cukup mudah. Untuk input

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

IA$Ṗп (nilai absolut kenaikan sementara ada lebih dari satu elemen) menghasilkan array 2D yang tidak rata berikut ini.

[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]

Umembalik urutan kolom dan urutan baris, menghasilkan yang berikut.

[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]

Sekarang, kami memindahkan baris dan kolom dengan z”@, yang membungkus semua baris dengan panjang yang sama sebelum transposing. Hasilnya adalah sebagai berikut.

[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]

Membalikkan baris memberi

[@, @, @, @, @, @, @, @, 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]

Untuk mengubah array 2D menjadi string yang dipisahkan spasi, kami menggunakan atom kotak bawaan ( G). Ini bergabung dengan kolom dengan spasi dan baris demi baris, menghasilkan hasil berikut.

@ @ @ @ @ @ @ @ 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

Yang tersisa untuk dilakukan adalah menghapus karakter padding ḟ”@, menghasilkan

        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

yang merupakan output yang diinginkan.

Dennis
sumber
2

CJam, 29 byte

q~{_2ew::-:z}h]W%zzeeSff*W%N*

Cobalah online! (Baris pertama dan terakhir memungkinkan suite tes yang dipisahkan dengan linefeed)

Ini menggunakan rotasi-segitiga dan kode tata letak dari jawaban ini dan segitiga itu sendiri dihasilkan dengan prinsip yang sama seperti dalam jawaban ini .

Martin Ender
sumber
2

J, 46 42 39 36 byte

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

Implementasi lurus ke depan. Menghasilkan tabel perbedaan berturut-turut antara masing-masing pasangan dan mengulanginya beberapa kali sama dengan panjang array input. Kemudian lintasi setiap diagonal dari tabel itu untuk membentuk barisan segitiga. Sisanya memformat baris menjadi piramida.

Pemakaian

   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

Penjelasan

(#\-#)|."_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
mil
sumber
1

Pyth, 22 byte

jmX-jN_Pd;N;_.t_M.uaVt

Cobalah online!

Biarawati Bocor
sumber
1

Python 3, 144 byte

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])

Fungsi yang mengambil input daftar xmelalui argumen dan mencetak hasilnya ke STDOUT.

Bagaimana itu bekerja

Program mengambil input daftar x, dan menginisialisasi daftar bersarang ysehingga y[0] = x. Perbedaan absolut untuk daftar terakhir dalam y(awalnya x) kemudian dihasilkan dan ditambahkan sebagai daftar yhingga daftar panjang 1tercapai; pada setiap tahap, daftar diisi dengan spasi sehingga semua daftar ymemiliki panjang yang sama x. Selanjutnya, yditransposisikan, meninggalkannya berisi tuple untuk setiap jalur output, tetapi terbalik. Setiap tuple dalam transpose dibongkar, dibalik dan dicetak, meninggalkan piramida perbedaan pada STDOUT.

Cobalah di Ideone

TheBikingViking
sumber