From ad8fb67c6c922577997dc4e988089c56f70d4a0e Mon Sep 17 00:00:00 2001 From: Alpha Chen Date: Fri, 11 Dec 2020 22:11:18 -0800 Subject: [PATCH] [2020][ruby][12.x] --- 2020/ruby/day_12.rb | 54 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 2020/ruby/day_12.rb diff --git a/2020/ruby/day_12.rb b/2020/ruby/day_12.rb new file mode 100644 index 0000000..62c1c1c --- /dev/null +++ b/2020/ruby/day_12.rb @@ -0,0 +1,54 @@ +actions = ARGF.read.scan(/(\w)(\d+)/).map {|a,v| [a, v.to_i] } + +dir = 0 +pos = [0, 0] +way = [10, 1] +actions.each do |a,v| + # delta = case a + # when ?N + # [ 0, v] + # when ?S + # [ 0, -v] + # when ?E + # [ v, 0] + # when ?W + # [-v, 0] + # when ?L + # dir += v + # [0, 0] + # when ?R + # dir -= v + # [0, 0] + # when ?F + # rad = dir * Math::PI / 180.0 + # [v * Math.cos(rad), v * Math.sin(rad)].map(&:round) + # else + # fail + # end + case a + when ?N + way[1] += v + when ?S + way[1] -= v + when ?E + way[0] += v + when ?W + way[0] -= v + when ?L + rad = Math.atan2(*way.reverse) + dis = Math.sqrt(way.map {|x| x**2 }.sum) + rad += v * Math::PI / 180 + way = [dis * Math.cos(rad), dis * Math.sin(rad)].map(&:round) + when ?R + rad = Math.atan2(*way.reverse) + dis = Math.sqrt(way.map {|x| x**2 }.sum) + rad -= v * Math::PI / 180 + way = [dis * Math.cos(rad), dis * Math.sin(rad)].map(&:round) + when ?F + delta = way.map {|i| v * i } + pos = pos.zip(delta).map {|a,b| a + b } + else + fail + end +end +p pos.map(&:abs).sum