カプセルトイ

文字列の gacha を 可変配列の box に格納。

ガチャを回すときに remove で取り出したガチャを box から減らす。

box が 空 の状態で remove すると実行時エラーになる。

scala> val gacha = "R"*3 + "U"*15 + "C"*82
gacha: String = RRRUUUUUUUUUUUUUUUCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
scala> val box = scala.collection.mutable.ArrayBuffer[Char]()
box: scala.collection.mutable.ArrayBuffer[Char] = ArrayBuffer()
scala> box ++= gacha
res45: box.type = ArrayBuffer(R, R, R, U, U, U, U, U, U, U, U, U, U, U, U, U, U, U, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C)
scala> box(0)
res46: Char = R
scala> box(50)
res47: Char = C
scala> box.remove(0)
res48: Char = R
scala> box
res49: scala.collection.mutable.ArrayBuffer[Char] = ArrayBuffer(R, R, U, U, U, U, U, U, U, U, U, U, U, U, U, U, U, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C)
scala> import scala.util.Random
import scala.util.Random
scala> box.remove(Random.nextInt(box.size))
res50: Char = C
scala> box.remove(Random.nextInt(box.size))
res51: Char = C
scala> box.remove(Random.nextInt(box.size))
res52: Char = C
scala> box.remove(Random.nextInt(box.size))
res53: Char = C
scala> box.remove(Random.nextInt(box.size))
res54: Char = C
scala> box.remove(Random.nextInt(box.size))
res55: Char = C
scala> box.remove(Random.nextInt(box.size))
res56: Char = U
scala> box.remove(Random.nextInt(box.size))
res57: Char = C
scala> box.size
res58: Int = 91
scala> box
res59: scala.collection.mutable.ArrayBuffer[Char] = ArrayBuffer(R, R, U, U, U, U, U, U, U, U, U, U, U, U, U, U, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C)
scala> (1 to 20) map { _ => box.remove(Random.nextInt(box.size))}
res60: scala.collection.immutable.IndexedSeq[Char] = Vector(U, C, C, U, C, C, C, C, C, C, C, C, R, C, C, C, C, C, C, U, C)
scala> (1 to 100) map { _ => box.remove(Random.nextInt(box.size))}

実行時エラー

scala> box
res62: scala.collection.mutable.ArrayBuffer[Char] = ArrayBuffer()

box が 空 の状態で ガチャを回してもエラーにならないように修正したもの↓

withFilter の例では、1からガチャの残り個数までガチャを回す。※n回目が、ガチャの最初の個数を下回っているかチェックする。一度上回ると、回数は増え続けるので以後下回ることはないが、指定された回数200までチェックは続ける。

takeWhile の例では、ガチャを回す回数をガチャを引き始める前の残り個数に制限してから、ガチャを回す。

最後の例では、ガチャの残り個数を調べてから、ガチャをひく回数を決める。ガチャをひく予定の回数が残り個数を超えていたら、残り全ての分、ガチャを回す。

box ++= gacha
(1 to 200) withFilter( _ < box.size) map { _ => box.remove(Random.nextInt(box.size))}
box ++= gacha
(1 to 200) takeWhile( _ < box.size) map { _ => box.remove(Random.nextInt(box.size))}

(1 to (if( 200 < gacha.size) 200 else gacha.size)) map { _ => box.remove(Random.nextInt(box.size))}