Поворот двумерного списка на 45 градусов


22

ЗАДАЧА

Цель состоит в том, чтобы написать программу, которая поворачивает любой двумерный список на 45 градусов, она должна быть в состоянии сделать это до 7 * 45 (сразу) перед возвратом списка. Список не обязательно будет квадратным или прямоугольным. Вы должны включить вывод для примеров в своем ответе. Он также должен работать для случаев, которых нет в примерах ... круги, треугольники и т. Д. Вы не можете использовать уже существующую функцию, чтобы сделать все это.

Все списки будут иметь хотя бы одну ось симметрии (N, S, E, W). Все подсписки должны быть выровнены по центру. Нечетные четные списки будут смещены влево, чтобы выровняться должным образом. См. Пример 4 для пробелов в середине подсписка.

ВХОД

Ваша программа будет использовать переменную с именем, lсодержащим список, и переменную с именем, nопределяющую количество, на которое будет вращаться список (n * 45) ( nвсегда будет меньше 7 и может быть 0). Он должен будет принимать lсодержащие подсписки любого типа данных для печати (десятичные, List, int, String [] и т. Д.), Но подсписки будут содержать только один тип данных одновременно.

Вам не нужно принимать консольный ввод или использовать стандартный ввод. Строки, определяющие значения теста 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

Нет, вы не должны дополнять. Список, однако, должен быть в состоянии составить правильную визуальную ориентацию, хотя он не должен выводиться таким образом ... вывод не будет иметь новых строк. * Список повернут * 45.
Οurous

Ответы:


8

Питон - 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 градусов.
Кайл Канос

Отличное решение. Я пытаюсь адаптировать его для вставки соответствующего отступа в списки вывода, но мне не очень везет. Это нетривиальное дополнение?
tkocmathla

@tkocmathla: я не проверял это, но попробуйте добавить else: line += [None]после четвертого из последней строки.
Wrzlprmft
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.