将二维列表旋转45度


22

任务

目标是编写一个将任何二维列表旋转45度的程序,返回二维列表之前,它必须能够做到一次最大7 * 45的旋转。该列表不一定是正方形或矩形。您必须在答案中包括示例的输出。它也必须适用于示例中未涉及的情况...圆,三角形等。您不能使用预先存在的功能来完成全部操作。

所有列表将至少具有一个对称轴(N,S,E,W)。所有子列表均假定为居中对齐。奇偶列表将向左移动以正确对齐。有关子列表中间的空白,请参见示例4。

输入

您的程序将使用一个l包含列表的变量,以及一个n指定列表旋转量的变量(n * 45)(n始终小于7,并且可以为0)。它必须接受l包含任何可打印数据类型(十进制,List,int,String []等的子列表),但是子列表一次仅包含一种数据类型。

您不需要接受控制台输入或使用stdin。指定的测试值的线ln不包括在所述字符计数,但必须包括在所提交的代码。

输出值

您的程序必须以正确的方向打印列表,如果需要,可以使用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 2014年

1
两个问题:1)我们不必填写清单,对吗?2)您是否真的要我们旋转列表n时间而不是旋转n45°?我之所以问是因为我可以肯定的是,我不会通过施加七个45°旋转来获得示例3的结果。
Wrzlprmft

不,您不必填充。尽管不必以这种方式输出列表,但列表应该能够以正确的视觉方向排列...输出将没有换行符。列表旋转n * 45。
2014年

Answers:


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
我试图了解它是如何工作的,但是我迷失在复杂的数字上。我可以要求一个解释吗?
很好2014年

1
@Ourous:让x + iy =(x,y),然后将其乘以1 + i =(1,1),您将旋转45度。
Kyle Kanos 2014年

很好的解决方案。我正在尝试对其进行调整,以便在输出列表中插入适当的填充,但是运气不佳。那是不平凡的加法吗?
tkocmathla

@tkocmathla:我没有对此进行测试,但是尝试else: line += [None]从最后一行开始在第四行之后添加。
Wrzlprmft
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.