「rscの日記」さんが紹介されていた問題を解く(Ruby)

またまた「rscの日記」さんが紹介されていた問題を Ruby で解いてみました。

問題はこちらです。

A~Eの5人はある事業所に勤務する派遣社員である。この5人のある月曜日から金曜日までの出勤状況について次のことがわかっているとき、正しくいえるのはどれか。

  • 月曜日から木曜日はそれぞれ3人、金曜日は4人が出勤した。
  • A~Eはいずれも3日以上出勤した。
  • BとEの出勤日はすべて同じであった。
  • Cは4日連続で出勤した。
  • Dは1日おきに出勤した。

選択肢

  1. Aは火曜日に出勤した。
  2. Bは水曜日に出勤した。
  3. Cは金曜日に出勤した。
  4. DとAの出勤した日は1日だけ異なった。
  5. EとAの出勤した日は1日は1日だけ重なった。


def attend
  a = []
  (0..4).to_a.combination(3) {|x| a << x}
  (0..4).to_a.combination(4) {|x| a << x}
  a << [0, 1, 2, 3, 4]
end

def check(ar)
  day = Array.new(5, 0)
  ar.each do |x|
    x.each {|i| day[i] += 1}
  end
  (0..3).each {|i| return false unless day[i] == 3}
  return false unless day[4] == 4
  true
end

d = [0, 2, 4]    #Dは月、水、金に出席している
c1 = [0, 1, 2, 3]; c2 = [1, 2, 3, 4]    #Cは「月火水木」「火水木金」のいずれか
a = b = attend

ans = []
a.each do |a1|
  b.each do |b1|
    ans << [a1, b1, c1, d, b1] if check([a1, b1, c1, d, b1])
    ans << [a1, b1, c2, d, b1] if check([a1, b1, c2, d, b1])
  end
end
p ans
#[[[0, 2, 4], [1, 3, 4], [0, 1, 2, 3], [0, 2, 4], [1, 3, 4]]]

出力の意味は、

A「月水金」B「火木金」C「月火水木」D「月水金」E「火木金」

ですので、答えは5の「EとAの出勤した日は1日は1日だけ重なった」です。