鍋あり谷あり

テーマを決めずに適当に書いています。

数字を作る

ふと思いついた問題。

1〜9 の数字 N個の組を q とする。q と四則演算を組み合わせて作ることのできる正の整数の集合をS(q)とする。S(q)に含まれない最小の正の整数を X(q)+1 とする。
X(q) が最大になるような q と、そのときの X(q) を求めよ。

厳密に書こうとするとわかりにくいが、結果を書けば何の問題だかわかりやすい。
総当りした結果:

N=1 → 1 : [1]
N=2 → 3 : [1,2]
N=3 → 10 : [1,2,4]
N=4 → 51 : [1,2,5,8]

であった。
つまり、[1,2,5,8]と四則演算があれば、1〜51の整数がすべて作れるということである。
元の数の上限を 9 と定めたのは、上限なしだとすべてを列挙することができないからで、ある意味敗北である。上限なしで何とかするにはどうすればいいのだろう。

それと。
演算を列挙するために、

def (($ops<<Object.new)[-1]).op( x, y )
   x+y
end

なんてことを書いてみたんだが、普通はどう書くんでしょうか?> ruby ユーザーの方