เห็นภาพปิรามิดที่แตกต่าง


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-art การเป็นตัวแทนของปิรามิดที่แตกต่างกันสำหรับอาร์เรย์นั้น อินพุตรับประกันว่ามีองค์ประกอบอย่างน้อยสององค์ประกอบ คุณอาจใช้ตัวเลขเหล่านี้ในรูปแบบที่เหมาะสม (Array / list / อะไรก็ตามที่คุณเรียกว่าสตริงอาร์กิวเมนต์บรรทัดคำสั่ง ฯลฯ ) อนุญาตให้เว้นวรรคในแต่ละบรรทัดและขึ้นบรรทัดใหม่ได้สูงสุดหนึ่งบรรทัด

ทดสอบ 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

ตามปกตินี่คือ code-golf ดังนั้นจึงใช้ช่องโหว่มาตรฐานและคำตอบที่สั้นที่สุดในการชนะไบต์!


แรงบันดาลใจจากOEIS นี้และการคาดเดานี้

คำตอบ:


8

เยลลี่ขนาด 16 ไบต์

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

ลองออนไลน์!

พื้นหลัง

การสร้างความแตกต่างค่อนข้างตรงไปตรงมา สำหรับการป้อนข้อมูล

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

IA$Ṗп (ค่าสัมบูรณ์ของการเพิ่มขึ้นในขณะที่มีองค์ประกอบมากกว่าหนึ่งรายการ) ให้ผลเป็นอาร์เรย์ 2D แบบ ragged ต่อไปนี้

[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 เป็นสตริงที่คั่นด้วยช่องว่างเราใช้ atom กริดภายใน ( G) มันเข้าร่วมคอลัมน์โดยช่องว่างและแถวโดย linefeeds ผลผลิตผลลัพธ์ต่อไปนี้

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

CJam, 29 ไบต์

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

ลองออนไลน์! (บรรทัดแรกและบรรทัดสุดท้ายเปิดใช้งานชุดทดสอบแยก linefeed)

นี่ใช้การหมุนรูปสามเหลี่ยมและรหัสการจัดหน้าจากคำตอบนี้และรูปสามเหลี่ยมเองก็ถูกสร้างขึ้นด้วยหลักการเดียวกับในคำตอบนี้


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และ initialises รายการซ้อนกันดังกล่าวว่าy y[0] = xความแตกต่างแน่นอนสำหรับรายการสุดท้ายในy(ต้นx) จะถูกสร้างขึ้นแล้วและผนวกเข้าเป็นรายการไปyจนถึงรายการความยาว1ถึง; ในแต่ละขั้นตอนรายการจะถูกเติมล่วงหน้าด้วยช่องว่างซึ่งรายการทั้งหมดจะyมีความยาวเท่าxกัน ถัดไปyคือ transposed ปล่อยให้มันประกอบด้วย tuple สำหรับแต่ละบรรทัดเอาต์พุต แต่กลับด้าน tuple แต่ละตัวในทรานสโพสนั้นจะถูกแยกบรรจุกลับและพิมพ์ออกจากปิรามิดที่แตกต่างบน STDOUT

ลองใช้กับ Ideone

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.