Add day 9 solutions
This commit is contained in:
parent
2b88faf388
commit
874716448e
39
day9.chpl
Normal file
39
day9.chpl
Normal file
|
@ -0,0 +1,39 @@
|
|||
use IO, Set;
|
||||
|
||||
const moveList = [ "L" => (-1, 0), "R" => (1, 0), "U" => (0, 1), "D" => (0, -1) ];
|
||||
|
||||
iter moves() {
|
||||
for line in stdin.lines().strip() {
|
||||
const (dir, _, n) = line.partition(" ");
|
||||
yield (moveList[dir], n : int);
|
||||
}
|
||||
}
|
||||
|
||||
config const length = 2;
|
||||
var rope: [0..<length] (int, int) = (0, 0);
|
||||
|
||||
proc move((hx, hy), (tx, ty)): (int, int) {
|
||||
const (dx, dy) = (hx - tx, hy - ty);
|
||||
if abs(dx) > 1 && dy == 0 {
|
||||
tx += sgn(dx);
|
||||
} else if abs(dy) > 1 && dx == 0 {
|
||||
ty += sgn(dy);
|
||||
} else if abs(dx) + abs(dy) > 2 {
|
||||
tx += sgn(dx);
|
||||
ty += sgn(dy);
|
||||
}
|
||||
return (tx, ty);
|
||||
}
|
||||
|
||||
var visited = new set((int, int));
|
||||
|
||||
for (delta, n) in moves() {
|
||||
for 1..n {
|
||||
rope[0] += delta;
|
||||
for idx in 1..<length {
|
||||
rope[idx] = move(rope[idx-1], rope[idx]);
|
||||
}
|
||||
visited.add(rope.last);
|
||||
}
|
||||
}
|
||||
writeln(visited.size);
|
56
day9.cr
Normal file
56
day9.cr
Normal file
|
@ -0,0 +1,56 @@
|
|||
require "advent"
|
||||
|
||||
INPUT = input(2022, 9).lines.map do |line|
|
||||
dir, n = line.split(" ");
|
||||
{dir, n.to_i64}
|
||||
end
|
||||
|
||||
|
||||
positions = Set(Tuple(Int32, Int32)).new
|
||||
|
||||
diff = { "L" => {-1, 0}, "R" => {1, 0}, "U" => {0, 1}, "D" => {0, -1} }
|
||||
|
||||
def move(h, d)
|
||||
{h[0] + d[0], h[1] + d[1]}
|
||||
end
|
||||
|
||||
def follow(h, t)
|
||||
hx, hy = h
|
||||
tx, ty = t
|
||||
dx = hx-tx
|
||||
dy = hy-ty
|
||||
|
||||
if dx.abs > 1 && dy.abs == 0
|
||||
tx += dx.sign
|
||||
elsif dy.abs > 1 && dx.abs == 0
|
||||
ty += dy.sign
|
||||
elsif dx.abs + dy.abs > 2
|
||||
tx += dx.sign
|
||||
ty += dy.sign
|
||||
end
|
||||
|
||||
h = {hx, hy}
|
||||
t = {tx, ty}
|
||||
return {h, t}
|
||||
end
|
||||
|
||||
def simulate(knots, d)
|
||||
knots[0] = move(knots[0], d)
|
||||
(knots.size-1).times do |i|
|
||||
knots[i], knots[i+1] = follow(knots[i], knots[i+1])
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
knots = [{0, 0}] * 10
|
||||
INPUT.each do |cmd|
|
||||
dir, n = cmd
|
||||
d = diff[dir]
|
||||
|
||||
n.times do
|
||||
simulate(knots, d)
|
||||
positions << knots.last
|
||||
end
|
||||
end
|
||||
|
||||
puts positions.size
|
Loading…
Reference in New Issue
Block a user