2次元リストを45度回転する


22

仕事

目標は、2次元のリストを45度回転するプログラムを作成することです。リストを返す前に、これを最大7 * 45(一度に)実行できる必要があります。リストは必ずしも正方形または長方形であるとは限りません。回答に例の出力を含める必要があります。また、円、三角形などの例にないケースでも機能する必要があります。既存の関数を使用してすべてを行うことはできません。

すべてのリストには、少なくとも1つの対称軸(N、S、E、W)があります。すべてのサブリストは中央揃えであると想定されます。奇数/偶数リストは、適切に整列するために左にシフトします。サブリストの中央のギャップについては、例4を参照してください。

入力

プログラムはl、リストを含むという名前の変数と、リストのn回転量を指定するという名前の変数(n * 45)を使用します(n常に7未満で、0にすることができます)。l印刷可能なデータ型(10進数、List、int、String [] ..など)のサブリストを含むことを受け入れる必要がありますが、サブリストには一度に1つのデータ型しか含まれません。

コンソール入力を受け入れる必要も、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
2つの質問:1)リストを埋める必要はありませんか?2)本当に45度でnはなく、リストの時間を回転させたいnですか?私は、45°の回転を7回適用しても例3の結果が得られないことを確信しているので、私は尋ねています。
Wrzlprmft

いいえ、パッドする必要はありません。ただし、リストをそのように出力する必要はありませんが、リストは正しい視覚方向に配置できる必要があります。出力には改行がありません。リストはn * 45ずつ回転します。
14年

回答:


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
私はこれがどのように機能するかを理解しようとしていますが、複素数で迷子になります。説明をお願いできますか?
14年

1
@Ourous:x + iy =(x、y)とし、これに1 + i =(1,1)を掛けると、45度の回転が得られます。
カイルカノス

素晴らしい解決策。出力リストに適切なパディングも挿入するように調整しようとしていますが、あまり運がありません。それは簡単な追加ですか?
tkocmathla

@tkocmathla:これはテストしませんでしたがelse: line += [None]、最後の行の4番目の後に追加してみてください。
Wrzlprmft
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.