Carl Saganの「 Contact」という本を読んだことがあれば、この課題はおなじみかもしれません。
数、未知の演算子、別の数、および結果で構成される一連の数学方程式の入力が与えられると、どの演算子が加算、減算、乗算、または除算を表すかを推測します。
各入力方程式は常に
- 負でない整数
- 文字の1
A、B、C、またはD - 別の非負整数
- キャラクター
= - 最終的な非負整数
連結されます。たとえば、可能な入力はであり1A2=3、そこからA加算を表すと推定できます。各整数はを満たし0 ≤ x ≤ 1,000ます。
ただし、必ずしもそれほど単純ではありません。次の間にあいまいさが存在する可能性があります。
5A0=5:加算/減算1A1=1:乗算/除算0A5=0:乗算/除算2A2=4:加算/乗算4A2=2:減算/除算0A0=0:加算/減算/乗算
等々。課題は、この機能を使用して選択肢を絞り込み、消去プロセスと組み合わせて、各文字が表す演算子を把握することです。(常に少なくとも1つの入力方程式があり、入力で使用される各文字を1つの演算子で明確に一意に一致させることが常に可能です。)
たとえば、入力が次の方程式であるとします。
0A0=0:これは、Aを加算、減算、または乗算に絞り込みます(0で除算できません)。10B0=10:Bは加算または減算のいずれかでなければなりません。5C5=10:Cは明らかに加算であり、B減算を行い、A乗算を行います。
したがって、これらの入力方程式の出力は次と一致Aする必要があります。*、B
と-、とCを有します+。
入力は、それぞれが1つの方程式を表す、単一の空白/コンマ区切りの文字列または文字列の配列として指定できます。出力は単一の文字列("A*B-C+")、配列(["A*", "B-", "C+"])、または辞書/辞書のような2D配列({"A": "*", ...}または[["A", "*"], ...])のいずれかです。
数値が割り切れない別の数値で除算されることはないと想定できます(したがって、除算を浮動小数点にするか切り捨てるかを心配する必要はありません)。
これは code-golfであるため、バイト単位の最短コードが優先されます。
テストケース:
In Out
-------------------------------
0A0=0 10B0=10 5C5=10 A*B-C+
100D100=10000 D*
4A2=2 4B2=2 0A0=0 A-B/
15A0=15 4B2=2 2C2=0 A+B/C-
1A1=1 0A0=0 A*
0A0=0 2A2=4 5B0=5 2B2=4 A*B+
2A2=4 0C0=0 5B0=5 5A0=5 A+B-C*
0A1000=0 4A2=2 A/