44 lines
915 B
Crystal
44 lines
915 B
Crystal
def parse(s)
|
|
s.split(",").map { |ss| { ss[0], ss[1..].to_i32 } }
|
|
end
|
|
|
|
def run_line(l)
|
|
poses = Set({Int32,Int32}).new
|
|
step_map = {} of {Int32,Int32} => Int32
|
|
x, y, steps = 0, 0, 0
|
|
l.each do |cmd|
|
|
dir, len = cmd
|
|
dx, dy = 0, 0
|
|
case dir
|
|
when 'U'
|
|
dy = 1
|
|
when 'D'
|
|
dy = -1
|
|
when 'L'
|
|
dx = -1
|
|
when 'R'
|
|
dx = 1
|
|
end
|
|
len.times do |i|
|
|
x += dx
|
|
y += dy
|
|
steps += 1
|
|
poses << {x,y}
|
|
step_map[{x,y}] ||= steps
|
|
end
|
|
end
|
|
return {poses, step_map}
|
|
end
|
|
|
|
lines = File.read("day3.txt").lines.map(&.chomp)
|
|
# wire1 = parse("R8,U5,L5,D3")
|
|
# wire2 = parse("U7,R6,D4,L4")
|
|
# puts run_line(wire1)
|
|
# puts run_line(wire2)
|
|
wire1 = parse(lines[0])
|
|
wire2 = parse(lines[1])
|
|
poses1, steps1 = run_line(wire1)
|
|
poses2, steps2 = run_line(wire2)
|
|
puts (poses1 & poses2).min_of { |p| p[0] + p[1] }
|
|
puts (poses1 & poses2).min_of { |p| steps1[p] + steps2[p] }
|