Ruby
どう書く

yokohama.rb#70 に出した問題の実装例(ruby)

More than 1 year has passed since last update.

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" の代入文は不要なんだけど、なんとなく書いてみた。

他の方の実装や感想は

などをご覧いただければと思う。