62 lines
1.3 KiB
D
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;
|
|
}
|