Die Herausforderung besteht darin, die maximale Anzahl, die Sie aus einer Liste von Ganzzahlen erhalten können, mithilfe von arithmetischen Grundoperatoren (Addition, Subtraktion, Multiplikation, unäre Negation) zu finden.
Eingang
Eine Liste von ganzen Zahlen
Ausgabe
Das maximale Ergebnis bei Verwendung jeder Ganzzahl in der Eingabe.
Die Eingabereihenfolge spielt keine Rolle, das Ergebnis sollte dasselbe sein.
Sie müssen nicht die gesamte Operation ausgeben, sondern nur das Ergebnis.
Beispiele
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))
Regeln
Kürzester Code gewinnt
Standard "Schlupflöcher" gelten
Sie dürfen nur + * - Operatoren verwenden (Addition, Multiplikation, Subtraktion, unäre Negation)
Der Code sollte funktionieren, solange das Ergebnis auf einer 32-Bit-Ganzzahl gespeichert werden kann.
Jedes Überlaufverhalten liegt bei Ihnen.
Ich hoffe das ist klar genug, dies ist mein erster Code Golf Challenge Vorschlag.
quelle
Antworten:
C - 224 Bytes - Laufzeit O (n)
Es war amüsant, nur Exponentialzeitlösungen für ein lineares Zeitproblem zu sehen, aber ich nehme an, es war die logische Vorgehensweise, da es keine Bonuspunkte gab, wenn man tatsächlich einen Algorithmus hatte, der ein Anagramm des Logarithmus ist.
Nachdem wir negative Zahlen in positive Zahlen umgewandelt und Nullen verworfen haben, sind wir offensichtlich hauptsächlich an der Multiplikation interessiert. Wir wollen den Logarithmus der endgültigen Zahl maximieren.
log (a + b) <log (a) + log (b), außer wenn a = 1 oder b = 1 ist. Nur in diesen Fällen möchten wir also etwas addieren. Im Allgemeinen ist es besser, eine 1 zu einer kleineren Zahl zu addieren, da dies zu einem größeren Anstieg des Logarithmus führt, dh zu einem größeren prozentualen Anstieg, als eine 1 zu einer großen Zahl zu addieren. Es gibt vier mögliche Szenarien, die für die Verwendung am besten geeignet sind:
Das Programm verfolgt die Anzahl der Einsen, die Anzahl der Zweien und die Mindestanzahl von mehr als 2 und geht die Liste der am wenigsten bevorzugten Arten der Verwendung der Einsen durch. Schließlich multipliziert es alle verbleibenden Zahlen.
quelle
Haskell, 126 Zeichen
Dies ist nur brachial, mit der Ausnahme, dass das Vorzeichen der Eingabe ignoriert und Subtraktion und unäre Negation ignoriert werden.
Dieser Code ist extrem langsam. Der Code berechnet f viermal rekursiv für jede Untersequenz der Eingabe (mit Ausnahme von [] und der Eingabe selbst) . aber hey, es ist Code Golf.
quelle
SWI-Prolog - 250
Oh Mann, ich habe viel zu lange damit verbracht.
Aufgerufen von der Kommandozeile (zB):
(Ohne besonderen Grund fand ich es großartig, dass meine Namen für die Golf-Funktion "Tomatentopf" bedeuten.)
Ungolfed-Version:
Erläuterung:
ignore
oder\+
), damit das Prädikat insgesamt zurückkehrttrue
und fortfährt.is
und schreiben Sie sie dann.quelle
Scala, 134
Ungolfed & kommentiert:
Ein etwas anderer Ansatz als die Erkenntnis, dass die größte Antwort immer als Produkt von Summen ausgedrückt werden kann.
So nah dran, aber eine Menge Dummheit in der Bibliothek (Permutationen liefern einen Iterator anstelle einer Seq, schreckliche Typinferenz auf leere Sequenzen, Array.update returning Unit) hat mich reingelegt.
quelle
Python 278 (O (n!))
Erläuterung
quelle
Haskell -
295 290 265 246 203 189182 BytesEndlich klappt es! Auch jetzt ist es eher eine rohe Kraft als eine dynamische Lösung.
Vielen Dank an proudhaskeller für einige der Golftipps.
Dies ist wahrscheinlich keine vollständige Golflösung, da ich eigentlich am Golfen scheiße bin, aber es ist das Beste, was ich mir einfallen lassen kann (und es sieht kompliziert aus, also habe ich das für mich in Ordnung gebracht):
Neue Testfälle:
Lösungserklärung:
Die
main
Funktion bekommt nur eine Eingabe und läuftg
damit.g
Nimmt die Eingabe und gibt das Maximum aller möglichen Kombinationen von Summen und Listenreihenfolgen zurück.#
ist die Funktion, die die Summen in einer Liste wie folgt berechnet:quelle
;
wenn möglich newlines schreiben ? es ändert nichts an der Anzahl der Bytes, hilft aber der Lesbarkeit enormd n=[0,2,1]!!n
oder implementierend n=mod(3-n)3
. 3) macheno
undg
nehmen Sie die Länge der Liste, anstatt die Liste selbst zu nehmen, da sie nur von der Länge abhängen (offensichtlich steht dies nur, solange sie nicht inline sind). 4) ersetzenotherwise
durch0<1
. 5) Machen Sie die letzte Definition von r ber$o x:y
. 6) Entfernen Sie diea@
und ersetzen Sie a durchx:y
. Viel Glück beim Golfen!GolfScript (52 Zeichen)
Online-Demo
Die Analyse von feersum ist ziemlich gut, aber sie kann weiterentwickelt werden, wenn das Ziel eher Golf als Effizienz ist. Im Pseudocode:
quelle