Fark Piramidini Görselleştirin


15

Bir fark piramidi, her yeni diyagonalin, son diyagonalin elemanları arasındaki farkların mutlak değeri olduğu bir piramittir. Örneğin, diziyle başlarsak

2 5 4 9 3 4

Şimdi bunları çapraz bir sütunda düzenliyoruz:

     2
      5
       4
        9
         3
          4

Şimdi, bir sonraki köşegenini dolduruyoruz. Bu dizinin ardışık elemanları arasındaki mutlak farklar şunlardır:

3 1 5 6 1

Bu bizim bir sonraki köşegenimiz.

     2
    3 5
     1 4
      5 9
       6 3
        1 4

Piramit dolana kadar tekrarlayın:

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

Meydan okuma

Aralıktaki pozitif tamsayıların bir listesi verilir [0, 9] , belirli bir dizi için fark piramidinin bu ASCII-art gösterimini oluşturun. Girişin en az iki eleman içermesi garanti edilir. Bu numaraları makul bir biçimde alabilirsiniz. (Dizi / liste / her ne derseniz adlandırın, dize, komut satırı bağımsız değişkenleri vb.)

Test G / Ç

[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

Her zaman olduğu gibi, bu kod golf, bu yüzden standart boşluklar geçerlidir ve bayt kazanma en kısa cevap kazanır!


Bu OEIS ve bu varsayımdan esinlenilmiştir .

Yanıtlar:


8

Jöle , 16 bayt

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

Çevrimiçi deneyin!

Arka fon

Farklılıkları ortaya çıkarmak oldukça basittir. Giriş için

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

IA$Ṗп (birden fazla öğe varken artışların mutlak değeri) aşağıdaki düzensiz 2D diziyi verir.

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

Usütunların sırasını ve satırların sırasını tersine çevirerek aşağıdakileri verir.

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

Şimdi, transpozisyondan z”@önce tüm satırları aynı uzunlukta dolduran satırları ve sütunları aktarıyoruz. Sonuç şudur.

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

Satırları ters çevirmek

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

2B diziyi boşlukla ayrılmış bir dizeye dönüştürmek için yerleşik ızgara atomunu ( G) kullanırız. Sütunları boşluklarla ve satırlarla satır beslemelerini birleştirerek aşağıdaki sonucu verir.

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

Yapmak kaldı tek şey ile dolgu karakteri kaldırıyor ḟ”@veren,

        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

istenen çıktıdır.


2

CJam, 29 bayt

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

Çevrimiçi deneyin! (İlk ve son satır, satır besleme ile ayrılmış bir test paketini etkinleştirir.)

Bu üçgen dönme ve layouting kodu kullanan bu cevabını ve üçgen kendisinde olduğu ile aynı prensip ile oluşturulur Bu yanıt .


2

J, 46 42 39 36 bayt

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

Basit bir uygulama. Her çift arasında birbirini izleyen farklar tablosu oluşturur ve bunu giriş dizisinin uzunluğuna eşit sayıda tekrarlar. Ardından, üçgenin satırlarını oluşturmak için bu tablonun her bir diyagonalini dolaşır. Gerisi satırları bir piramide biçimlendiriyor.

kullanım

   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

açıklama

(#\-#)|."_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 bayt

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

xBağımsız değişken aracılığıyla bir listenin girdisini alan ve sonucu STDOUT'a basan bir işlev .

Nasıl çalışır

Program bir liste girişi alır xve ybu şekilde iç içe bir liste başlatır y[0] = x. y(Başlangıçta x) içindeki son liste için mutlak farklılıklar daha sonra oluşturulur ve ybir uzunluk listesine 1ulaşılana kadar bir liste olarak eklenir ; her aşamada, liste tüm boşluklarla önceden doldurulur, böylece tüm listeler yaynı uzunlukta olur x. Daha sonra y, her çıkış hattı için bir tuple içeren bırakılır, ancak ters çevrilir. Transpozisyondaki her bir demet, STDOUT'ta fark piramidini bırakarak ambalajından çıkarılır, ters çevrilir ve basılır.

Ideone üzerinde deneyin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.