aboutsummaryrefslogtreecommitdiff
path: root/day09/part2.rb
diff options
context:
space:
mode:
Diffstat (limited to 'day09/part2.rb')
-rw-r--r--day09/part2.rb93
1 files changed, 93 insertions, 0 deletions
diff --git a/day09/part2.rb b/day09/part2.rb
new file mode 100644
index 0000000..30fe1db
--- /dev/null
+++ b/day09/part2.rb
@@ -0,0 +1,93 @@
+class Pos
+ def initialize(x = 0, y = 0)
+ @x = x
+ @y = y
+ end
+
+ attr_reader :x, :y
+
+ def move(dir)
+ case dir
+ when "U"
+ @y += 1
+ when "D"
+ @y -= 1
+ when "R"
+ @x += 1
+ when "L"
+ @x -= 1
+ end
+ end
+
+ def follow(head)
+ if head.x == @x - 2 && head.y == @y + 2
+ @x -= 1
+ @y += 1
+ elsif head.x == @x - 1 && head.y == @y + 2
+ @x -= 1
+ @y += 1
+ elsif head.x == @x && head.y == @y + 2
+ @y += 1
+ elsif head.x == @x + 1 && head.y == @y + 2
+ @x += 1
+ @y += 1
+
+ elsif head.x == @x + 2 && head.y == @y + 2
+ @x += 1
+ @y += 1
+ elsif head.x == @x + 2 && head.y == @y + 1
+ @x += 1
+ @y += 1
+ elsif head.x == @x + 2 && head.y == @y
+ @x += 1
+ elsif head.x == @x + 2 && head.y == @y - 1
+ @x += 1
+ @y -= 1
+
+ elsif head.x == @x + 2 && head.y == @y - 2
+ @x += 1
+ @y -= 1
+ elsif head.x == @x + 1 && head.y == @y - 2
+ @x += 1
+ @y -= 1
+ elsif head.x == @x && head.y == @y - 2
+ @y -= 1
+ elsif head.x == @x - 1 && head.y == @y - 2
+ @x -= 1
+ @y -= 1
+
+ elsif head.x == @x - 2 && head.y == @y - 2
+ @x -= 1
+ @y -= 1
+ elsif head.x == @x - 2 && head.y == @y - 1
+ @x -= 1
+ @y -= 1
+ elsif head.x == @x - 2 && head.y == @y
+ @x -= 1
+ elsif head.x == @x - 2 && head.y == @y + 1
+ @x -= 1
+ @y += 1
+ end
+ end
+
+ def coord
+ [@x, @y]
+ end
+end
+
+moves = $stdin.readlines.map(&:strip).map(&:split)
+
+rope = Array.new(10) { Pos.new }
+visited = [rope[-1].coord]
+
+moves.each do |dir, dist|
+ dist.to_i.times do
+ rope[0].move(dir)
+ (rope.length - 1).times do |i|
+ rope[i+1].follow(rope[i])
+ end
+ visited << rope[-1].coord
+ end
+end
+
+puts visited.uniq.count