Обход двумерного массива спиралью по часовой стрелке

1,00
р.
Задача соревнования:
Есть двумерный массив N x N. Нужно написать функцию, которая будет обходить двумерный массив спиралью по часовой стрелке, как показано на картинке.


Пример 4x4:
На входе есть двумерный массив:
entryArray = [[1, 2, 3, 4], [12, 13, 14, 5], [11, 16, 15, 6], [10, 9, 8, 7]]
На выходе одномерный массив после обхода:
exitArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
Язык может быть любым. Основное условие: функция должна работать корректно для любого равностороннего двумерного массива, в том числе 1х1, пустой массив возвращает пустой массив.

Определение победителей:
Победитель будет определен по следующим параметрам:
Наименьшее количество символов кода Количество голосов Не более 2 правок после первого данного ответа
Ответ автора не учитывается при выборе победителя.
Победитель определится через 2 недели (26 октября).
Просьба указывать язык в заголовке ответа и количество символов минифицированной функции через запятую.

Хотелось бы увидеть решения на Ruby, Haskell, Scala и до бесконечности. Большое спасибо за вашу активность!

Вывод победителей:


execute("ru.stackoverflow.com", "892196") .cssload-container,.cssload-cube{width:97px height:97px transform-style:preserve-3d}.cssload-container,.cssload-cube,.cssload-half1,.cssload-half2{transform-style:preserve-3d}.cssload-container{position:relative margin:23px 84px perspective:292px}.cssload-cube{animation:cube 11.5s forwards infinite transform-origin:center 49px}.cssload-half1,.cssload-s1{top:0 transform-origin:50% 100%}.cssload-half1{height:39px position:absolute animation:half-fold 11.5s forwards infinite}.cssload-side{width:19px height:19px background:#ddd position:absolute}.cssload-s1{left:39px animation:s1ani 11.5s forwards infinite}.cssload-s2,.cssload-s3,.cssload-s4{left:39px transform-origin:50% 0}.cssload-s2{top:19px animation:s2ani 11.5s forwards infinite}.cssload-s3{top:39px animation:s3ani 11.5s forwards infinite}.cssload-s4{top:58px animation:s4ani 11.5s forwards infinite}.cssload-s5{left:19px top:19px transform-origin:100% 50% animation:s5ani 11.5s forwards infinite}.cssload-s6{left:58px top:39px transform-origin:0 50% animation:s6ani 11.5s forwards infinite}@keyframes cube{0%,30%{transform:rotateX(0)}40%{transform:rotateX(45deg) rotateY(0) rotate(45deg)}60%{transform:rotateX(60deg) rotateY(0) rotate(45deg)}65%,70%{transform:rotateX(60deg) rotate(45deg) rotate(180deg)}75%,80%{transform:rotateX(60deg) rotate(45deg) rotate(1turn)}90%{transform:rotateX(0) rotate(0) rotate(0)}}@keyframes s1ani{0%{opacity:1 transform:translateY(0) background:#ddd}40%{transform:rotateX(0) background:#ddd}50%{transform:rotateX(-90deg) background:#ddd}90%{transform:rotateX(-90deg)}}@keyframes s2ani{0%{opacity:0 transform:rotateX(-179deg)}10%{opacity:1 transform:rotateX(0)}40%{background:#ddd}45%,80%{background:#b4b4b4}65%{opacity:1 background:#b4b4b4}90%{opacity:1}to{opacity:0}}@keyframes s3ani{0%,10%{opacity:0 transform:rotateX(-179deg)}20%,90%{opacity:1 transform:rotateX(0)}40%{background:#ddd}45%{background:#969696}to{opacity:0}}@keyframes s4ani{0%,20%{opacity:0 transform:rotateX(-179deg)}10%,to{opacity:0}30%{opacity:1 transform:rotateX(0)}40%{transform:rotateX(0) background:#ddd}50%{transform:rotateX(90deg) background:#b4b4b4}80%{background:#b4b4b4}90%{opacity:1 transform:rotateX(90deg)}}@keyframes s5ani{0%,10%{opacity:0 transform:rotateY(-179deg)}20%{opacity:1 background:#ddd transform:rotateY(0)}40%{transform:rotateY(0)}50%{transform:rotateY(90deg)}55%{background:#ddd}60%{background:#c8c8c8}90%{transform:rotateY(90deg) opacity:1}to{opacity:0}}@keyframes s6ani{0%,20%{opacity:0 transform:rotateY(179deg)}30%{opacity:1 transform:rotateY(0)}40%{transform:rotateY(0)}50%{transform:rotateY(-90deg) background:#ddd}60%,80%{background:#c8c8c8}90%{opacity:1 transform:rotateY(-90deg)}to{opacity:0}}@keyframes half-fold{0%,50%{transform:rotateX(0)}60%,90%{transform:rotateX(-90deg)}}



Итоги соревнования:
1 место Андрей NOP с ответом на Haskell в 40 байт
2 место Yauhen с ответом на Ruby в 59 байт
3 место Let's say Pie с ответом на JavaScript в 81 байт

Всем большое спасибо за участие, все замечания будут учтены для последующих конкурсов.

Ответ
Haskell, 40
s[]=[] s(h:t)=h++(s$reverse$transpose t)
Решение эксплуатирует всё ту же идею отрезания первой строки от матрицы и поворота оставшегося куска против часовой стрелки.
https://ideone.com/FHeJAx