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
Location = Struct.new(*%i[x y]) do
  def +(a_location)
    Location.new(self.x + a_location.x,
                 self.y + a_location.y)
  end
end

direction = Hash[{ ?^ => [0, 1],
                   ?v => [0, -1],
                   ?> => [1, 0],
                   ?< => [-1, 0] }.map {|k,v| [k, Location.new(*v)] }]

# location = Location.new(0,0)
# houses = DATA.read.strip.each_char.with_object(Hash.new {|h,k| h[k] = 0 }) do |char, houses|
#   houses[location] += 1
#   location += direction[char]
# end
# houses[location] += 1

santa = Location.new(0,0)
robo_santa = Location.new(0,0)
houses = DATA.read.strip.each_char.each_slice(2).with_object(Hash.new {|h,k| h[k] = 0 }) do |(s, rs), houses|
  houses[santa] += 1
  houses[robo_santa] += 1
  santa += direction[s]
  robo_santa += direction[rs]
end
houses[santa] += 1
houses[robo_santa] += 1

puts houses.select {|_,v| v.size > 1 }.size

__END__