Follow

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.

Octave solution

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:

https://git.sr.ht/~namark/snail/tree/master/snail.cpp

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

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

La Fée Verte@Absinthe@qoto.orgPython 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)