オフラインでリアルタイムに「どう書く」をやるイベント( http://atnd.org/events/47025 )で。
問題は「フォークじゃない」という名前で、詳細は
http://nabetani.sakura.ne.jp/hena/ord18notfork/
です。
他の方の解答は
から辿れると思います。
で。
今回はなんとなく久々に groovy で。
(Groovy Version: 2.2.1 JVM: 1.7.0_07)
REGIS=[2,7,3,5,2]
def process( stat )
{
5.times{
stat[it][0] = [stat[it][0] - REGIS[it], 0 ].max()
}
}
def pos(stat)
{
lengths=stat.collect{ it.inject( 0, {a,b->a+b} ) }
return lengths.indexOf( lengths.min() )
}
def solve(src)
{
stat = REGIS.collect{ [0] }
src.each{
switch(it){
case "1".."9":
stat[ pos(stat) ][-1]+=it.toInteger()
break
case "x":
stat[ pos(stat) ].push 1
break
case ".":
process( stat )
break
}
}
return stat.collect{ it.inject(0,{ a,b->a+b })}.join(",")
}
def test( src, expected )
{
actual = solve( src )
if ( actual == expected ){
println "ok"
} else {
printf( "%s->%s / %s\n", src, actual, expected )
}
}
/*0*/ test( "42873x.3.", "0,4,2,0,0" );
/*51*/ test( "4.1..9..513.266..5999769852.2.38x79.x7", "12,10,13,6,10" );
いつも通り、テストデータの大半は省略。
方針としては、
- 各列を整数を要素とした配列で。
- 処理されるのは、配列の最初の要素だけ。
- xさんが来ると、配列の要素が増える。
- 普通の人が来ると、末尾の要素の人数が増える。
という感じ。
書いてみて、swith〜case に break を書かねばならないのが残念、と思った。