与えられた範囲の中から、回文の積を見つけます。
回文数とは、数字を逆に並べても同じになる数のことです。
たとえば、121は回文数ですが、112はそうではありません。
ある範囲の数が与えられたとき、その範囲内の2つの数の積として表せる回文のうち、最大のものと最小のものを見つけます。
解答では、最大と最小の回文の積を、それぞれの範囲内での因数とともに返します。 最大または最小の回文の積に、範囲内での因数の組が複数ある場合は、そのすべての組を返します。
範囲[1, 9](両端を含む)が与えられたとします…
また、この範囲で考えられるすべての積を並べると、次のようになります。
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16, 18, 15, 21, 24, 27, 20, 28, 32, 36, 25, 30, 35, 40, 45, 42, 48, 54, 49, 56, 63, 64, 72, 81]
回文の積は、(この場合は)すべて1桁の数です。
[1, 2, 3, 4, 5, 6, 7, 8, 9]
最小の回文の積は1です。
その因数は(1, 1)です。
最大の回文の積は9です。
その因数は(1, 9)と(3, 3)です。
範囲[10, 99](両端を含む)が与えられたとします…
最小の回文の積は121です。
その因数は(11, 11)です。
最大の回文の積は9009です。
その因数は(91, 99)です。
smallestとlargestの実装に関する注意点どちらの関数も、2つのキーワード引数を受け取る必要があります:
max_factor: intmin_factor: int、デフォルトは0戻り値はtuple -- (value, factors)でなければなりません。ここでvalueは回文そのもので、factorsはその回文の2つの因数を任意の順序で含むiterableです。
ときには例外を発生させる必要があります。そのときは、エラーの原因が何なのかを示す意味のあるエラーメッセージを、必ず含めるようにしましょう。そうするとコードが読みやすくなり、デバッグもぐっと楽になります。エラーの原因が特定の種類であるとわかっている場合は、組み込みのエラータイプの中から選んで発生させてもかまいませんが、その場合も意味のあるメッセージを含めるようにしましょう。
この演習では、largest()関数またはsmallest()関数が正しい範囲にない因数のペアを受け取ったときに、raise文を使ってValueErrorを「スロー」する必要があります。テストが通るのは、exceptionをraiseすると同時に、それにメッセージを添えたときだけです。
メッセージ付きでValueErrorを発生させるには、exception型の引数としてメッセージを書きます:
# if the max_factor is less than the min_factor
raise ValueError("min must be <= max")