PEをMathematicaで

Project Eulerに挑戦してみよう

Project Euler 90 / 2つの立方体の数字

立方体の6面それぞれに異なる数字(0から9)が書かれている。2番目の立方体も同様になっている。異なる位置に2つの立方体を隣りあわせることで様々な2桁の数を作ることができる。たとえば平方数である64も作ることができる。

f:id:variee:20170812010252g:plain

両方の立方体の数字をうまく選ぶと100以下のすべての平方数(01, 04, 09, 16, 25, 36, 49, 64, 81)を作ることが可能である。

たとえば {0, 5, 6, 7, 8, 9} を一方の立方体に,{1, 2, 3, 4, 8, 9} をもう一方の立方体に配置すればよい。

しかし,6と9を逆さまに回転することを許すと {0, 5, 6, 7, 8, 9} と {1, 2, 3, 4, 6, 7} のような配列で9つすべての平方数をあらわすことができる。

順番ではなくそれぞれの立方体の数字に着目して配列を区別する。

  • {1, 2, 3, 4, 5, 6} は {3, 6, 4, 1, 2, 5} と同じものとし,
  • {1, 2, 3, 4, 5, 6} は {1, 2, 3, 4, 5, 9} と異なるものとする。

6と9を逆さにすることを許すため,最後の例で区別された両方の配列のかわりに {1, 2, 3, 4, 5, 6, 9} という要素数が7つに拡張された配列を使用して2桁の数を作ることにする。

すべての平方数を表示しうる2つの立方体の異なる配列の組はいくつあるか。

Problem 90 - Project Euler

チェック用の関数を作る

まずは問題文中で与えられた2つのサイコロ a, b が条件をみたすことを確かめる関数を作ります。たとえば01を作れる条件は「aが0を含み,bが1を含む」または「aが1を含み,bが0を含む」です。MemberQ を使います。

無事,チェック成功しました。


6と9の扱い

「6しか含まなかったら9を加え,9しか含まなかったら6を加える」と変換することにしました。


本番

Subsets[Range[0, 9], {6}] でサイコロのもとを作ってチェックしました。無事,1.1秒で終了。