# オフラインリアルタイムどう書くE14 の問題の実装例

• 0
いいね
• 0
コメント
に更新
3

オフラインリアルタイムどう書くE14 の問題の実装例です。

```def rot( f )
f.transpose.reverse
end

# 横に4マス続くパターンを含む展開図
def solve1(m)
(1..m.size-2).each do |y|
(0..m[0].size-4).each do |x|
a=m[y][x]
b=m[y][x+1]
next if a==b
next unless 7-a==m[y][x+2]
next unless 7-b==m[y][x+3]
rest = [*1..6] - [a, 7-a, b, 7-b]
return true if [0,1].any?{ |ix| m[y-1][x,4].include?(rest[ix] ) && m[y+1][x,4].include?(rest[1-ix] ) }
end
end
false
end

# 3×1 が2つという形の展開図
def solve2(m)
(0..m.size-2).each do |y|
(0..m[0].size-5).each do |x|
a,b,c =[0,1,2].map{ |ix| m[y][x+ix] }
d,e,f =[0,1,2].map{ |ix| m[y+1][x+ix+2] }
return true if a+c==7 && d+f==7 && b+e==7 && [a,b,c,d,e,f].uniq.size==6
end
end
false
end

# 階段状の展開図
def solve3(m)
(0..m.size-3).each do |y|
(0..m[0].size-4).each do |x|
a,b =[0,1].map{ |ix| m[y][x+ix] }
c,d =[0,1].map{ |ix| m[y+1][x+ix+1] }
e,f =[0,1].map{ |ix| m[y+2][x+ix+2] }
return true if a+d==7 && b+e==7 && c+f==7 && [a,b,c,d,e,f].uniq.size==6
end
end
false
end

# それ以外の展開図
def solve4(m)
(0..m.size-3).each do |y|
(0..m[0].size-4).each do |x|
b,c,d =[0,1,2].map{ |ix| m[y+1][x+ix+1] }
e,f =[0,1].map{ |ix| m[y+2][x+ix] }
a, = [*1..6] - [ b, c, d, e, f ]
next unless m[y][x+1,3].include?(a)
return true if a+f==7 && b+d==7 && c+e==7 && [a,b,c,d,e,f].uniq.size==6
end
end
false
end

def solve_impl( src )
field = src.split(",").map{ |x| x.chars.map(&:to_i) }
2.times do
4.times do |r|
return "1" if solve1(field)
return "2" if solve2(field)
return "3" if solve3(field)
return "4" if solve4(field)
field = rot( field )
end
field = field.reverse
end
false
end

def solve( src )
(!!solve_impl(src)).to_s
end

if \$0==__FILE__
okays = DATA.map do |line|
num, src, expected = line.split(/\s+/)
actual = solve( src )
ok = actual==expected
p [ ok ? "ok" : "**NG**", num, src, actual, expected ]
ok
end
p [ okays.count{ |x| x }, okays.size ]
end

__END__
0 44165,44516 false 状況
1 26265,31436 true  状況
2 46345,54215 true  状況
3 62143,11152 false 状況
4 4242,4314,1562  false 状況
5 5612,3656,4523  false 状況
136 5545354,6566343,3525411,5356165,4625265,1535435,5522665 false 状況
```

いつもどおり、テストケースの大半は省略。

45分ぐらいで解けた気がするけど、苦しい感じだった。
解けてほっとした。

展開図を4種類に分けて、それぞれベタに書くという戦略
手数が多いので書ききれるかどうか心配だったけどなんとかなった。

想定解がどうなっているのかはまだわからないんだけど、どうなんだろ。