Wyzwanie polega na znalezieniu maksymalnej liczby, jaką można uzyskać z listy liczb całkowitych za pomocą podstawowych operatorów arytmetycznych (dodawanie, odejmowanie, mnożenie, jednoznaczna negacja)
Wejście
Lista liczb całkowitych
Wynik
Maksymalny wynik przy użyciu każdej liczby całkowitej w wartości wejściowej.
Kolejność wprowadzania nie ma znaczenia, wynik powinien być taki sam.
Nie musisz generować pełnej operacji, tylko wynik.
Przykłady
Input : 3 0 1
Output : 4 (3 + 1 + 0)
Input : 3 1 1 2 2
Output : 27 ((2+1)*(2+1)*3))
Input : -1 5 0 6
Output : 36 (6 * (5 - (-1)) +0)
Input : -10 -10 -10
Output : 1000 -((-10) * (-10) * (-10))
Input : 1 1 1 1 1
Output : 6 ((1+1+1)*(1+1))
Zasady
Najkrótszy kod wygrywa
Standard „luki” stosuje się
Możesz używać tylko operatorów + * - (dodawanie, mnożenie, odejmowanie, jednoargumentowe negowanie)
Kod powinien działać, dopóki wynik może być przechowywany na 32-bitowej liczbie całkowitej.
Każde przepełnienie należy do Ciebie.
Mam nadzieję, że jest to wystarczająco jasne, to moja pierwsza propozycja wyzwania Code Golf.
źródło
Odpowiedzi:
C - 224 bajty - Czas działania O (n)
Zabawnie było widzieć tylko rozwiązania czasu wykładniczego dla problemu z czasem liniowym, ale przypuszczam, że był to logiczny sposób postępowania, ponieważ nie było żadnych punktów premiowych za posiadanie algorytmu, który jest anagramem logarytmu.
Po przekonwertowaniu liczb ujemnych na dodatnie i odrzuceniu zer, najwyraźniej najbardziej interesuje nas mnożenie. Chcemy zmaksymalizować logarytm ostatecznej liczby.
log (a + b) <log (a) + log (b) z wyjątkiem sytuacji, gdy a = 1 lub b = 1, więc są to jedyne przypadki, w których jesteśmy zainteresowani dodaniem czegoś razem. Ogólnie lepiej jest dodać 1 do mniejszej liczby, ponieważ powoduje to większy wzrost logarytmu, tj. Większy procentowy wzrost, niż dodanie 1 do dużej liczby. Istnieją cztery możliwe scenariusze, od najbardziej uporządkowanych do najmniej preferowanych, do wykorzystania:
Program śledzi liczbę jedynek, liczbę dwójek i minimalną liczbę większą niż 2, i przewija listę najbardziej lub najmniej preferowanych sposobów korzystania z nich. Na koniec mnoży wszystkie pozostałe liczby.
źródło
Haskell, 126 znaków
jest to po prostu brutalne wymuszanie, z wyjątkiem ignorowania znaku wejścia i ignorowania odejmowania i jednoznacznej negacji.
ten kod jest bardzo wolny. kod rekurencyjnie oblicza f dla każdego podsekwencji wejścia cztery razy (z wyjątkiem [] i samego wejścia) . ale hej, to jest golf golfowy.
źródło
SWI-Prolog - 250
O rany, spędziłem na tym zdecydowanie za dużo czasu.
Wywoływany z wiersza poleceń (np.):
(Bez szczególnego powodu uważam, że to niesamowite, że nazwa mojej gry w golfa oznacza „garnek pomidorowy”).
Wersja bez golfa:
Wyjaśnienie:
ignore
lub\+
), aby predykat mógł wrócićtrue
i kontynuować.is
a następnie napisz.źródło
Scala, 134
Niegolfowane i komentowane:
Nieco inne podejście, niż uświadomienie sobie, że największa odpowiedź zawsze może być wyrażona jako iloczyn sum.
Tak blisko, ale doszło do mnie głupota biblioteki (permutacje zwracają Iterator zamiast Seq, okropne wnioskowanie o pustych sekwencjach, Array.update zwracające Unit).
źródło
Python 278 (O (n!))
Wyjaśnienie
źródło
Haskell -
295 290 265 246 203 189182 bajtówWreszcie działa! Również teraz jest to brutalna siła, a nie dynamiczne rozwiązanie.
Podziękowania dla dumnego skarbu za niektóre wskazówki dotyczące gry w golfa.
Prawdopodobnie nie jest to w pełni golfowe rozwiązanie, ponieważ tak naprawdę jestem do bani w golfa, ale jest to najlepsze, co mogę wymyślić (i wygląda na skomplikowane, więc mam to za sobą):
Nowe przypadki testowe:
Objaśnienie rozwiązania:
main
Funkcja po prostu staje się wejście i prowadzig
z nim.g
pobiera dane wejściowe i zwraca maksimum wszystkich możliwych kombinacji sum i kolejności list.#
jest funkcją, która oblicza sumy na takiej liście:źródło
;
jeśli to możliwe, pisać nowe wiersze ? nie zmienia to liczby bajtów, ale znacznie poprawia czytelnośćd n=[0,2,1]!!n
lubd n=mod(3-n)3
. 3) utwórzo
ig
weź długość listy zamiast brać samą listę, ponieważ zależą one tylko od długości (oczywiście jest to tylko tak długo, jak długo nie są wstawiane). 4) zastępujeotherwise
się0<1
. 5) uczyń ostatnią definicję r ber$o x:y
. 6) wyjmija@
i zamień nax:y
. powodzenia w grze w golfa!GolfScript (52 znaki)
Demo online
analiza feersum jest całkiem dobra, ale można ją posunąć dalej, jeśli celem jest golf, a nie wydajność. W pseudokodzie:
źródło