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 A
reprezentuje 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 A
z *
, B
z -
i C
z +
.
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/
źródło
Odpowiedzi:
MATL , 53 bajty
Wykorzystuje aktualną wersję (10.1.0)
EDYCJA (12 czerwca 2016 r.): Aby dostosować się do zmian w języku, zastąp
Y}
przezg
i1L3$)
przezY)
. Poniższy link zawiera te modyfikacjeWypróbuj online!
Wyjaśnienie
Testuje to wszystkie możliwe permutacje czterech operatorów w pętli, dopóki jedna permutacja nie spełni wszystkich równań.
Aby sprawdzić, czy równania są prawdziwe, stosuje się wyrażenie regularne w celu zastąpienia czterech liter operatorami (w kolejności podanej przez bieżącą permutację), a ciąg jest konwertowany na liczby (obliczane). Daje to tablicę z tyloma liczbami, ile równań, w których stają się prawdziwe
1
równania i równania fałszywe0
. Jeśli ten wektor zawiera tylko1
wartości, jesteśmy skończeni.Znalezione rozwiązanie przypisuje operatory do czterech liter, ale nie wszystkie muszą koniecznie pojawiać się na wejściu. Tak więc przeprowadzany jest końcowy test, aby odrzucić nieużywane litery (i odpowiadające im operatory).
źródło
Python, 278 znaków
Moja pierwsza odpowiedź na temat kodu golfa ...
Jest to tylko funkcja implementująca algorytm brutalnej siły, którą nazywamy przekazywaniem argumentu ciągu równań.
źródło
["A","B","C","D"]
zlist("ABCD")
?=
w definicjil
.4A2=2 4B3=1
).JavaScript (ES6),
213208 bajtówWyjaśnienie
Dane wejściowe i wyjściowe są łańcuchami.
Definiuje funkcję,
f
która pełni również funkcję funkcji rekurencyjnej do generowania wszystkich permutacji operatorów i testuje pełne permutacje za pomocą równań wejściowycheval
.Test
Test nie używa domyślnych argumentów dla zgodności przeglądarki.
Pokaż fragment kodu
źródło