プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問をやる。今回は、Q10:ルーレットの最大値。

Q: ヨーロピアンスタイルとアメリカンスタイルのルーレットで、2<=n<=36のnについて、連続するn個の数の和が最大になる場合において、ヨーロピアンスタイルがアメリカンスタイルよりも小さくなるnの個数を求める。

val euro = Seq(0,32,15,19,4,21,2,25,17,34,6,27,13,36,11,30,8,23,10,5,24,16,33,1,20,14,31,9,22,18,29,7,28,12,35,3,26)
val usa = Seq(0,28,9,26,30,11,7,20,32,17,5,22,34,15,3,24,36,13,1,0,27,10,25,29,12,8,19,31,18,6,21,33,16,4,23,35,14,2)

def max(target:Seq[Int], n:Int):Int = {
  val length = target.length
  (0 until length).fold(0){(z,start) =>
    Seq(z,(0 until n).fold(0){(zz,n) => zz+target((start+n)%length)}).max
  }
}

(2 to 36).count{ n => max(euro, n) < max(usa, n) }

この問題のなにがだるいって、ヨーロピアンとアメリカンの数の並びを入力しないといけないっていうのがだるい。kindleなのに、図の文字はコピーできないだなんて。。