Jeśli przeczytałeś książkę Kontakt Carla Sagana, to wyzwanie może ci się wydawać znajome.
Biorąc pod uwagę zbiór równań matematycznych składający się z liczby, nieznanego operatora, innej liczby i wyniku, wywnioskuj, które operatory reprezentują dodawanie, odejmowanie, mnożenie lub dzielenie.
Każde równanie wejściowe zawsze będzie się składało
- nieujemna liczba całkowita
- jedna z liter
A,B,C, lubD - kolejna nieujemna liczba całkowita
- charakter
= - końcowa nieujemna liczba całkowita
połączone razem. Na przykład możliwe dane wejściowe 1A2=3, z których można wywnioskować, że Areprezentuje dodanie. Każda z liczb całkowitych będzie wystarczająca 0 ≤ x ≤ 1,000.
Jednak nie zawsze jest to takie proste. Możliwe jest niejednoznaczność między:
5A0=5: dodawanie odejmowanie1A1=1: mnożenie / dzielenie0A5=0: mnożenie / dzielenie2A2=4: dodawanie / mnożenie4A2=2: odejmowanie / dzielenie0A0=0: dodawanie / odejmowanie / mnożenie
i tak dalej. Wyzwaniem jest wykorzystanie tej zdolności do zawężenia wyboru w połączeniu z procesem eliminacji, aby dowiedzieć się, jaki operator reprezentuje każdą literę. (Zawsze będzie co najmniej jedno równanie wejściowe i zawsze będzie możliwe jednoznaczne, jednoznaczne dopasowanie każdej litery użytej na wejściu z jednym operatorem).
Załóżmy na przykład, że dane wejściowe to następujące równania:
0A0=0: zawęża to A do dodawania, odejmowania lub mnożenia (nie można podzielić przez 0).10B0=10: B musi być dodawaniem lub odejmowaniem.5C5=10: C jest oczywiście dodawaniem, co powoduje odejmowanie B, co powoduje pomnożenie A.
Dlatego dane wyjściowe dla tych równań wejściowych powinny być zgodne Az *, B
z -i Cz +.
Dane wejściowe można podać jako pojedynczy ciąg rozdzielany spacjami / przecinkami lub tablicę ciągów, z których każdy reprezentuje jedno równanie. Dane wyjściowe mogą być pojedynczym ciągiem ( "A*B-C+"), tablicą ( ["A*", "B-", "C+"]) lub słownikową / dictową tablicą 2D ( {"A": "*", ...}lub [["A", "*"], ...]).
Możesz założyć, że liczba nigdy nie zostanie podzielona przez inną liczbę, przez którą nie jest podzielna (więc nie musisz się martwić, czy dzielenie powinno być zmiennoprzecinkowe, czy obcięte).
Ponieważ jest to code-golf , wygrywa najkrótszy kod w bajtach.
Przypadki testowe:
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/