I borrowed this one from codewars

Snail Sort
Given an n x n array, return the array elements arranged from outermost elements to the middle element, traveling clockwise.

array = [[1,2,3],
[4,5,6],
[7,8,9]]
snail(array) #=> [1,2,3,6,9,8,7,4,5]
For better understanding, please follow the numbers of the next array consecutively:

array = [[1,2,3],
[8,9,4],
[7,6,5]]
snail(array) #=> [1,2,3,4,5,6,7,8,9]
This image will illustrate things more clearly:

NOTE: The idea is not sort the elements from the lowest value to the highest; the idea is to traverse the 2-d array in a clockwise snailshell pattern.

Python Solution

def snail_sort(matrix):
new_list = []

while matrix:
new_list.extend(matrix.pop(0))
if not matrix:
continue

for i in range(len(matrix)):
new_list.append(matrix[i].pop())
if not matrix:
break
if not matrix:
continue

new_list.extend(reversed(matrix.pop()))
if not matrix:
continue

for i in range(len(matrix) - 1, -1, -1):
new_list.append(matrix[i].pop(0))
if not matrix:
break
return new_list

MATRIX = [
[1, 2, 3, 4, 5],
[16, 17, 18, 19, 6],
[15, 24, 25, 20, 7],
[14, 23, 22, 21, 8],
[13, 12, 11, 10, 9],
]

snail_sort(MATRIX)

Octave solution

@Absinthe

function sorted = snail(array)
if numel(array) <= 1
sorted = array;
else
sorted = [array(1, 1:(end-1)),...
array(1:(end-1), end)',...
array(end, end:-1:2),...
array(end:-1:2, 1)',...
snail(array(2:(end-1), 2:(end-1))) ]; end; end;

Octave solution

@khird looks good, much better than my python solution :)

re: Python Solution

@Absinthe very cute

re: Python Solution

@static thanks?

@Absinthe couldn't resist this one:
git.sr.ht/~namark/snail/tree/m
I swear I tried to do it for square only but it seems to work for rectangles too.

In true c++ fashion it comes with a bunch of illegible library code, which I had to extend with a couple of extra abominable appendages to accommodate this toy.

@namark awesome

@Absinthe Had to rewrite because I forgot an important test case. Here's snail sort in Rust... again: play.rust-lang.org/?version=st

@notthemessiah that looks great. I may have to look into some Rust now... :)

QOTO: Question Others to Teach Ourselves