fundo
A moeda oficial da nação imaginária do Golfenistão é o foo , e existem apenas três tipos de moedas em circulação: 3 foos, 7 foos e 8 foos. Pode-se ver que não é possível pagar certas quantias, como 4 foos, usando essas moedas. No entanto, todas as quantidades grandes o suficiente podem ser formadas. Seu trabalho é encontrar a maior quantidade que não pode ser formada com as moedas (neste caso, 5 foos), conhecida como problema das moedas .
Entrada
Sua entrada é uma lista de números inteiros positivos, representando os valores das moedas em circulação. Duas coisas são garantidas:L = [n1, n2, ..., nk]
- O MDC dos elementos de
L
é 1. L
não contém o número 1.
Pode ser não classificado e / ou conter duplicatas (pense em moedas de edição especial).
Resultado
Como o GCD de L
é 1, todo número inteiro grande o suficiente m
pode ser expresso como uma combinação linear não negativa de seus elementos; em outras palavras, temos
m = a1*n1 + a2*n2 + ... + ak*nk
para alguns números inteiros . Sua saída é o maior número inteiro que não pode ser expresso neste formulário. Como sugestão, sabe-se que a saída é sempre menor que , se e são os elementos máximo e mínimo de ( referência ).ai ≥ 0
(n1 - 1)*(nk - 1)
n1
nk
L
Regras
Você pode escrever um programa completo ou uma função. A menor contagem de bytes vence e as brechas padrão não são permitidas. Se seu idioma possui uma operação interna para isso, você não pode usá-lo. Não há requisitos para eficiência de tempo ou memória, exceto que você deve poder avaliar os casos de teste antes de postar sua resposta.
Depois de postar esse desafio, o usuário @vihan apontou que o Stack Overflow tem uma duplicata exata . Com base nessa discussão meta , esse desafio não será excluído como duplicado; no entanto, peço que todas as respostas baseadas na versão SO citem os originais, recebam o status do Wiki da Comunidade e sejam excluídas se o autor original desejar postar sua resposta aqui.
Casos de teste
[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
fonte
FrobeniusNumber
no Mathematica.(p - 1)(q - 1)
como o limite superior, ondep
eq
são o menor e o maior elemento do conjunto.[2,3]
em uma quantidade razoável de tempo e nada mais.[2,5]
criaria cerca de um milhão de listas Python na memória.Respostas:
Pitão, 23 bytes
É muito lento, pois verifica todos os valores até o produto de todas as moedas. Aqui está uma versão quase idêntica, mas 1) reduz o conjunto de moedas para as que não são divisíveis uma pela outra e 2) apenas verifica valores até
(max(coins) - 1) * (min(coins) - 1)
(47 bytes):Explicação
fonte
Perl,
605451 bytesCódigo de 50 bytes + linha de comando de 1 bytes
Vai continuar jogando golfe e postar uma explicação mais tarde. A abordagem básica é permitir que o mecanismo regex faça o trabalho duro com a correspondência de cadeias. Por exemplo, ele construirá uma regex semelhante ae
^(.{3})*(.{7})*(.{8})*$
corresponderá a uma cadeia de comprimento emn
quen
desce do produto das entradas até que ela não corresponda.Observe que isso se tornará exponencialmente lento à medida que o número de argumentos aumentar.
Uso: Os argumentos são lidos em STDIN (nova linha separada), por exemplo:
fonte
R ,
8478 bytesExperimente online!
outer
colSums
Uma versão mais rápida, porém mais longa (por dois bytes) considera apenas
max(a)
:Uma versão ligeiramente mais curto (78 bytes) que na maioria das vezes leva muito log ou muito espaço para correr em Experimente on-line é
fonte
Python2,
188187 bytesO segundo recuo é renderizado como 4 espaços no SO, essas devem ser tabulações.
Na verdade, uma solução 'rápida', não a força bruta, usa o 'Método de Wilf', conforme descrito aqui .
fonte
Javascript ES6,
120130126128127125 caracteresVersão alternativa de 126 caracteres:
Teste:
fonte
forEach(
commap(