From eb5f3b18b7e40e233d98df16043e3277f02ba94c Mon Sep 17 00:00:00 2001 From: m-hgn Date: Mon, 1 May 2023 23:49:29 +0200 Subject: [PATCH] add v version. --- makefile | 14 +++++++------- snail.v | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 7 deletions(-) create mode 100644 snail.v diff --git a/makefile b/makefile index ceb20b5..d08457d 100644 --- a/makefile +++ b/makefile @@ -1,14 +1,9 @@ bd = ./build/ -all: c d nim odin __python rust +all: c d nim odin __python rust v build-run: all - $(bd)c - $(bd)d - $(bd)nim - $(bd)odin - ./snail.py - $(bd)rust + make run run: $(bd)c @@ -17,6 +12,7 @@ run: $(bd)odin ./snail.py $(bd)rust + $(bd)v clean: rm -f $(bd)* @@ -44,3 +40,7 @@ rust: snail.rs rustc $^ -o $(bd)$@ $(bd)$@ +v: snail.v + v $^ -o $(bd)$@ + $(bd)$@ + diff --git a/snail.v b/snail.v new file mode 100644 index 0000000..9768bab --- /dev/null +++ b/snail.v @@ -0,0 +1,49 @@ +fn (xss [][]int) snail() []int { + mut ys := []int{} + + h := xss.len + if h == 0 { return ys } + w := xss[0].len + if w == 0 { return ys } + + for b in 0 .. (max(h, w)) { + ex := w - b - 1 + ey := h - b - 1 + + for c in b .. (ex + 1) { ys << xss[b][c] } + for r in (b + 1) .. (ey + 1) { ys << xss[r][ex] } + + if ex == b || ey == b { return ys } + + for c in (b + 1) .. (ex + 1) { ys << xss[ey][ex - c] } + for r in (b + 1) .. ey { ys << xss[ey - r][b] } + } + return ys +} + +fn max(a int, b int) int { if a > b { return a } else { return b } } + +fn main() { + mut initial := [[1, 2, 3], [4, 5, 6], [7, 8, 9]] + mut expected := [1, 2, 3, 6, 9, 8, 7, 4, 5] + assert initial.snail() == expected + println(initial.snail() == 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 initial.snail() == expected + println(initial.snail() == 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 initial.snail() == expected + println(initial.snail() == expected) + + println('all tests passed') +}