1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
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