snail-sort/snail.d
2022-11-27 10:14:11 +01:00

62 lines
1.3 KiB
D

import std.stdio;
import std.algorithm;
T[] snail(T)(T[][] xss)
{
ulong h = xss.length;
if (h == 0) { return []; }
ulong w = xss[0].length;
if (w == 0) { return []; }
T[] v = [];
foreach (b; 0..((max(w, h) / 2)+1)) {
ulong ex = w - b - 1;
ulong ey = h - b - 1;
foreach (c; b..ex+1)
v ~= [xss[b][c]];
foreach (r; b+1..ey+1)
v ~= [xss[r][ex]];
if (ex == b || ey == b) {
return v;
}
foreach (o; b..ex)
v ~= [xss[ey][ex-1-o]];
foreach (o; b+1..ey)
v ~= [xss[ey-o][b]];
}
return v;
}
void main()
{
int[][] initial = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
int[] expected = [1,2,3,6,9,8,7,4,5];
assert(snail(initial) == expected);
writeln(snail(initial) == expected);
initial = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]];
expected = [1, 2, 3, 4, 8, 12, 11, 10, 9, 5, 6, 7];
assert(snail(initial) == expected);
writeln(snail(initial) == expected);
initial = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
[10, 11, 12],
[13, 14, 15]
];
expected = [1, 2, 3, 6, 9, 12, 15, 14, 13, 10, 7, 4, 5, 8, 11];
assert(snail(initial) == expected);
writeln(snail(initial) == expected);
"all tests passed".writeln;
}