From 5373afb485b6d4a22d06a83a715eeaf6872e9eac Mon Sep 17 00:00:00 2001 From: mark Date: Sun, 27 Nov 2022 10:14:11 +0100 Subject: [PATCH] add d version. --- snail.d | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 snail.d diff --git a/snail.d b/snail.d new file mode 100644 index 0000000..6007971 --- /dev/null +++ b/snail.d @@ -0,0 +1,61 @@ +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; +}