[2019][ruby][11.x] use trig
change ospuprqxrvsuuxswsmkvyuwtznxtxvpp
commit 5128e6b37ef54d0e220e7bc62263a34785feed21
author Alpha Chen <alpha@kejadlen.dev>
date
parent vosqrtyy
diff --git a/2019/ruby/day_11.rb b/2019/ruby/day_11.rb
index 7accfe2..49cf6da 100644
--- a/2019/ruby/day_11.rb
+++ b/2019/ruby/day_11.rb
@@ -2,16 +2,17 @@ require "stringio"
 
 require_relative "computer"
 
+include Math
+
 panels = Hash.new {|h,k| h[k] = [0]}
 panels[[0, 0]] = [1]
 
 i_r, i_w = IO.pipe
 o_r, o_w = IO.pipe
 
-Robot = Struct.new(:panel, :dir)
+Robot = Struct.new(:panel, :rad)
 
-dirs = %i[ up right down left ]
-robot = Robot.new([0, 0], 0)
+robot = Robot.new([0, 0], PI/2)
 
 t = Thread.new {
   loop do
@@ -19,22 +20,11 @@ t = Thread.new {
 
     panels[robot.panel] << o_r.gets.to_i
     dir = o_r.gets.to_i
+    raise "unexpected direction: #{dir}" unless [0, 1].include?(dir)
+
+    robot.rad += -(2*dir - 1) * (PI/2)
 
-    delta = case dir
-            when 0 then -1
-            when 1 then 1
-            else raise "unexpected direction: #{dir}"
-            end
-    robot.dir += delta
-    robot.dir %= dirs.size
-    dir = dirs.fetch(robot.dir)
-
-    delta = case dir
-            when :up    then [ 0,  1]
-            when :right then [ 1,  0]
-            when :down  then [ 0, -1]
-            when :left  then [-1,  0]
-            end
+    delta = [cos(robot.rad).to_i, sin(robot.rad).to_i]
     robot.panel = robot.panel.zip(delta).map(&:sum)
   end
 }