神秘的な村Coinholtで、パン屋のカウンターの内側に立ち、焼きたての菓子を並べています。 扉がきしみながら開き、Denaraが入ってきます。彼女は目利きの商人で、良い品を見極める鋭い目を持っています。 軽い食事をすませると、彼女はきらめく硬貨をカウンター越しにすべらせます。その硬貨は100単位の価値を表しています。
微笑んで硬貨を受け取り、食事の合計金額に目をやります。88単位です。 つまり、お釣りとして12単位を返す必要があります。
Denaraは期待に満ちた様子で手を差し出します。 「硬貨は一番少ない枚数でいいからね」と、彼女は微笑みながら言います。 「巾着はもういっぱいだし、道中でなくしたくないの。」
いくつか選択肢があることはわかっています。 「お釣りにはLumis(10単位)、Viras(5単位)、Zenth(2単位)があります。」
頭の中で、あっという間に組み合わせを計算します。
「一番いいのは、Lumis1枚とZenth1枚の2枚ですね」と言い、お釣りを手渡します。
Denaraは微笑み、すっかり感心した様子です。 「いつもながら、間違いないわね。」
硬貨の額の合計がお釣りの正しい金額と等しくなるように、お客さんに渡す硬貨の枚数が最も少なくなる組み合わせを求めます。
ときに例外を発生させる必要があります。その際は、エラーの原因が何であるかを示す意味のあるエラーメッセージを必ず含めましょう。そうするとコードが読みやすくなり、デバッグもぐっと楽になります。エラーの原因がある型だとわかっている場合は、組み込みのエラーの型のいずれかを発生させることもできますが、その場合も意味のあるメッセージを含めるようにしましょう。
この演習では、与えられたコインでお釣りを作れないときに、raise文を使ってValueErrorを「投げる」必要があります。テストに合格するには、exceptionをraiseし、それにメッセージを添える必要があります。
メッセージ付きでValueErrorを発生させるには、そのメッセージをexception型の引数として書きます。
# example when change cannot be made with the coins passed in
raise ValueError("can't make target with given coins")