Le défi est de trouver le nombre maximum que vous pouvez obtenir à partir d'une liste d'entiers à l'aide d'opérateurs arithmétiques de base (addition, soustraction, multiplication, négation unaire)
Contribution
Une liste d'entiers
Production
Le résultat maximum en utilisant chaque entier dans l'entrée.
L'ordre d'entrée n'a pas d'importance, le résultat doit être le même.
Vous n'avez pas besoin de sortir l'opération complète, juste le résultat.
Exemples
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))
Règles
Victoires de code les plus courtes
Des «failles» standard s'appliquent
Vous ne pouvez utiliser que les opérateurs + * - (addition, multiplication, soustraction, négation unaire)
Le code doit fonctionner tant que le résultat peut être stocké sur un entier 32 bits.
Tout comportement de débordement dépend de vous.
J'espère que c'est assez clair, c'est ma première suggestion de défi Code Golf.
la source
Réponses:
C - 224 octets - Temps d'exécution O (n)
C'était amusant de ne voir que des solutions de temps exponentiel pour un problème de temps linéaire, mais je suppose que c'était la façon logique de procéder car il n'y avait pas de points bonus pour avoir réellement un algorithme, qui est une anagramme de logarithme.
Après avoir converti les nombres négatifs en zéros positifs et en éliminant les zéros, nous sommes clairement principalement intéressés par la multiplication. Nous voulons maximiser le logarithme du nombre final.
log (a + b) <log (a) + log (b) sauf quand a = 1 ou b = 1, donc ceux-ci sont le seul cas où nous sommes intéressés à ajouter quelque chose ensemble. En général, il est préférable d'ajouter un 1 à un plus petit nombre, car cela provoque une augmentation plus importante du logarithme, c'est-à-dire une augmentation en pourcentage plus importante, que d'ajouter 1 à un grand nombre. Il y a quatre scénarios possibles, classés du moins au moins préférables, pour en utiliser:
Le programme enregistre le nombre de uns, le nombre de deux et le nombre minimum supérieur à 2, et descend la liste des moyens les plus préférables d'utiliser ceux-ci. Enfin, il multiplie tous les nombres restants.
la source
Haskell, 126 caractères
c'est juste un forçage brut, à l'exception d'ignorer le signe de l'entrée et d'ignorer la soustraction et la négation unaire.
ce code est extrêmement lent. le code calcule récursivement f sur chaque sous-séquence de l'entrée quatre fois (sauf pour [] et l'entrée elle-même) . mais bon, c'est du golf de code.
la source
SWI-Prolog - 250
Oh mon garçon, j'ai passé trop de temps là-dessus.
Appelé à partir de la ligne de commande (par exemple):
(Pour aucune raison particulière, j'ai trouvé génial que mes noms de fonction golfés épellent "pot de tomate".)
Version non golfée:
Explication:
ignore
ou\+
) pour laisser le retour global du prédicattrue
et continuer.is
puis écrivez-la.la source
Scala, 134
Non golfé et commenté:
Une approche légèrement différente, de se rendre compte que la plus grande réponse peut toujours être exprimée comme un produit de sommes.
Si proche, mais un tas de stupidité de bibliothèque (permutations renvoie un Iterator au lieu d'une inférence de type Seq, horrible sur des séquences vides, Array.update retournant Unit) m'a fait entrer.
la source
Python 278 (O (n!))
Explication
la source
Haskell -
295290265246203189182182octetsFonctionne enfin! C'est aussi maintenant une force brute plutôt qu'une solution dynamique.
Merci à proudhaskeller pour certains des conseils de golf.
Ce n'est probablement pas une solution entièrement jouée au golf parce que j'aime vraiment jouer au golf, mais c'est le mieux que je puisse trouver (et cela semble compliqué, donc j'ai compris cela pour moi):
Nouveaux cas de test:
Explication de la solution:
La
main
fonction obtient juste une entrée et s'exécuteg
avec elle.g
prend l'entrée et renvoie le maximum de toutes les combinaisons possibles de sommes et d'ordres de liste.#
est la fonction qui calcule les sommes dans une liste comme celle-ci:la source
;
que possible? cela ne change pas le nombre d'octets mais aide à la lisibilité de manière troublanted n=[0,2,1]!!n
oud n=mod(3-n)3
. 3) faireo
etg
prendre la longueur de la liste au lieu de prendre la liste elle-même, car ils ne dépendent que de la longueur (évidemment, cela ne dure que tant qu'ils ne sont pas alignés). 4) remplacerotherwise
par0<1
. 5) faire la dernière définition de r êtrer$o x:y
. 6) retirez lea@
et remplacez le parx:y
. bonne chance avec votre golf!GolfScript (52 caractères)
Démo en ligne
L'analyse de feersum est assez bonne, mais elle peut être poussée plus loin si l'objectif est le golf plutôt que l'efficacité. En pseudo-code:
la source