yokohama.rb#70( https://yokohamarb.doorkeeper.jp/events/45057 )で、いわゆる「どう書く」をやりました。
問題の方は http://nabetani.sakura.ne.jp/yokohamarb/2016.07.ront/
です。
実際のところ、以前出した http://nabetani.sakura.ne.jp/hena/ord5railsontiles/ のリメイクです。
で。
会場で紹介した実装例を。
def solve( src )
map = [nil]*5+[*?a..?p].each_slice(4).map{ |x| [x, nil ] }.flatten+[nil]*5
cur=[5+1,5]
seq=map[cur[0]]
m={ 1=>5, 5=>1, -1=>-5, -5=>-1 }
loop do
case src[cur[0]-5 ]
when "0"; cur[1] = -m[cur[1]]
when "1"; cur[1] = m[cur[1]]
when "2"; cur[1] = cur[1]
when "3"; return seq
end
cur[0]+=cur[1]
return seq unless map[cur[0]]
seq += map[cur[0]]
end
end
def test( src, expected )
actual = solve( src )
okay = actual == expected
p [ okay ? "ok" : "**NG**", src,actual, expected ]
end
test( "0113/1201/2201/2100", "bcgfeabfjnoklpo" ) # 0
test( "0211/1200/2220/2103", "bfjnokghdc" ) # 30
テストデータの大半は省略。
実装方針としては、
- 地図は 1次元で持つ。
- 盤面の外に出たかどうかを、番兵で判断する
というもの。
when "2"
の代入文は不要なんだけど、なんとなく書いてみた。
他の方の実装や感想は
- https://gist.github.com/hamakn/6a87a3463794754ac142741d5535f067#file-70th-md
- http://blog.kymmt.com/entry/yokohamarb-70
- http://nomnel.hatenablog.com/entry/2016/07/10/163743
- https://gist.github.com/miyohide/fefafbbf0b9ce8640991da1ee15d6fed
などをご覧いただければと思う。