プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問をやる。今回は、Q07:日付の2進数変換。

Q: 1964年10月10日から2020年7月24日の間で、YYYYMMDDの10進数を2進数に変換し、逆向きに並べ替えて10進数に戻した時、元の日付と同じになる日付を求める。

日付の操作が面倒なので、nscala-timeJoda-Timeを使う。

import com.github.nscala_time.time.Imports._
import org.joda.time.Days

val start = new DateTime("1964-10-10")
val diff = Days.daysBetween(start, new DateTime("2020-07-24")).getDays
(0 to diff).map(d => (start + d.days).toString("YYYYMMdd").toInt).filter{ date =>
  val bin = date.toBinaryString
  bin.takeRight(4) == "1001" && java.lang.Integer.parseInt(bin.reverse, 2) == date
}