Putar daftar dua dimensi sebanyak 45 derajat

22

TUGAS

Tujuannya adalah untuk menulis sebuah program yang memutar daftar dua dimensi sebanyak 45 derajat, ia harus mampu melakukan ini hingga 7 * 45 (sekaligus) sebelum mengembalikan daftar. Daftar tidak harus persegi atau persegi panjang. Anda harus menyertakan output untuk contoh dalam jawaban Anda. Ini juga harus berfungsi untuk kasus-kasus yang tidak ada dalam contoh ... lingkaran, segitiga dll. Anda tidak dapat menggunakan fungsi yang sudah ada sebelumnya untuk melakukan semuanya.

Semua daftar akan memiliki setidaknya satu sumbu simetri (N, S, E, W). Semua sublist harus diasumsikan sebagai pusat-sejajar. Daftar ganjil genap akan bergeser ke kiri untuk menyelaraskan dengan benar. Lihat contoh 4 untuk celah di tengah sublist.

MEMASUKKAN

Program Anda akan menggunakan variabel bernama lmengandung daftar, dan variabel bernama nmenentukan jumlah daftar akan diputar (n * 45) ( nakan selalu kurang dari 7, dan bisa 0). Ia harus menerima lsublist berisi tipe data apa pun yang dapat dicetak (desimal, List, int, String [] .. dll), tetapi sublist hanya akan berisi satu tipe data pada satu waktu.

Anda tidak perlu menerima input konsol atau menggunakan stdin. Baris yang menentukan nilai tes ldan ntidak termasuk dalam jumlah karakter, tetapi harus dimasukkan dalam kode yang dikirimkan.

KELUARAN

Program Anda harus mencetak daftar dalam orientasi yang benar, NIL dapat digunakan untuk membuat daftar pad jika Anda inginkan, tetapi padding tidak diperlukan (Anda mendapatkan wajah tersenyum jika mereka empuk, meskipun). Sub-daftar tidak harus diindentasi atau dipisahkan oleh baris baru seperti pada contoh.

CONTOH

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]     ]
Suram
sumber
4
Oooh. Itu sulit. Terlihat menyenangkan!
TheDoctor
1
Dua pertanyaan: 1) Kita tidak perlu daftar pad, kan? 2) Apakah Anda benar-benar ingin kami memutar daftar nwaktu dan tidak pada n· 45 °? Saya bertanya karena saya cukup yakin bahwa saya tidak akan mendapatkan hasil dari contoh 3 dengan menerapkan tujuh rotasi 45 °.
Wrzlprmft
Tidak, Anda tidak perlu bantalan. Namun daftar tersebut harus dapat diatur ke dalam orientasi visual yang benar, meskipun tidak harus berupa output seperti itu ... output tidak akan memiliki baris baru. Daftar diputar oleh n * 45.
Kamis

Jawaban:

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]

Versi Tidak Serigala

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

Ini menggunakan perkalian (dari bilangan kompleks) dengan bilangan kompleks sesuai dengan rotasi dan peregangan. [1,1+1j,1j,1j-1,-1,-1j-1,-1j,1-1j]adalah bilangan kompleks yang sesuai dengan sudut yang diperlukan dan menggunakan faktor penskalaan terkecil sehingga untuk input bilangan bulat kompleks, output adalah bilangan bulat kompleks lagi.

Wrzlprmft
sumber
1
Saya mencoba memahami bagaimana ini bekerja, tetapi saya tersesat di bilangan kompleks. Bisakah saya meminta penjelasan?
Kamis
1
@Ourous: Misalkan x + iy = (x, y), lalu kalikan ini dengan 1 + i = (1,1), Anda mendapatkan rotasi sebesar 45 derajat.
Kyle Kanos
Solusi bagus Saya mencoba mengadaptasinya untuk juga memasukkan padding yang sesuai di daftar output, tetapi saya tidak memiliki banyak keberuntungan. Apakah itu tambahan yang tidak sepele?
tkocmathla
@tkocmathla: Saya tidak menguji ini, tetapi coba tambahkan else: line += [None]setelah keempat dari baris terakhir.
Wrzlprmft