Чередование вращений


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 Ой. Вы правы, спасибо.
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 хм ??
Род

@tuskiomi Я попробовал рекурсивный подход в ES6. Это было примерно вдвое больше, чем простой порт этого ответа ...
Нил

4

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


лучше вводить как символьную строку, например, "E", для специальных букв, таких как E, I ...

вход

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

выход

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.