Xoay danh sách hai chiều 45 độ


22

BÀI TẬP

Mục tiêu là viết một chương trình xoay bất kỳ danh sách hai chiều nào 45 độ, nó phải có khả năng thực hiện điều này lên đến 7 * 45 (cùng một lúc) trước khi trả lại danh sách. Danh sách sẽ không nhất thiết phải là hình vuông hoặc hình chữ nhật. Bạn phải bao gồm đầu ra cho các ví dụ trong câu trả lời của bạn. Nó cũng phải hoạt động đối với các trường hợp không có trong các ví dụ ... hình tròn, hình tam giác, v.v. Bạn không thể sử dụng hàm có sẵn để thực hiện toàn bộ.

Tất cả các danh sách sẽ có ít nhất một trục đối xứng (N, S, E, W). Tất cả các danh sách phụ sẽ được coi là liên kết trung tâm. Danh sách chẵn sẽ chuyển sang bên trái để căn chỉnh chính xác. Xem ví dụ 4 cho các khoảng trống ở giữa danh sách phụ.

ĐẦU VÀO

Chương trình của bạn sẽ sử dụng một biến có tên lchứa danh sách và một biến có tên nchỉ định số lượng danh sách sẽ được xoay (n * 45) ( nsẽ luôn nhỏ hơn 7 và có thể là 0). Nó sẽ phải chấp nhận lchứa danh sách con của bất kỳ loại dữ liệu có thể in nào (thập phân, Danh sách, int, Chuỗi [] .. vv), nhưng danh sách phụ sẽ chỉ chứa một loại dữ liệu tại một thời điểm.

Bạn không cần chấp nhận đầu vào giao diện điều khiển hoặc sử dụng stdin. Các dòng chỉ định giá trị thử nghiệm của lnkhông được bao gồm trong số ký tự, nhưng phải được bao gồm trong mã được gửi.

ĐẦU RA

Chương trình của bạn phải in danh sách theo đúng hướng, NIL có thể được sử dụng để đệm danh sách nếu bạn muốn, nhưng đệm là không cần thiết (mặc dù bạn có khuôn mặt cười nếu chúng được đệm). Danh sách phụ không phải được thụt lề hoặc phân tách bằng dòng mới như trong các ví dụ.

VÍ DỤ

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
Ôi. Điều đó thật khó khăn. Có vẻ vui, mặc dù!
TheDoctor

1
Hai câu hỏi: 1) Chúng ta không phải liệt kê danh sách, phải không? 2) Bạn có thực sự muốn chúng tôi xoay nthời gian danh sách chứ không phải bằng n45 °? Tôi đang hỏi bởi vì tôi khá chắc chắn rằng tôi sẽ không thu được kết quả của ví dụ 3 bằng cách áp dụng bảy góc quay 45 °.
Wrzlprmft

Không, bạn không phải đệm. Tuy nhiên, danh sách sẽ có thể được sắp xếp theo hướng trực quan chính xác, mặc dù nó không phải là đầu ra theo cách đó ... đầu ra sẽ không có dòng mới. Danh sách được xoay bởi n * 45.
năm14

Câu trả lời:


8

Con trăn - 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]

Phiên bản Ungolfed

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

Điều này sử dụng phép nhân đó (của một số phức) với một số phức tương ứng với xoay và kéo dài. [1,1+1j,1j,1j-1,-1,-1j-1,-1j,1-1j]là các số phức tương ứng với các góc yêu cầu và sử dụng hệ số tỷ lệ nhỏ nhất sao cho đầu vào phức số nguyên, đầu ra lại là số nguyên phức.


1
Tôi đang cố gắng hiểu làm thế nào điều này hoạt động, nhưng tôi bị lạc ở những con số phức tạp. Tôi có thể yêu cầu một lời giải thích?
Οurous

1
@Ourous: Đặt x + iy = (x, y), sau đó nhân số này với 1 + i = (1,1), bạn có được một góc quay 45 độ.
Kyle Kanos

Giải pháp tuyệt vời. Tôi đang cố gắng điều chỉnh nó để chèn phần đệm thích hợp vào danh sách đầu ra, nhưng không gặp nhiều may mắn. Đó có phải là một bổ sung không tầm thường?
tkocmathla 16/07/2015

@tkocmathla: Tôi đã không kiểm tra điều này, nhưng hãy thử thêm else: line += [None]sau dòng thứ tư từ dòng cuối cùng.
Wrzlprmft 16/07/2015
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.