2023年5月号学コン大問2

手計算でやると数え上げが面倒で、漏れがあるか心配だったので、Rubyで検算用のスクリプトを書きました。コードは別に難しくなく、答えは一瞬で出ます。使うメソッドとしては Array#permutation くらい。あとはテクニックとして 5桁の数字を構成するときにいわゆる Horner法を用いていることくらいでしょうか。nn を計算しているところ、工夫すれば再帰的に書けるような気がしないでもないです(桁数が上がっても対応できるような汎用性があると有益なんだろうけど)。

# -*- coding: utf-8 -*-
# 2023年5月号学コン大問2
# 無作為に抽出した5枚のカードで数字Nを作り
# Nが6の倍数になるときの確率を求める
#
if __FILE__ == $0 then
  aa = [1,2,2,3,3,3,4,4,4,4,5,5,5,5,5]
  ii = 0; mm = 0
  
  for cc in aa.permutation(5).to_a
    mm += 1
    if (cc.length == 5) then
      nn = ((((cc[0]*10)+cc[1])*10+cc[2])*10+cc[3])*10+cc[4]
      if (nn.modulo(6) == 0) then
        ii += 1
      end
    else
      raise "ary length must be 5: cc.length = #{cc.length}"
    end
  end
  p Rational(ii,mm) #=> (58/429)
end