İki boyutlu bir listeyi 45 derece döndür


22

GÖREV

Amaç herhangi bir iki boyutlu listeyi 45 derece döndüren bir program yazmaktır, listeyi döndürmeden önce bunu 7 * 45'e (bir kerede) kadar yapabilmelidir. Liste mutlaka kare veya dikdörtgen olmayacak. Cevabınıza örnekler için çıktı eklemelisiniz. Ayrıca örneklerde olmayan ... daireler, üçgenler vb. Olmayan durumlarda da çalışmalıdır. Her şeyi yapmak için önceden var olan bir işlevi kullanamazsınız.

Tüm listeler en az bir simetri eksenine (N, S, E, W) sahip olacaktır. Tüm alt listelerin merkez-hizalı olduğu varsayılmalıdır. Tek sıralı listeler, düzgün şekilde hizalanması için sola kaydırılır. Bir alt listenin ortasındaki boşluklar için örnek 4'e bakınız.

GİRİŞ

Programınız llisteyi içeren bir değişken nve listenin döndürüleceği miktarı belirten bir değişken kullanacak (n * 45) ( nher zaman 7'den küçük olacak ve 0 olabilir). lBasılabilir herhangi bir veri türünün alt listelerini içermesi gerekir (ondalık, Liste, int, String [] .. vb.), Ancak alt listeler bir seferde yalnızca bir veri türü içerecektir.

Konsol girişini kabul etmeniz veya stdin kullanmanız gerekmez. Test değerlerini belirterek hatları lve nkarakter sayısına dahil edilmez, ancak gönderilen kodu dahil edilmelidir.

ÇIKTI

Programınız listeyi doğru yönde yazdırmalıdır, istenirse listeleri doldurmak için NIL kullanılabilir, ancak doldurma gerekli değildir (yine de doldurulmuşlarsa gülen yüz alırsınız). Alt listelerin, örneklerde olduğu gibi yeni satırlarla girintilmesi veya ayrılması gerekmez.

ÖRNEKLER

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
Oooh. Bu zor. Yine de eğlenceli görünüyor!
Doktor,

1
İki soru: 1) Listeleri doldurmak zorunda değiliz, değil mi? 2) Liste nzamanlarını n45 ° döndürmemizi gerçekten istiyor musunuz ? Soruyorum çünkü yedi adet 45 ° döndürme uygulayarak örnek 3'ün sonucunu elde etmeyeceğimden eminim.
Wrzlprmft

Hayır, yastık doldurmanıza gerek yok. Bununla birlikte, liste doğru görsel oryantasyonda düzenlenebilmelidir, bununla birlikte çıkması gerekmese de, çıkışın yeni satırları olmayacak. Liste n * 45 ile döndürülür.
19

Yanıtlar:


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]

Ungolfed Sürümü

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

Bu, karmaşık bir sayıyla (karmaşık sayının) çarpımını döndürme ve uzatma işlemine karşılık gelir. [1,1+1j,1j,1j-1,-1,-1j-1,-1j,1-1j]gerekli açılara tekabül eden karmaşık sayılardır ve en küçük ölçekleme faktörünü kullanarak, bir tamsayı karmaşık girişi için çıktı tekrar tamsayı karmaşık olacak şekilde kullanılır.


1
Bunun nasıl çalıştığını anlamaya çalışıyorum ama karmaşık sayılarla kayboluyorum. Bir açıklama isteyebilir miyim?
Büyük

1
@Ourous: Let x + iy = (x, y), sonra bunu 1 + i = (1,1) ile çarparak, 45 derece döndürürsünüz.
Kyle Kanos

Harika çözüm Ayrıca çıktı listelerine uygun dolguyu yerleştirmek için uyarlamaya çalışıyorum, ancak çok fazla şansım yok. Bu önemsiz bir ek mi?
tkocmathla

@tkocmathla: Bunu test etmedim, ancak else: line += [None]dördüncü sıradan sonra eklemeyi deneyin .
Wrzlprmft
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.