Contexte
La monnaie officielle de la nation imaginaire du Golfenistan est le foo , et il n'y a que trois types de pièces en circulation: 3 foos, 7 foos et 8 foos. On peut voir qu'il n'est pas possible de payer certains montants, comme 4 foos, en utilisant ces pièces. Néanmoins, toutes les quantités suffisamment importantes peuvent être formées. Votre travail consiste à trouver le plus grand montant qui ne peut pas être formé avec les pièces (5 foos dans ce cas), ce qui est connu comme le problème des pièces .
Contribution
Votre entrée est une liste d'entiers positifs, représentant les valeurs des pièces en circulation. Deux choses sont garanties à ce sujet:L = [n1, n2, ..., nk]
- Le GCD des éléments de
L
est 1. L
ne contient pas le chiffre 1.
Il peut ne pas être trié et / ou contenir des doublons (pensez aux pièces en édition spéciale).
Production
Puisque le GCD L
est de 1, chaque entier suffisamment grand m
peut être exprimé comme une combinaison linéaire non négative de ses éléments; en d'autres termes, nous avons
m = a1*n1 + a2*n2 + ... + ak*nk
pour certains entiers . Votre sortie est le plus grand entier qui ne peut pas être exprimé sous cette forme. À titre indicatif, il est connu que la sortie est toujours inférieure à , si et sont les éléments maximal et minimal de ( référence ).ai ≥ 0
(n1 - 1)*(nk - 1)
n1
nk
L
Règles
Vous pouvez écrire un programme complet ou une fonction. Le nombre d'octets le plus bas l'emporte et les failles standard sont interdites. Si votre langue a une opération intégrée pour cela, vous ne pouvez pas l'utiliser. Il n'y a aucune exigence en termes de temps ou d'efficacité de la mémoire, sauf que vous devriez être en mesure d'évaluer les cas de test avant de publier votre réponse.
Après avoir posté ce défi, l'utilisateur @vihan a souligné que Stack Overflow a un doublon exact . Sur la base de cette discussion Meta , ce défi ne sera pas supprimé en tant que doublon; cependant, je demande que toutes les réponses basées sur celles de la version SO doivent citer les originaux, avoir le statut de wiki communautaire et être supprimées si l'auteur original souhaite poster sa réponse ici.
Cas de test
[3, 7, 8] -> 5
[25, 10, 16] -> 79
[11, 12, 13, 14, 13, 14] -> 43
[101, 10] -> 899
[101, 10, 899] -> 889
[101, 10, 11] -> 89
[30, 105, 70, 42] -> 383
[2, 51, 6] -> 49
FrobeniusNumber
en Mathematica.(p - 1)(q - 1)
comme limite supérieure, oùp
etq
sont le plus petit et le plus grand élément de l'ensemble.[2,3]
dans un laps de temps raisonnable et rien d'autre.[2,5]
créerait environ un million de listes Python en mémoire.Réponses:
Pyth, 23 octets
C'est très lent, car il vérifie toutes les valeurs jusqu'au produit de toutes les pièces. Voici une version presque identique, mais 1) réduit l'ensemble des pièces à celles qui ne sont pas divisibles les unes par les autres et 2) vérifie uniquement les valeurs jusqu'à
(max(coins) - 1) * (min(coins) - 1)
(47 octets):Explication
la source
Perl,
605451 octetsCode de 50 octets + ligne de commande de 1 octet
Poursuivra le golf et publiera une explication plus tard. L'approche de base consiste à laisser le moteur d'expression régulière effectuer le travail difficile avec la correspondance de chaînes. Par exemple, il construira une expression rationnelle similaire à
^(.{3})*(.{7})*(.{8})*$
une chaîne de longueurn
quin
descend du produit des entrées et correspondra à cette chaîne jusqu'à ce qu'elle ne parvienne pas à correspondre.Notez que cela deviendra exponentiellement lent à mesure que le nombre d'arguments augmente.
Utilisation: Les arguments sont lus depuis STDIN (nouvelle ligne séparée), par exemple:
la source
R ,
8478 octetsEssayez-le en ligne!
outer
colSums
Une version plus rapide mais plus longue (de deux octets) ne prend en compte que
max(a)
:Une version légèrement plus courte (78 octets) qui prend le plus souvent trop de journal ou trop d'espace pour s'exécuter Essayez en ligne est
la source
Python2,
188187 octetsLa deuxième indentation est rendue comme 4 espaces sur SO, ceux-ci devraient être des tabulations.
En fait, une solution «rapide», et non bruteforce, utilise la «méthode de Wilf» comme décrit ici .
la source
Javascript ES6,
120130126128127125 caractèresVersion alternative à 126 caractères:
Tester:
la source
forEach(
parmap(