snail-sort/snail.nim
2022-11-26 21:49:38 +01:00

63 lines
1.2 KiB
Nim

proc snail(xss: seq[seq[int]]): seq[int] =
let h = len(xss)
if h == 0:
return @[]
let w = len(xss[0])
if h == 0:
return @[]
let max = if h > w:
h
else:
w
var v: seq[int] = @[]
for b in 0..(max div 2):
let ex = w - b - 1;
let ey = h - b - 1;
for c in b..ex:
v.add(xss[b][c])
for r in b+1..ey:
v.add(xss[r][ex])
if ex == b or ey == b:
return v
for o in b..<ex:
v.add(xss[ey][ex-1-o])
for o in b+1..<ey:
v.add(xss[ey-o][b])
return v
var initial = @[@[1,2,3],@[4,5,6],@[7,8,9]]
var expected = @[1,2,3,6,9,8,7,4,5]
assert expected == snail(initial)
echo expected == snail(initial)
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 expected == snail(initial)
echo expected == snail(initial)
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 expected == snail(initial)
echo expected == snail(initial)
echo "all tests passed"