Переплетені обертання


25

Виклик

Давши квадратну матрицю символів (однобайтові символи для друку ASCII), обертайте кожне "кільце" матриці в протилежних напрямках.

Візьмемо приклад:

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

Потім, зовнішнє кільце обертають за годинниковою стрілкою на 90 градусів, так:

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

Друге кільце обертається проти годинникової стрілки на 90 градусів:

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

Заключне кільце обертається за годинниковою стрілкою на 90 градусів, але оскільки це єдине число (буква в нашому прикладі), то це не реально впливає.

Кінцевий результат:

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

Якщо матриця має рівну бічну довжину, найпотужніше кільце буде розміром 2х2 і все одно має обертатися.

Вхідні дані

Список списків у будь-якому розумному стандартному форматі. Наприклад, рядка з обмеженим пробілом з обмеженим пробілом чи списком з обмеженим пробілом рядків є прийнятним, але список значень як кілець навколо матриці неприйнятний. Персонажі не обов'язково унікальні.

Вихідні дані

Список списків у будь-якому розумному стандартному форматі. Ті ж правила, що і введення.

Випробування

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

Кредити

Сильно натхненний пов'язаним завданням, який обертає кожен елемент проти годинникової стрілки на одне положення (а не на 90 градусів).



@ rahnema1 Правильно, я пам'ятаю цей пост. Цей пост в основному натхненний цим; Я буду кредитувати. Спасибі!
HyperNeutrino

@ Mr.Xcoder Whoops. Ви маєте рацію, дякую.
HyperNeutrino

@HyperNeutrino чи можна вважати розмірність матриці частиною вхідних даних?
Уріель

Усі символи у ваших прикладах унікальні. Чи завжди це буде так?
Денніс

Відповіді:


9

Haskell , 94 байти

Анонімна функція отримання та повернення списку Strings.

Використовувати як (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[]

Спробуйте в Інтернеті!

Як це працює

  • rє reverse. tна один байт коротший, ніж імпорт Data.List.transpose. t.rобертає список списків на 90 градусів за годинниковою стрілкою та r.tобертає його проти годинникової стрілки.
  • Оператор ?приймає два аргументи, список функцій та матрицю як список рядків.
    • Щойно повертається порожня матриця.
    • В іншому випадку ?знімає першу функцію fзі списку функцій, а перший рядок a- матрицю.
    • Потім він обертає решту bматриці за годинниковою стрілкою і повторює цю і інші функції. Це поступово знімає матрицю ззовні, по одному кільцю кожні чотири кроки.
    • Потім він попередньо додає початковий рядок aдо результату і застосовує до нього функцію fдля регулювання орієнтації матриці.
  • Анонімна функція викликає ?матрицю введення у вигляді списку рядків та нескінченного списку функцій, який циклічно повторюється кожні чотири кроки.
    • Для більшості кроків функція - це обертання проти годинникової стрілки, яке скасовує неявне обертання за годинниковою стрілкою, яке виконується ?при повторному повторенні.
    • Однак перший крок і кожен четвертий крок після цього - це обертання за годинниковою стрілкою.
      • Ця функція застосовується тоді, коли кільце матриці завершено, внаслідок чого кожне кільце повертається на 180 градусів відносно наступного.
      • На щастя, це також правильне перетворення, яке застосовується до кінцевої, завершеної матриці для отримання кінцевого результату.

6

Python 2 , 104 байти

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]

Спробуйте в Інтернеті!

x[l-i][j]є координати повороту за годинниковою стрілкою, x[i][l-j]для повороту проти кожування . min(i,j,l-i,l-j)%2використовується для вибору правильного напрямку


повертаються обертання рекурсивно.
тускіоми

@tuskiomi хм ??
Прут

@tuskiomi Я спробував рекурсивний підхід в ES6. Це було приблизно вдвічі довше простого порту цієї відповіді ...
Ніл

4

Математика, 113 байт

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


краще ввести такий рядок char, як "E" для спеціальних букв, таких як E, I ...

вхід

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

вихід

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


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.