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
diagram = ARGF.read.split("\n").map(&:chars)

dir = [0, 1]
y = 0
x = diagram[y].index(?|)

begin
  steps = 0
  loop do
    case diagram[y][x]
    when ?+
      dir = if dir[0] == 0 # going vertically
              if (diagram[y][x-1] || " ") != " "
                [-1, 0]
              else
                [1, 0]
              end
            else # going horizontally
              if (diagram[y-1][x] || " ") != " "
                [0, -1]
              else
                [0, 1]
              end
            end
    when /[a-z]/i
      # print diagram[y][x]
    when /\||\+|-/
    else
      raise diagram[y][x]
    end
    x,y = [x,y].zip(dir).map {|a,b| a + b}
    steps += 1
  end
rescue
  puts steps
end