Titreşimli rotasyonlar


25

Meydan okuma

Kare bir karakter matrisi (tek bayt yazdırılabilir ASCII karakterleri) verildiğinde, matrisin her "halkasını" ters yönlerde döndürün.

Bir örnek alalım:

1 2 3 4 5
6 7 8 9 A
B C D E F
G H I J K
L M N O P

Daha sonra, en dıştaki halka saat yönünde 90 derece döndürülür, bunun gibi:

1 2 3 4 5    L G B 6 1
6       A    M       2
B       F => N       3
G       K    O       4
L M N O P    P K F A 5

İkinci halka saat yönünün tersine 90 derece döndürülür:

7 8 9    9 E J
C   E => 8   I
H I J    7 C H

Son halka saat yönünde 90 derece döndürülür, ancak tek bir sayı olduğundan (örneğimizdeki harf), o zaman gerçekten etkilenmez.

Nihai sonuç:

L G B 6 1
M 9 E J 2
N 8 D I 3
O 7 C H 4
P K F A 5

Matris düzgün bir yan uzunluğa sahipse, en içteki halka 2x2 kare olacaktır ve hala döndürülmelidir.

Giriş

Herhangi bir makul standart formatta listelerin bir listesi. Örneğin, yeni satırlarla sınırlandırılmış bir boşlukla sınırlandırılmış dize veya boşlukla sınırlandırılmış bir dizelerin listesi kabul edilebilir, ancak matris etrafındaki halkalar olarak değerlerin listesi kabul edilemez. Karakterler mutlaka benzersiz değildir.

Çıktı

Herhangi bir makul standart formatta listelerin bir listesi. Girişle aynı kurallar.

Test Kılıfları

1 2 3    7 4 1
4 5 6 => 8 5 2
7 8 9    9 6 3

1 2 3 4 5 6    Y S M G A 1
A B C D E F    Z E K Q W 2
G H I J K L => ! D O I V 3
M N O P Q R    @ C P J U 4
S T U V W X    # B H N T 5
Y Z ! @ # $    $ X R L F 6

Kredi

Her öğeyi saat yönünün tersine bir konum (90 derece değil) döndüren ilgili bir zorluktan büyük ölçüde ilham alın .



@ rahnema1 Doğru, ben bu yazıyı hatırlıyorum. Bu yazı çoğunlukla bundan esinlenmiştir; Kredi alacağım. Teşekkürler!
HyperNeutrino,

@ Mr.Xcoder Whoops. Haklısın, teşekkürler.
HyperNeutrino,

@HyperNeutrino, matrisin boyutunu bir girdi olarak alabilir miyiz?
Uriel

Örneklerinizdeki tüm karakterler benzersizdir. Bu her zaman böyle olacak mı?
Dennis

Yanıtlar:


9

Haskell , 94 bayt

StringS listesini alan ve veren isimsiz bir işlev .

Olarak kullanın (cycle[t.r,r.t,r.t,r.t]?)["123", "456", "789"].

(cycle[t.r,r.t,r.t,r.t]?)
(g:h)?(a:b)=g$a:h?t(r b)
_?a=a
r=reverse;t=zipWith(:)`foldr`repeat[]

Çevrimiçi deneyin!

Nasıl çalışır

  • rolduğunu reverse. tiçe aktarmadan daha kısa olan bir bayttır Data.List.transpose. t.rlisteler listesini saat yönünde 90 derece döndürür ve r.tsaat yönünün tersine döndürür.
  • Operatör ?iki argüman, işlev listesi ve dizge listesi olarak bir matris alır.
    • Boş bir matris daha yeni döndürüldü
    • Aksi halde, ?ilk işlevi işlev flistesinden çıkarır ve ilk satırı amatristen çıkarır.
    • Sonra bmatrisin geri kalanını saat yönünde döndürür ve bununla ve kalan işlevlerle tekrarlar. Bu, matrisi kademeli olarak dışardan içeri girer, her dört adımda bir halka.
    • Daha sonra orjinal çizgiyi asonuç olarak hazırlar fve matrisin yönünü ayarlamak için bu işlevi uygular .
  • Anonim işlev ?, giriş matrisini dizelerin bir listesi olarak çağırır ve her dört adımda bir döngüsel olarak yinelenen sonsuz bir işlevler listesi çağırır .
    • Adımların çoğu için işlev, saat yönünün tersine döndürme işlevidir; bu ?, özyinelemede yapılan kesin saat yönünde dönüşü geri alır.
    • Ancak, ilk adım ve sonraki her dördüncü adım bunun yerine saat yönünde döndürmedir.
      • Bu fonksiyon, matrisin bir halkası tamamlandığında uygulanır, bu da her bir halkanın bir diğerine göre 180 derece döndürülmesine neden olur.
      • Şans eseri, bu aynı zamanda final sonucunu elde etmek için final matrisine uygulanacak doğru dönüşümdür.

6

Python 2 , 104 bayt

def f(x):l=len(x)-1;r=range(l+1);return[[[x[l-i][j],x[i][l-j]][min(i,j,l-i,l-j)%2]for i in r]for j in r]

Çevrimiçi deneyin!

x[l-i][j]Saat yönünün tersine çevrilmesi x[i][l-j]için saat yönünde bir dönüşün koordinatları . min(i,j,l-i,l-j)%2doğru yönü seçmek için kullanılır


rotasyonları art arda döndürerek.
tuskiomi

@tuskiomi hmm ??
Rod,

@tuskiomi ES6'da özyinelemeli bir yaklaşım denedim. Bu cevabın basit bir limanı iki katı
Neil

4

Mathematica, 113 bayt

r=Reverse;(l=Length[s=#];Table[s[[i+1;;l-i,i+1;;l-i]]=r/@r@s[[i+1;;l-i,i+1;;l-i]],{i,⌊l/2⌋}];r/@Transpose@s)&


E gibi özel harfler için "E" gibi bir karakter dizisi olarak girmek daha iyidir ...

giriş

[{{1, 2, 3, 4, 5, 6}, {A, B, C, D, "E", F}, {G, H, "I", J, K, L}, {M , N, O, P, Q, R}, {S, T, U, V, W, X}, {Y, Z, "!", "@", "#", "&"}}]

çıktı

{{Y, S, M, G, A, 1}, {Z, "E", K, Q, W, 2}, {"!", D, O, "I", V, 3}, { "@", C, P, J, U, 4}, {"#", B, H, N, T, 5}, {"&", X, R, L, F, 6}}


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.