年賀クイズ

今年の従兄弟出題の年賀クイズは2011年に比べると手計算向けです。

従兄弟の出題: a × b × (c × d + e) × (f × g + h - i) = 2013
1から9までの整数をすべて1度ずつ使い、a から i まで埋めてください。

出題のままですと、a と b、c と d、そして f と g のそれぞれは整数の組なので交換法則が成り立つことから重複解が存在します。なので、ここではさらに制限を加えることにします。

    a < b かつ c < d かつ f < g

私が元旦の晩に解いたやりかたを以下に書いておきます。

最初に、4 つの因子の掛け算が 2013 になればいいのですから、2013 を因数分解しました。

    2013 = 3 × 11 × 61

すると、3 つの素数の掛け算になっています。出題は 4 つの因子の掛け算ですので、この時点で a と b はそれぞれ 1 と 3 に確定します。

    a = 1
    b = 3
    残りの数の集合 = {2, 4, 5, 6, 7, 8, 9} 

確定していない2つの因子のうち f を含む方に引き算があるので、大小関係は f を含む因子の方が小さいのだろうと見当をつけました。

    c × d + e > f × g + h - i

まず c × d + e = 61 となる組み合わせから。すぐに暗算で 2 通り思い当たりました。

    場合1) 6 × 9 + 7 = 61 かつ 残りの数の集合 = {2, 4, 5, 8}
    場合2) 7 × 8 + 5 = 61 かつ 残りの数の集合 = {2, 4, 6, 9}

残りの数を抜き出すと、両方の場合とも f × g + h - i = 11 にすることができます。

    場合1) 2 × 4 + 8 - 5 = 11
    場合2) 2 × 4 + 9 - 6 = 11

以上まとめて、2 通りの解が求まりました。

    1 × 3 × (6 × 9 + 7) × (2 × 4 + 8 - 5) = 2013
    1 × 3 × (7 × 8 + 5) × (2 × 4 + 9 - 6) = 2013

さらにそれぞれで整数の掛け算の交換法則から a と b、c と d、そして f と g のそれぞれをひっくり返してもかまわないため、解は合計で 2 × 8 = 16 通りあります。

ここまでが元旦の晩の結論でした。他の組み合わせは暗算では思い当たらなかったのですが、いくらなんでも検算ぐらいはしておいた方が良いだろうと頭の片隅に残っていたので、今夜、しらみ潰し探索を ruby でやってみることにしました。

#!/usr/bin/env ruby
# -*- coding: utf-8 -*-

(1 .. 9).to_a.permutation(9) do |a, b, c, d, e, f, g, h, i|
  next unless a < b && c < d && f < g
  formula = "#{a} * #{b} * (#{c} * #{d} + #{e}) * (#{f} * #{g} + #{h} - #{i})"
  if 2013 == eval(formula)
    puts formula
  end
end

結論はやっぱり上の 2 通りだけでした。