先日行われたオフラインリアルタイムどう書く
- イベント : http://atnd.org/events/38678
- 問題 : http://nabetani.sakura.ne.jp/hena/ord10haniwa/
- 解答リンク集 : http://qiita.com/items/55641767510c2f9f235f
で、家に帰ってから思いついた実装。
この問題はまず地図を手に入れる必要がある。
作戦としては、
- ある位置からどこにいけるかを key-value pair の形で持つ( https://gist.github.com/torazuka/5553803 )
- 図の通りの角度でリテラルを持つ( http://qiita.com/items/a89b1f8693ba02c0fef9 )
- 30度傾けてリテラルを持つ( http://qiita.com/items/107e9a3f8cb41602933a )
なんかがあるんだけれども、これはどれでもない。
def map( dir ){
[
"!fghi!ePQRj!dOFGSk!cNEABHT!bMDCIU!aLKJV!ZYXW!",
"!ijkT!hRSHU!gQGBIV!fPFACJW!eOEDKX!dNMLY!cbaZ!",
"!TUVW!kHIJX!jSBCKY!iRGADLZ!hQFEMa!gPONb!fedc!",
][dir];
}
def solve( src ){
( src as List ).inject( ["A"]*2 ){ r, c ->
dir = c.toInteger()
path=map( dir % 3 )
n=path[ path.indexOf(r[1])+(dir<3 ? 1 : -1) ];
[ r[0]+n, n=="!" ? r[1] : n ]
}[0]
}
def test( src, expected ){
actual = solve( src )
ok = actual==expected ? "ok" : "***NG***"
println( "${ok} ${src}->${actual} ( ${expected})" )
}
/*0*/ test( "135004", "ACDABHS" );
/*略*/
/*45*/ test( "42434302545", "AFEOd!!ONOef" );
map(0)
は、方向 0 に進んだらどうなるかを示している。
map(1)
、map(2)
も同様。
方向3〜5は、方向0〜2の逆なので、逆にたどればよい。
辿るにあたっては、回答となる文字列と今いる位置のペアを inject で回すことにした。