Otrzymasz listę liczb L = [17, 5, 9, 17, 59, 14]
, torbę operatorów O = {+:7, -:3, *:5, /:1}
i numer N = 569
.
Zadanie
Wyprowadź równanie, które używa wszystkich liczb L
po lewej stronie i tylko liczby N
po prawej stronie. Jeśli nie jest to możliwe, wypisz False. Przykładowe rozwiązanie:
59*(17-5)-9*17+14 = 569
Ograniczenia i wyjaśnienia
- Nie można
[13,37]
łączyć liczb ( nie można ich używać jako1337
) - Pojawią się tylko liczby naturalne i zero
L
. - Kolejność
L
nie ma znaczenia. - Musisz użyć wszystkich cyfr w
L
. - Tylko podmioty
+
,-
,*
,/
pojawi sięO
. O
może mieć więcej operatorów niż potrzebujesz, ale przynajmniej|L|-1
operatorów- Możesz użyć każdego operatora dowolną liczbę razy, aż do wartości w
O
. - Wszystkie cztery operacje
O
są standardowymi operacjami matematycznymi; w szczególności/
jest to normalny podział z dokładnymi ułamkami.
Zwrotnica
- Im mniej punktów, tym lepiej
- Każdy znak kodu daje jeden punkt
Musisz dostarczyć wersję bez gry w golfa, która jest łatwa do odczytania.
tło
Podobne pytanie został poproszony na przepełnienie stosu. Pomyślałem, że może to być interesujące wyzwanie dla golfa.
Złożoność obliczeniowa
Jak powiedział Peter Taylor w komentarzach, możesz rozwiązać sumę podzbiorów za pomocą:
- Masz instancję sumy podzbioru (stąd zestaw S liczb całkowitych i liczby x)
- L: = S + [0, ..., 0] (| S | razy zero), N: = x, O: = {+: | S | -1, *: | S | - 1, /: 0, -: 0}
- Teraz rozwiąż ten przykład mojego problemu
- Rozwiązaniem dla sumy podzbiorów są liczby S, które nie są mnożone przez zero.
Jeśli znajdziesz algorytm lepszy niż O (2 ^ n), udowodnisz, że P = NP. Ponieważ P vs NP to problem z nagrodą milenijną, a zatem warty 1 000 000 dolarów amerykańskich, jest bardzo mało prawdopodobne, aby ktoś znalazł na to rozwiązanie. Więc usunąłem tę część rankingu.
Przypadki testowe
Poniższe nie są jedynymi prawidłowymi odpowiedziami, istnieją inne rozwiązania i są dozwolone:
- (
[17,5,9,17,59,14]
,{+:7, -:3, *:5, /:1}
,569
)
=>59 * (17-5)- 9 * 17 + 14 = 569
- (
[2,2]
,{'+':3, '-':3, '*':3, '/':3}
,1
)
=>2/2 = 1
- (
[2,3,5,7,10,0,0,0,0,0,0,0]
,{'+':20, '-':20, '*':20, '/':20}
,16
)
=>5+10-2*3+7+0+0+0+0+0+0+0 = 16
- (
[2,3,5,7,10,0,0,0,0,0,0,0]
,{'+':20, '-':20, '*':20, '/':20}
,15
)
=>5+10+0*(2+3+7)+0+0+0+0+0+0 = 15
/
≡ div
), tylko liczby zmiennoprzecinkowe i błędy braku zaokrąglania, ...
5+10+2*3+7*0+0...
m = |L|
? Jeśli tak, to jak możesz oczekiwać, że środowisko wykonawcze nie będzie zależeć od wielkości tej listy? Na przykład[2,2],[+,+,...,+,/],1
. W rzeczywistości, skoro n oznacza O (m), możesz po prostu napisać to wszystko w kategoriach m.