On nous donne une liste d'entiers p1, ..., pk (pas nécessairement distincts) où chacun a une valeur comprise entre 1 et 9 inclus. En utilisant chacun des p1, ..., pk exactement une fois, nous pouvons former des concaténations de chiffres, pour obtenir une nouvelle liste de nombres; nous sortons ensuite le produit de cette nouvelle liste. L'objectif est de maximiser ce produit en choisissant les meilleures concaténations de chiffres.
Par exemple, on nous donne la liste: 2 3 2 (séparés par des espaces). Nous pouvons former les enchaînements suivants:
2 3 2
(le produit de ces concaténations est12
)23 2
(le produit est46
)32 2
(le produit est64
)22 3
(le produit est66
)
Puisque le plus grand produit que nous pouvons former des concaténations est 66, nous le sortons.
Règles:
- Il doit y avoir au moins une multiplication (c'est-à-dire que vous ne pouvez pas simplement concaténer tous les chiffres et les afficher).
- Vous ne pouvez pas utiliser d'autres opérateurs que la multiplication, ni insérer des parenthèses, etc.
- Supposons que la liste des entiers donnée est séparée par des espaces et que tous les entiers ont des valeurs comprises entre 1 et 9.
Le code le plus court (en octets) gagne!
Cas de test:
Entrée: 1 2 3
; Sortie: 63
(c.-à-d. 21*3
)
Entrée: 2 5 9
; Sortie: 468
( 52*9
)
Entrée: 1 2 3 4
; Sortie: 1312
( 41*32
)
Réponses:
CJam,
32282312 octetsEssayez-le en ligne dans l' interpréteur CJam .
Merci à @ user23013 de m'avoir aidé à économiser 16 octets entiers!
Idée
Permutation des caractères dans la chaîne d'entrée le divise en entiers (groupes de chiffres consécutifs) séparés par des espaces. En poussant un zéro puis en évaluant la chaîne d'entrée permutée, nous poussons deux ou plusieurs entiers. En multipliant les deux premiers, le produit de l'entrée sera divisé en deux entiers exactement ou en une valeur sous-optimale.
Code
la source
l2%_,,1>\e!m*{~S+m<~*}%$W=
.l2%S+e!{0\~*}%$W=
.CJam,
3635 octetsAssez simple. Itère toutes les combinaisons possibles et les trie par produit. Sort ensuite le plus grand. Tout cela, en gardant à l'esprit qu'au moins 1 multiplication doit être présente.
Ajoutera bientôt une explication.
Essayez-le en ligne ici
la source
JavaScript (ES6) 125
Edit Je pense que @oberon a bien compris: "chaque nouveau chiffre doit être concaténé au plus petit nombre"
Je ne changerai pas cette réponse en volant son idée. L'implémentation dans ES6 serait de 70 octets (le signe a changé par rapport à la comparaison sous forme de nombre et non de chaînes)
Ma solution
Comme je l'ai dit dans les commentaires, pour chaque paire de nombres a, b, le produit a * b est inférieur à la concaténation simple ab (= a * 10 ^ (chiffres de b) + b). Il vaut donc mieux éviter les produits et préférer la concaténation, mais comme au moins 1 produit est demandé, nous devons construire 2 nombres et les multiplier.
J'essaie tous les regroupements possibles de chiffres, construisant une paire de chiffres à multiplier. Chaque numéro est construit de manière évidente en prenant des chiffres dans l'ordre décroissant.
Par exemple, avec une liste de 4 nombres, [1 2 3 4] - essayez:
Le maximum de ces valeurs est le résultat dont nous avons besoin.
Les regroupements peuvent être énumérés en boucle sur un bitmap de 4 bits, avec la valeur min 0001 et la valeur max 0111 (soit 1 << (4 -1) - 1)
Pas si golfé
Testez en utilisant l'extrait de code ci-dessous dans Firefox.
la source
Python 3, 111 octets
C'est probablement beaucoup plus golfable. J'aime son temps d'exécution, cependant (O ( n log n ), n'est-ce pas?).
Non golfé avec explication.
la source
Pyth, 25 octets
Je boucle sur chaque permutation de l'entrée. Ensuite, parce que chaque combinaison optimale se compose de deux nombres entiers, je la divise simplement à chaque position possible et multiplie les divisions concaténées. Je trie et récupère ensuite le dernier élément.
la source
R, 164
En tant que méthode, je ne sais pas si cela est robuste. Avec les cas que j'ai testés, cela semble fonctionner à chaque fois. J'ai essayé de le tester contre une solution d'optimiseurs et cela semble être correct contre cela également. Je suis plus que prêt à me tromper :) Il y a de la place pour le golf, mais j'espérais d'abord obtenir des commentaires sur la méthode.
Le processus général est le suivant:
Développé avec quelques commentaires
Et quelques tests (implémentés comme une fonction appelée g)
la source