Compare commits
10 Commits
d65c3211d0
...
eb5f3b18b7
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
eb5f3b18b7 | ||
|
|
2864ba7771 | ||
|
|
e41e696d46 | ||
|
|
44fde4dfe8 | ||
|
|
c189ec6010 | ||
|
|
d55bcf0599 | ||
|
|
6504f2c68d | ||
|
|
5373afb485 | ||
|
|
685eedcac9 | ||
|
|
8393f06a14 |
46
makefile
Normal file
46
makefile
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
bd = ./build/
|
||||||
|
|
||||||
|
all: c d nim odin __python rust v
|
||||||
|
|
||||||
|
build-run: all
|
||||||
|
make run
|
||||||
|
|
||||||
|
run:
|
||||||
|
$(bd)c
|
||||||
|
$(bd)d
|
||||||
|
$(bd)nim
|
||||||
|
$(bd)odin
|
||||||
|
./snail.py
|
||||||
|
$(bd)rust
|
||||||
|
$(bd)v
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f $(bd)*
|
||||||
|
|
||||||
|
c: snail.c
|
||||||
|
gcc -Wall -Wextra -pedantic $^ -o $(bd)$@
|
||||||
|
$(bd)$@
|
||||||
|
|
||||||
|
d: snail.d
|
||||||
|
dmd $^ -of=$(bd)$@
|
||||||
|
$(bd)$@
|
||||||
|
|
||||||
|
nim: snail.nim
|
||||||
|
nim c $^ && mv snail $(bd)$@
|
||||||
|
$(bd)$@
|
||||||
|
|
||||||
|
odin: snail.odin
|
||||||
|
odin build . && mv *.bin $(bd)odin
|
||||||
|
$(bd)$@
|
||||||
|
|
||||||
|
__python: snail.py
|
||||||
|
python3 $^
|
||||||
|
|
||||||
|
rust: snail.rs
|
||||||
|
rustc $^ -o $(bd)$@
|
||||||
|
$(bd)$@
|
||||||
|
|
||||||
|
v: snail.v
|
||||||
|
v $^ -o $(bd)$@
|
||||||
|
$(bd)$@
|
||||||
|
|
||||||
68
snail.c
Normal file
68
snail.c
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
#include <assert.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
size_t max(const size_t*, const size_t*);
|
||||||
|
|
||||||
|
void snail(int* xss, int* yss, size_t h, size_t w) {
|
||||||
|
if (h == 0 || w == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
int b, c, r, i = 0;
|
||||||
|
|
||||||
|
for (b = 0; b <= (int)max(&h, &w); b++) {
|
||||||
|
int ex = (w - b - 1), ey = (h - b - 1);
|
||||||
|
|
||||||
|
for (c = b; c <= ex; c++) yss[i++] = xss[b * w + c];
|
||||||
|
for (r = b + 1; r <= ey; r++) yss[i++] = xss[r * w + ex];
|
||||||
|
|
||||||
|
if (ex == b || ey == b) return;
|
||||||
|
|
||||||
|
for (c = ex - 1; c >= b; c--) yss[i++] = xss[ey * w + c];
|
||||||
|
for (r = ey - 1; r > b; r--) yss[i++] = xss[r * w + b];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t max(const size_t *a, const size_t *b) { return (*a < *b ? *b : *a); }
|
||||||
|
|
||||||
|
bool validate(int* res, int* exp, size_t len) {
|
||||||
|
bool valid = true;
|
||||||
|
for (size_t i = 0; i < len; i++) {
|
||||||
|
if (res[i] != exp[i]) {
|
||||||
|
valid = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf(valid ? "true\n" : "false\n");
|
||||||
|
return valid;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
bool all_valid = true;
|
||||||
|
|
||||||
|
int initial1[3*3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
|
||||||
|
int expected1[sizeof(initial1)] = {1, 2, 3, 6, 9, 8, 7, 4, 5};
|
||||||
|
int* result = malloc(sizeof(initial1));
|
||||||
|
snail(initial1, result, 3, 3);
|
||||||
|
all_valid &= validate(result, expected1, sizeof(initial1) / sizeof(int));
|
||||||
|
free(result);
|
||||||
|
|
||||||
|
int initial2[3 * 4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
|
||||||
|
int expected2[3 * 4] = {1, 2, 3, 4, 8, 12, 11, 10, 9, 5, 6, 7};
|
||||||
|
result = malloc(sizeof(initial2));
|
||||||
|
snail(initial2, result, 3, 4);
|
||||||
|
all_valid &= validate(result, expected2, sizeof(initial2) / sizeof(int));
|
||||||
|
free(result);
|
||||||
|
|
||||||
|
int initial3[5 * 3] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
|
||||||
|
int expected3[5 * 3] = {1, 2, 3, 6, 9, 12, 15, 14, 13, 10, 7, 4, 5, 8, 11};
|
||||||
|
result = malloc(sizeof(initial3));
|
||||||
|
snail(initial3, result, 5, 3);
|
||||||
|
all_valid &= validate(result, expected3, sizeof(initial3) / sizeof(int));
|
||||||
|
free(result);
|
||||||
|
|
||||||
|
printf(all_valid ? "all tests passed\n" : "tests failed\n");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
61
snail.d
Normal file
61
snail.d
Normal file
@ -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;
|
||||||
|
}
|
||||||
62
snail.nim
Normal file
62
snail.nim
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
|
||||||
|
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"
|
||||||
51
snail.odin
Normal file
51
snail.odin
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
package main
|
||||||
|
import "core:fmt"
|
||||||
|
|
||||||
|
snail :: proc(xss: [][]int) -> [dynamic]int {
|
||||||
|
yss := [dynamic]int{}
|
||||||
|
|
||||||
|
h := len(xss)
|
||||||
|
if h == 0 { return yss }
|
||||||
|
w := len(xss[0])
|
||||||
|
if w == 0 { return yss }
|
||||||
|
|
||||||
|
for b in 0..=max(h, w) {
|
||||||
|
ex := w - b - 1
|
||||||
|
ey := h - b - 1
|
||||||
|
|
||||||
|
for c in b..=ex { append(&yss, xss[b][c]) }
|
||||||
|
for r in (b + 1)..=ey { append(&yss, xss[r][ex]) }
|
||||||
|
|
||||||
|
if ex == b || ey == b { return yss }
|
||||||
|
|
||||||
|
for c_off in b..<ex { append(&yss, xss[ey][ex - 1 - c_off]) }
|
||||||
|
for r_off in (b + 1)..<ey { append(&yss, xss[ey - r_off][b]) }
|
||||||
|
}
|
||||||
|
|
||||||
|
return yss
|
||||||
|
}
|
||||||
|
|
||||||
|
eq :: proc(a: []$T, b: []$S) -> bool {
|
||||||
|
if len(a) != len(b) { return false }
|
||||||
|
for i in 0..<len(a) {
|
||||||
|
if a[i] != b[i] { return false }
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
main :: proc() {
|
||||||
|
initial := [][]int{ {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }
|
||||||
|
expected := [dynamic]int{1, 2, 3, 6, 9, 8, 7, 4, 5}
|
||||||
|
fmt.println(eq(snail(initial)[:], expected[:]))
|
||||||
|
|
||||||
|
initial = [][]int{ {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}
|
||||||
|
fmt.println(eq(snail(initial)[:], expected[:]))
|
||||||
|
|
||||||
|
initial = [][]int{ {1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12}, {13, 14, 15} }
|
||||||
|
expected = [dynamic]int{1, 2, 3, 6, 9, 12, 15, 14, 13, 10, 7, 4, 5, 8, 11}
|
||||||
|
fmt.println(eq(snail(initial)[:], expected[:]))
|
||||||
|
|
||||||
|
fmt.println("all tests passed")
|
||||||
|
}
|
||||||
55
snail.py
Normal file
55
snail.py
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
#!/bin/env python3
|
||||||
|
|
||||||
|
def snail(xss):
|
||||||
|
h = len(xss)
|
||||||
|
w = len(xss[0])
|
||||||
|
|
||||||
|
if h == 0 or w == 0:
|
||||||
|
return []
|
||||||
|
|
||||||
|
v = []
|
||||||
|
|
||||||
|
for b in range(0, max(w, h) + 1):
|
||||||
|
ex = w - b - 1
|
||||||
|
ey = h - b - 1
|
||||||
|
|
||||||
|
for c in range(b, ex+1):
|
||||||
|
v.append(xss[b][c])
|
||||||
|
for r in range(b+1, ey+1):
|
||||||
|
v.append(xss[r][ex])
|
||||||
|
|
||||||
|
if ex == b or ey == b:
|
||||||
|
return v
|
||||||
|
|
||||||
|
for c in range(ex-1, b-1, -1):
|
||||||
|
v.append(xss[ey][c])
|
||||||
|
for r in range(ey-1, b, -1):
|
||||||
|
v.append(xss[r][b])
|
||||||
|
|
||||||
|
return v
|
||||||
|
|
||||||
|
initial = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
|
||||||
|
expected = [1, 2, 3, 6, 9, 8, 7, 4, 5]
|
||||||
|
|
||||||
|
assert(snail(initial) == expected)
|
||||||
|
print(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)
|
||||||
|
print(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)
|
||||||
|
print(snail(initial) == expected)
|
||||||
|
|
||||||
|
print("all tests passed")
|
||||||
56
snail.rs
Normal file
56
snail.rs
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
fn snail<T>(xss: &[Vec<T>]) -> Vec<T>
|
||||||
|
where
|
||||||
|
T: Copy,
|
||||||
|
{
|
||||||
|
let h: usize = xss.len();
|
||||||
|
let w: usize = xss.get(0).map(Vec::len).unwrap_or(0);
|
||||||
|
|
||||||
|
if w == 0 || h == 0 {
|
||||||
|
return Vec::new();
|
||||||
|
}
|
||||||
|
|
||||||
|
(0..=(h.max(w) / 2)).fold(Vec::with_capacity(w * h), |mut v, b| {
|
||||||
|
let ex = w - b - 1;
|
||||||
|
let ey = h - b - 1;
|
||||||
|
|
||||||
|
let it = (b..=ex)
|
||||||
|
.map(|c| xss[b][c])
|
||||||
|
.chain(((b + 1)..=ey).map(|r| xss[r][ex]));
|
||||||
|
|
||||||
|
if ex == b || ey == b {
|
||||||
|
v.extend(it);
|
||||||
|
v
|
||||||
|
} else {
|
||||||
|
v.extend(
|
||||||
|
it.chain((b..ex).rev().map(|c| xss[ey][c]))
|
||||||
|
.chain(((b + 1)..ey).rev().map(|r| xss[r][b])),
|
||||||
|
);
|
||||||
|
|
||||||
|
v
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let initial = &[vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9]];
|
||||||
|
let expected = vec![1, 2, 3, 6, 9, 8, 7, 4, 5];
|
||||||
|
assert_eq!(expected, snail(initial));
|
||||||
|
println!("{}", expected == snail(initial));
|
||||||
|
|
||||||
|
let initial = &[vec![1, 2, 3, 4], vec![5, 6, 7, 8], vec![9, 10, 11, 12]];
|
||||||
|
let expected = vec![1, 2, 3, 4, 8, 12, 11, 10, 9, 5, 6, 7];
|
||||||
|
assert_eq!(expected, snail(initial));
|
||||||
|
println!("{}", expected == snail(initial));
|
||||||
|
|
||||||
|
let initial = &[
|
||||||
|
vec![1, 2, 3],
|
||||||
|
vec![4, 5, 6],
|
||||||
|
vec![7, 8, 9],
|
||||||
|
vec![10, 11, 12],
|
||||||
|
vec![13, 14, 15],
|
||||||
|
];
|
||||||
|
let expected = vec![1, 2, 3, 6, 9, 12, 15, 14, 13, 10, 7, 4, 5, 8, 11];
|
||||||
|
assert_eq!(expected, snail(initial));
|
||||||
|
println!("{}", expected == snail(initial));
|
||||||
|
println!("all tests passed");
|
||||||
|
}
|
||||||
49
snail.v
Normal file
49
snail.v
Normal file
@ -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')
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user