Rotacje z przeplotem

25

Wyzwanie

Biorąc pod uwagę kwadratową matrycę znaków (jednobajtowe znaki drukowalne ASCII), obróć każdy „pierścień” matrycy w przeciwnych kierunkach.

Weźmy przykład:

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

Następnie najbardziej zewnętrzny pierścień obraca się o 90 stopni zgodnie z ruchem wskazówek zegara, w ten sposób:

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

Drugi pierścień obraca się o 90 stopni w kierunku przeciwnym do ruchu wskazówek zegara:

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

Ostatni pierścień jest obracany o 90 stopni w kierunku zgodnym z ruchem wskazówek zegara, ale ponieważ jest to pojedyncza liczba (litera w naszym przykładzie), tak naprawdę nie ma to wpływu.

Ostateczny wynik to:

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

Jeśli matryca ma równą długość boku, najbardziej wewnętrzny pierścień będzie miał kwadrat 2x2 i powinien nadal być obracany.

Wkład

Lista list w dowolnym rozsądnym standardowym formacie. Na przykład ciąg znaków rozdzielany spacjami lub nowy ciąg rozdzielany spacjami jest dopuszczalny, ale lista wartości jako pierścieni wokół macierzy jest niedopuszczalna. Postacie niekoniecznie są wyjątkowe.

Wydajność

Lista list w dowolnym rozsądnym standardowym formacie. Te same zasady co dane wejściowe.

Przypadki testowe

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

Kredyty

Mocno zainspirowany pokrewnym wyzwaniem, które obraca każdy element przeciwnie do ruchu wskazówek zegara o jedną pozycję (nie o 90 stopni).

HyperNeutrino
źródło
Powiązane
rahnema1
@ rahnema1 Racja, pamiętam ten post. Ten post jest w większości zainspirowany tym; Uznam. Dzięki!
HyperNeutrino
@ Mr.Xcoder Whoops. Masz rację, dzięki.
HyperNeutrino
@HyperNeutrino czy możemy wziąć wymiar macierzy jako część danych wejściowych?
Uriel
Wszystkie postacie w twoich przykładach są unikalne. Czy tak będzie zawsze?
Dennis

Odpowiedzi:

9

Haskell , 94 bajty

Anonimowa funkcja pobierająca i zwracająca listę Strings.

Użyj jako (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[]

Wypróbuj online!

Jak to działa

  • rjest reverse. tjest o jeden bajt krótszy niż import Data.List.transpose. t.robraca listę list o 90 stopni w prawo i r.tobraca ją w lewo.
  • Operator ?przyjmuje dwa argumenty, listę funkcji i macierz jako listę ciągów znaków.
    • Właśnie zwrócona jest pusta macierz.
    • W przeciwnym razie ?usuwa pierwszą funkcję fz listy funkcji, a pierwszą linię az macierzy.
    • Następnie obraca pozostałą część bmacierzy zgodnie z ruchem wskazówek zegara i powtarza się z tą i pozostałymi funkcjami. Powoduje to stopniowe usuwanie matrycy z zewnątrz, jeden pierścień na cztery kroki.
    • Następnie wstawia oryginalną linię ado wyniku i stosuje fdo niej funkcję w celu dostosowania orientacji matrycy.
  • Anonimowe wywołania funkcji ?z macierzą wejściową jako listą łańcuchów i nieskończoną listą funkcji, która cyklicznie się powtarza co cztery kroki.
    • W przypadku większości kroków funkcją jest obrót w kierunku przeciwnym do ruchu wskazówek zegara, który cofa ukryty obrót w kierunku zgodnym z ruchem wskazówek zegara, wykonywany ?podczas rekurencji.
    • Jednak pierwszym krokiem, a następnie co czwartym krokiem jest obrót w prawo.
      • Ta funkcja jest stosowana, gdy pierścień matrycy jest kompletny, co powoduje obrót każdego pierścienia o 180 stopni w stosunku do następnego.
      • Na szczęście jest to również poprawna transformacja, która ma zastosowanie do końcowej, ukończonej matrycy, aby uzyskać końcowy wynik.
Ørjan Johansen
źródło
6

Python 2 , 104 bajty

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]

Wypróbuj online!

x[l-i][j]są współrzędnymi obrotu zgodnie z ruchem wskazówek zegara, x[i][l-j]dla obrotu przeciwnego do ruchu wskazówek zegara. min(i,j,l-i,l-j)%2służy do wyboru właściwego kierunku

Pręt
źródło
zwracanie rotacji rekurencyjnie.
tuskiomi
@tuskiomi hmm ??
Rod
@tuskiomi Próbowałem podejścia rekurencyjnego w ES6. To było około dwa razy dłużej niż zwykły port tej odpowiedzi ...
Neil
4

Mathematica, 113 bajtów

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)&


lepiej jest wpisać ciąg znaków jak „E” dla specjalnych liter takich jak E, ja ...

wkład

[{{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, "!", "@", "#", "&"}}]

wydajność

{{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}}

J42161217
źródło
3

Oktawa, 86 bajtów

@(a){k=a;k(x=2:end-1,x)=0;a=rot90(a);a(m)=rot90(a,-2)(m=~mod(bwdist(+k,'ch'),2));a}{5}

Wypróbuj online!

rahnema1
źródło