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
źródło
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./
≡div
), tylko liczby zmiennoprzecinkowe i błędy braku zaokrąglania, ...5+10+2*3+7*0+0...
Odpowiedzi:
Znaki Python 2.7 / 478
Główną ideą jest użycie do wyszukiwania wyrażenia postfiksowego. Na przykład
2*(3+4)
w postaci Postfiksa będzie234+*
. Problemem staje się więc znalezienie częściowej permutacjiL
+,O
która ewaluujeN
.Następująca wersja jest wersją bez golfa.
stk
Wygląda na to, że stos[(5, '5'), (2, '5-3', (10, ((4+2)+(2*(4/2))))]
.źródło
P[opr](v1, v2)
. Nigdy nie myślałem o połączeniu lambdas i takich słowników, chociaż wydaje się to teraz oczywiste.