LoginSignup
2
2

More than 5 years have passed since last update.

第18回オフラインリアルタイムどう書く groovy で

Last updated at Posted at 2014-02-01

オフラインでリアルタイムに「どう書く」をやるイベント( 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 を書かねばならないのが残念、と思った。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2