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
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
@Absinthe Had to rewrite because I forgot an important test case. Here's snail sort in Rust... again: https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=4ba0f21a08b05e70e979f855dd530117
@notthemessiah that looks great. I may have to look into some Rust now... :)
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)