หมุนรายการสองมิติ 45 องศา


22

งาน

เป้าหมายคือการเขียนโปรแกรมที่หมุนรายการสองมิติ 45 องศาโดยจะต้องสามารถทำได้สูงสุด 7 * 45 (ในครั้งเดียว) ก่อนที่จะส่งคืนรายการ รายการไม่จำเป็นต้องเป็นรูปสี่เหลี่ยมจัตุรัสหรือสี่เหลี่ยม คุณต้องรวมเอาท์พุทสำหรับตัวอย่างในคำตอบของคุณ นอกจากนี้ยังต้องใช้กับกรณีที่ไม่ได้อยู่ในตัวอย่าง ... วงกลมสามเหลี่ยม ฯลฯ คุณไม่สามารถใช้ฟังก์ชั่นที่มีอยู่แล้วเพื่อทำสิ่งทั้งหมด

รายการทั้งหมดจะมีแกนสมมาตรอย่างน้อยหนึ่งแกน (N, S, E, W) รายการย่อยทั้งหมดจะถูกจัดเป็นแบบกึ่งกลาง รายการที่ไม่สม่ำเสมอจะเลื่อนไปทางซ้ายเพื่อจัดแนวอย่างถูกต้อง ดูตัวอย่างที่ 4 สำหรับช่องว่างที่อยู่ตรงกลางของรายการย่อย

INPUT

โปรแกรมของคุณจะใช้ตัวแปรชื่อlที่มีรายการและตัวแปรที่มีชื่อnระบุจำนวนรายการที่จะถูกหมุน (n * 45) ( nจะน้อยกว่า 7 เสมอและอาจเป็น 0) มันจะต้องยอมรับlที่มีรายการย่อยของชนิดข้อมูลใด ๆ ที่พิมพ์ได้ (ทศนิยม, รายการ, int, String [] .. ฯลฯ ) แต่รายการย่อยจะมีประเภทข้อมูลเพียงครั้งเดียว

คุณไม่จำเป็นต้องยอมรับอินพุตคอนโซลหรือใช้ stdin บรรทัดที่ระบุค่าทดสอบของlและnไม่รวมอยู่ในจำนวนตัวอักษร แต่ต้องรวมอยู่ในรหัสที่ส่ง

เอาท์พุท

โปรแกรมของคุณจะต้องพิมพ์รายการในทิศทางที่ถูกต้องสามารถใช้ NIL ในการแสดงรายการได้หากคุณต้องการ แต่ไม่จำเป็นต้องใช้ช่องว่างภายใน รายการย่อยไม่จำเป็นต้องเยื้องหรือคั่นด้วยการขึ้นบรรทัดใหม่ในตัวอย่าง

ตัวอย่าง

1

IN
l=
[[0 , 1 , 2],
 [3 , 4 , 5],
 [6 , 7 , 8]]
n=1

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

2

IN
l=
[[a , b , c , d],
 [e , f , g , h]]
n=2

OUT
[[e , a],
 [f , b],
 [c , g],
 [h , d]]

3

IN
l=
[[A , B , C , D , E , F],
     [G , H , I , J],
         [K , L],
         [0 , 8],
         [M , N],
     [O , P , Q , R],
 [S , T , U , V , W , X]]
n=7

OUT
[          [F],
         [E],
       [D , J],
     [C , I],
   [B , H , L],
 [A , G , K , 8],
           [0 , N , R , X],
             [M , Q , W],
               [P , V],
             [O , U],
               [T],
             [U]          ]

4

IN
l=
[[9 , 8 , 7 , 6],
     [5],
 [4 , 3 , 2 , 1],
     [0]        ]
n=3

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

5

IN
l=
[    [Q],
 [X ,NIL, Y],
     [Z]    ]
n=2

OUT
[    [X],
 [Z ,NIL, Q],
     [Y]     ]

4
โอ้ นั่นเป็นสิ่งที่ยาก. ดูสนุก แต่!
TheDoctor

1
สองคำถาม: 1) เราไม่ต้องทำรายการใช่มั้ย? 2) คุณต้องการให้เราหมุนรายการตามnเวลาและไม่ใช่ด้วยn· 45 °หรือไม่? ฉันถามเพราะฉันค่อนข้างมั่นใจว่าฉันจะไม่ได้รับผลลัพธ์ของตัวอย่างที่ 3 โดยใช้การหมุน 45 องศาเจ็ดครั้ง
Wrzlprmft

ไม่คุณไม่จำเป็นต้องรอง รายการควรจะสามารถจัดวางในแนวการมองเห็นที่ถูกต้องแม้ว่ามันจะไม่จำเป็นต้องมีการส่งออกในลักษณะที่ ... เอาท์พุทจะไม่มีการขึ้นบรรทัดใหม่ รายการจะถูกหมุนโดย n * 45
3urous

คำตอบ:


8

Python - 234 201

# example for defining lists and n
l=[[1,2,3,4],
     [5],
   [6,7,8,9]]
n=1

# counting code
j=1j
m=max(map(len,l))+len(l)
M=range(-m,m)
e=enumerate
d=[[v for x in M for i,u in e(l)for k,v in e(u)if[1,1+j,j,j-1,-1,-j-1,-j,1-j][n]*(k-(len(u)-1)/2+j*i)==x+y*j]for y in M]
print[x for x in d if x]

เวอร์ชันที่ไม่ดี

rotation = [1,1+1j,1j,1j-1,-1,-1j-1,-1j,1-1j][n]
m = max(map(len,l))+len(l)
output = []
for y in range(-m,m):
    line = []
    for x in range(-m,m):
        for i,sublist in enumerate(l):
            for k,entry in enumerate(sublist):
                if rotation * ( k-(len(sublist)-1)/2 + i*1j ) == x + y*1j:
                    line += [entry]
    if line != []:
        output += [line]
print output

นี่ใช้การคูณนั้น (ของจำนวนเชิงซ้อน) ด้วยจำนวนเชิงซ้อนที่สอดคล้องกับการหมุนและการยืด [1,1+1j,1j,1j-1,-1,-1j-1,-1j,1-1j]เป็นจำนวนเชิงซ้อนที่สอดคล้องกับมุมที่ต้องการและการใช้ตัวคูณสเกลที่เล็กที่สุดสำหรับอินพุตคอมเพล็กซ์จำนวนเต็มเอาต์พุตจะเป็นจำนวนเต็มอีกครั้ง


1
ฉันพยายามที่จะเข้าใจวิธีการทำงาน แต่ฉันหลงทางที่จำนวนที่ซับซ้อน ฉันขอคำอธิบายได้ไหม
Οurous

1
@Ourous: ให้ x + iy = (x, y) แล้วคูณนี่ด้วย 1 + i = (1,1) คุณจะได้หมุน 45 องศา
Kyle Kanos

ทางออกที่ดี ฉันพยายามที่จะปรับมันเพื่อแทรกช่องว่างภายในที่เหมาะสมในรายการผลลัพธ์ แต่ฉันไม่มีโชคมาก นั่นคือการเติมที่ไม่สำคัญหรือไม่?
tkocmathla

@tkocmathla: ฉันไม่ได้ทดสอบสิ่งนี้ แต่ลองเพิ่มelse: line += [None]หลังจากบรรทัดที่สี่จากบรรทัดสุดท้าย
Wrzlprmft
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.