2 차원 목록을 45도 회전


22

태스크

목표는 2 차원 목록을 45도 회전시키는 프로그램을 작성하는 것이므로 목록을 반환하기 전에 최대 7 * 45 (한 번에) 까지이 작업을 수행 할 수 있어야합니다. 목록이 반드시 정사각형 또는 직사각형 일 필요는 없습니다. 답변에 예제에 대한 출력을 포함해야합니다. 예제, 원, 삼각형 등이 아닌 경우에도 작동해야합니다. 기존 기능을 사용하여 전체 작업을 수행 할 수 없습니다.

모든 목록에는 적어도 하나의 대칭 축 (N, S, E, W)이 있습니다. 모든 하위 목록은 중앙 정렬로 가정됩니다. 홀수 짝수 목록은 올바르게 정렬되도록 왼쪽으로 이동합니다. 서브리스트 중간에 간격이있는 경우 예 4를 참조하십시오.

입력

프로그램은 l목록을 포함하는 이름이 지정된 변수 와 n목록이 회전 할 양을 지정하는 이름이 지정된 변수 (n * 45)를 사용합니다 ( n항상 7보다 작고 0 일 수 있음). 그것은 동의 할 것이다 l인쇄 가능한 데이터 형식 (소수점, 목록, INT, 문자열 [] 등등)의 포함 된 하위 목록을하지만, 하위 목록은 한 번에 하나의 데이터 유형이 포함됩니다.

콘솔 입력을 받거나 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]]

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시간을 n45도 회전 시키지 않고 회전 시키 시겠습니까? 7 번 45 ° 회전을 적용하여 예제 3의 결과를 얻지 못할 것이라고 확신하기 때문에 묻습니다.
Wrzlprmft

아니요, 패드를 댈 필요가 없습니다. 그러나리스트는 올바른 시각적 방향으로 정렬 될 수 있어야하지만, 그렇게 출력 될 필요는 없습니다 ... 출력에는 줄 바꾸기가 없습니다. 목록은 n * 45 씩 회전합니다.
OUurous

답변:


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
이것이 어떻게 작동하는지 이해하려고 노력하고 있지만 복잡한 숫자에서 길을 잃습니다. 설명을 부탁해도 될까요?
OUurous

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.