Pythonで方程式「a + b = c」の欠けている値を求める方法
プログラミングの練習問題としてよく出されるのが、「a + b = c」という形式の方程式において、a、b、c のいずれか一つが欠けている状態から、その欠けた値を求めるというものです。
例えば、入力が「? + 4 = 9」であれば、出力は「5」になります。この記事では、Pythonを使ってこの問題を解く手順と実装例をわかりやすく解説します。
解き方のアプローチ
この問題は、文字列を整理して数値に変換し、どの項が欠けているかを判定することで解決できます。具体的には、以下の手順で進めます。
- 文字列からすべての空白を削除し、記号「+」と「=」をカンマ「,」に置き換えます
- カンマで区切って要素のリストを作成します(elements)
- リスト内を走査し、数値ではない要素(つまり「?」)のインデックス位置を特定します
- 欠けている項の位置に応じて、以下のように計算します
- 3番目の要素(c)が欠けている場合:1番目 + 2番目 を返す
- 2番目の要素(b)が欠けている場合:3番目 − 1番目 を返す
- 1番目の要素(a)が欠けている場合:3番目 − 2番目 を返す
Pythonでの実装例
それでは、実際のコードを見てみましょう。
def find_missing(string):
string = string.strip().replace(' ', '')
string = string.replace('=', ',')
string = string.replace('+', ',')
elements = string.split(',')
idx = 0
for i in range(len(elements)):
if not elements[i].isnumeric():
idx = i
break
if idx == 2:
return int(elements[0]) + int(elements[1])
elif idx == 1:
return int(elements[2]) - int(elements[0])
elif idx == 0:
return int(elements[2]) - int(elements[1])
print(find_missing('6 + 8 = ?'))
print(find_missing('? + 8 = 20'))
print(find_missing('5 + ? = 15'))入力
'6 + 8 = ?' '? + 8 = 20' '5 + ? = 15'
出力
14 12 10
コードのポイント解説
このコードが動作する仕組みを、処理の流れに沿って確認してみましょう。
1. 文字列の前処理
strip()で文字列両端の余分な空白を取り除き、replace()を使って空白・イコール記号・プラス記号をすべてカンマに統一します。これにより「6 + 8 = ?」は「6,8,?」というシンプルな形式になります。
2. 欠損位置の特定
split(',')で分割したリストに対してisnumeric()メソッドを使い、数値として認識できない要素(「?」)のインデックスを検出します。このインデックスが0ならaが欠落、1ならbが欠落、2ならcが欠落していることを意味します。
3. 方程式の性質を利用した計算
加法の性質を利用すれば、欠けた値は簡単に導き出せます。
- c が不明 → c = a + b
- b が不明 → b = c − a
- a が不明 → a = c − b
最後にint()で文字列を整数に変換して計算結果を返しています。
まとめ
このように、文字列操作と条件分岐を組み合わせることで、方程式の欠損値を簡単に求めることができます。応用としては、減算や乗算に対応させたり、複数の欠損に対応したりする拡張も考えられるので、ぜひ自分でも改良に挑戦してみてください。
-
Pythonで木の辺を1本取り除いたときの部分木のノード値合計の差の最小値を求めるプログラム
問題の概要ノードに1からnまでの番号が振られた木があるとします。各ノードには整数値が格納されています。ここで、木からある1本の辺を取り除くと、木は2つの部分木に分割されます。このとき、2つの部分木のノード値の合計の差が最小になるようにしたいと考えます。私たちのタスクは、その最小の差を求めて返すことです。木は辺のリストとして与えられ、各ノードの値も併せて提供されます。例として、n = 6、edge_list = [[1, 2], [1, 3], [2, 4], [3, 5], [3, 6]]、values = [15, 25, 15, 55, 15, 65] が入力された場合、出力は 0 になり
-
Pythonでネストされたリストから最大値を持つサブリストを検索する方法
Pythonでは、リストの要素として別のリスト(サブリスト)を持つことができます。本記事では、指定されたリストの中に含まれる複数のサブリストから、最大値を持つサブリストを見つける方法を2つのアプローチで解説します。 方法1: max関数とlambda式を組み合わせる 最もシンプルな方法は、max()関数とlambda式を組み合わせることです。lambda式でサブリスト内の比較対象となる要素(この例ではインデックス1の数値)を指定することで、その値が最大であるサブリストを取得できます。 コード例 listA = [[Mon, 90], [Tue, 32], [Wed, 120]] # lambd