プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問をやる。今回は、Q03:カードを裏返せ。 だいぶ間が空いてしまった。。

Q: 順番に並んだ1~100までの番号が書かれた100枚のカードが裏返しに置かれている。n番目のカードからn-1枚おきにカードを裏返すのを、2から100までやったとき、最後に裏向きになっているカードの番号を求めろ。

var cards = (1 to 100).map((_, false))
(2 to 100).foreach{ n =>
  cards = cards.map{case(num, side) => (num, if(num%n == 0) !side else side)}
}
cards.flatMap{case(num, side) => if(side) None else Some(num)}

だいぶやっつけな感じになってしまった。