読者です 読者をやめる 読者になる 読者になる

No Programming, No Life

新しいNPNLです。http://d.hatena.ne.jp/fumokmm/ から引っ越してきました。

Re:エレベータの制御(基本編)

どう書く Groovy

お題: Server error
投稿: Server error

エレベータシミュレーションは楽しいですね。

考察

今回投稿したコードの、待っている人がいる最上階を探すための

// 待っている人がいる最上階を探す
  def nextList = []
  elev.floors.tail()*.persons.eachWithIndex{ item, idx ->
    nextList << [idx+1, item]
  }
  def topFloor = nextList.findAll{ it[1] != 0 }.last()[0]

の部分がGroovy的なコードとしては効率が悪いな。
なんとかならんだろうか。

これ、要するに


[3, 4, 0, 0]

のようなリストの4のindex(後ろから見て最初に0でなくなる値のindex)を取得したいだけなんですが、一回、

[ [1, 3], [2, 4], [3, 0], [4, 0] ]

のような[index, 元の値]みたいなリストにしてから目的の値を探しています。

追記(2009-01-15)

Groovyでzip - lottzの日記にまさにこの問題を解決する答えがありました。
上記例の場合、

assert [[1, 3], [2, 4], [3, 0], [4, 0]] == [[1, 2, 3, 4], [3, 4, 0, 0]].transpose()
ということで、transpose版はこんな感じかな?
// fumokmm 2009-01-15 Update
//  def nextList = []
//  elev.floors.tail()*.persons.eachWithIndex{ item, idx ->
//    nextList << [idx+1, item]
//  }
//  def topFloor = nextList.findAll{ it[1] != 0 }.last()[0]
  def topFloor = [
    (1..elev.floors.tail()*.persons.size()) as List,
    elev.floors.tail()*.persons
  ].transpose().findAll{ it[1] != 0 }.last()[0]
// fumokmm 2009-01-15 Update

うん、一行ですっきり。