オフラインリアルタイムどう書くF01の解答


rubyでオフラインリアルタイムどう書くF01の問題を解きました。
1時間20分ぐらいかけてテストが通って、その後多少修正しました。

```twoarea.rb
def is_out_of_bounds( x, y, x_max, y_max )
  if x < 0 or x >= x_max then
    true
  elsif y < 0 or y >= y_max then
    true
  else
    false
  end
end

def count_next( m, x, y, x_max, y_max )
  [
   [ -1, 0, ],
   [ 1, 0, ],
   [ 0, -1, ],
   [ 0, 1, ],
  ].inject(0) { |sum, (dx, dy)|
    nx = x + dx
    ny = y + dy
    next sum if is_out_of_bounds( nx, ny, x_max, y_max )
    if m[x][y] == m[nx][ny] then
      next sum + 1
    end
    sum
  }
end

def process(input)
  m = input.split('/').map { |line|
    (0...8).map { |shift|
      (line.to_i(16) >> shift) & 1
    }
  }

  v = (0...m.length).map { |x|
    (0...m[x].length).map { |y|
      count_next( m, x, y, m.length, m[x].length )
    }
  }

  (0...v.length).each_with_object( [0,0,] ) { |x, result|
    (0...v[x].length).each { |y|
      next if v[x][y] != 1
      [
       [ 1, 0, ], [ 0, 1, ],
      ].each { |dx, dy|
        nx = x + dx
        ny = y + dy
        next if is_out_of_bounds( nx, ny, v.length, v[x].length )
        if v[nx][ny] == 1 and m[x][y] == m[nx][ny] then
          value = m[x][y]
          result[value] = result[value] + 1
        end
      }
    }
  }.join(',')
end

def test(input, answer)
  result = process(input)
  if result != answer then
    puts 'NG: input = %s, answer = %s, result = %s' % [ input, answer, result, ]
    exit 1
  else
    puts 'OK: input = %s' % [ input, ]
  end
end

test( "dc/bc/a7/59/03/d5/d4/ea", "2,3" )    
test( "ff/ff/ff/ff/ff/ff/ff/ff", "0,0" )    
test( "00/00/00/00/00/00/00/00", "0,0" )    
test( "cc/33/cc/33/cc/33/cc/33", "16,16" )    
test( "aa/aa/55/55/aa/aa/55/55", "16,16" )    
test( "ac/a3/5c/53/ca/3a/c5/35", "8,8" )    
test( "db/00/db/00/db/00/aa/aa", "0,13" )    
test( "24/24/db/24/24/db/24/24", "0,12" )    
test( "d7/d7/e9/f1/f7/de/60/56", "3,2" )    
test( "17/7d/64/9b/a5/39/53/a6", "2,2" )    
test( "bb/8f/18/fb/89/c2/c7/35", "1,2" )    
test( "6d/63/20/08/54/cd/32/4f", "2,2" )    
test( "a9/ca/cd/46/99/e6/f0/30", "2,2" )    
test( "5b/70/fd/45/e2/a1/ab/9a", "1,2" )    
test( "24/e4/a8/12/e1/a6/3f/f3", "2,1" )    
test( "79/32/2e/07/d5/10/e7/9d", "2,2" )    
test( "60/bc/ab/ec/1f/eb/63/2c", "4,2" )    
test( "a5/dd/92/4e/67/c6/dc/34", "6,1" )    
test( "aa/96/6d/67/d2/a8/ac/90", "3,2" )    
test( "95/72/7d/5c/47/dc/ef/99", "4,0" )    
test( "17/d6/6a/27/1f/25/26/b8", "2,1" )    
test( "f0/f3/76/c5/31/ca/6b/ae", "1,2" )    
test( "01/59/26/fa/8c/70/12/cd", "1,4" )    
test( "1a/c3/1f/0b/83/b6/81/0d", "0,5" )    
test( "4c/49/05/cf/54/bb/1f/da", "1,2" )    
test( "eb/7c/d5/09/2a/c2/14/6b", "0,7" )    
test( "b4/d3/4c/c4/ed/19/e8/63", "1,3" )    
test( "bd/bc/6d/60/9b/00/9a/32", "2,4" )    
test( "94/97/3f/e3/c7/06/15/c0", "2,2" )    
test( "5f/1d/67/16/b8/f7/0a/2a", "2,2" )    
test( "df/e6/f9/4f/59/e9/1f/ee", "3,0" )    
test( "5a/53/9a/9a/73/b4/37/07", "3,2" )    
test( "bd/87/7c/e7/c0/37/82/da", "2,3" )    
test( "3d/c0/13/ac/57/3d/15/78", "2,2" )    
test( "63/64/54/3a/40/28/4e/4e", "0,3" )    
test( "f6/81/c9/15/00/4c/a0/a8", "1,4" )    
test( "19/41/df/f8/e3/74/6b/9b", "4,2" )    
test( "d5/0b/dd/35/3b/d2/0b/6b", "1,5" )    
test( "08/b7/91/f3/6e/3c/74/a0", "0,0" )    
test( "b8/a8/b4/a6/93/2c/94/3f", "0,0" )    
test( "88/22/21/ee/dc/19/43/01", "0,0" )    
test( "e1/ee/35/bc/fc/00/8e/fe", "0,0" )    
test( "3c/42/63/5f/27/47/07/90", "0,0" )
```