Escreva um programa que calcule se um valor monetário inserido, como um inteiro, pode ser representado por uma combinação única de moedas e / ou notas, o que significa que a mesma moeda / nota não pode ser usada mais de uma vez.
Seu programa deve ter um valor como entrada e pode obter uma lista de valores de moedas / notas via entrada ou pelo equivalente no idioma de uma matriz. A lista de moedas / notas deve poder ser alterada; portanto, verifique se é claro onde isso está definido se você estiver usando uma constante.
Seu programa deve gerar qualquer valor de verdade / falsidade, respectivamente.
Observe que não é necessário exibir a lista de moedas / notas que compõem o valor .
EXEMPLO
Usando a libra esterlina, (£ 1,00 = 100 e 420,69 = 42069)
coins = [1, 2, 5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000]
A seguinte saída será verdadeira:
6 (1, 5)
15 (10, 5)
88 (1, 2, 5, 10, 20, 50)
512 (500, 10, 2)
7003 (5000, 2000, 2, 1)
A seguir, o resultado será falso:
4
209
8889
4242424242
[ANYTHING ABOVE 8888]
DADOS ALTERNATIVOS DO ENSAIO (dólar americano)
coins = [1, 5, 10, 25, 50, 100, 200, 500, 1000, 2000, 5000, 10000]
Boa sorte!
Respostas:
Braquilog 2 (TIO Nexus), 2 bytes
Experimente online!
Pega a lista de moedas via entrada padrão ou anexa-a ao início do programa como uma matriz literal (ou funcionará, então você decide como você se sente "mais legítimo"; a primeira é permitida por padrão Regras do PPCG, este último especificamente permitido pela questão); e pega o valor a ser produzido como argumento da linha de comando.
Explicação
Este programa utiliza detalhes de implementação do funcionamento do wrapper do TIO Nexus para Brachylog; especificamente, ele permite que você forneça um argumento de linha de comando para dar entrada via Saída. (Isso não estava previsto no design original do Brachylog; no entanto, as linguagens são definidas por sua implementação no PPCG e, se surgir uma implementação que faz o que eu preciso, posso tirar vantagem disso.) programa se parece com isso:
Como um programa completo, ele retorna um valor booleano;
true.
se todas as asserções do programa puderem ser satisfeitas simultaneamente oufalse.
se não puderem.(Um lembrete ou para pessoas que ainda não sabem: o Brachylog 2 usa sua própria codificação de caracteres, com
⊇
um único byte de comprimento.)fonte
08
2B
(você pode procurar as codificações aqui em cima ). A razão de eu não listar a codificação específica é que é irrelevante; o que realmente importa é que o Brachylog não use mais que 256 caracteres únicos, para que cada um possa ser representado em um único byte. Isso geralmente é feito por idiomas de golfe para tornar o código mais legível; eles poderiam usar uma codificação como a página de código 437, mas se você fizesse isso, ninguém seria capaz de lê-la .05AB1E , 4 bytes
Explicação:
Experimente online!
fonte
Mathematica, 25 bytes
Função pura pegando uma matriz de valores de moeda como o primeiro argumento e o número inteiro alvo como o segundo argumento e retornando
True
ouFalse
.fonte
Gelatina, 6 bytes
Experimente online!
-2 bytes graças a Leaky Nun
-13 bytes graças a Leaky Nun (longa história)
fonte
Retina ,
5231 bytesExperimente online! Recebe a entrada como uma lista separada por espaços de moedas e notas, seguida pelo valor desejado. Edit: Salvo 18 bytes graças a @Kobi que depurou meu código. Explicação: As duas primeiras linhas simplesmente convertem de decimal para unário. A terceira linha captura a lista de moedas e notas. A alternância permite que o mecanismo volte atrás e opte por não capturar moedas / notas específicas. O grupo de balanceamento combina o valor com todos os sufixos da lista de captura (desnecessário, mas mais golfista).
fonte
^((1+) )+(\2?(?<-2>)|){99}$
(34 bytes, com limite no número de moedas) ou^((1+) |1+ )+(\2?(?<-2>))+$
(também 34 bytes).(?<-2>\2?)
funciona, além de mais um byte da sua segunda resposta, porque ela?
não é mais necessária.Braquilog , 7 bytes
Experimente online!
Como funciona
Incluindo a combinação, 9 bytes
Experimente online!
fonte
Java (OpenJDK 8) , 125 bytes
Experimente online!
fonte
boolean f(int[]c,int n){for(int l=c.length;l-->0;n-=n<c[l]?0:c[l]);return n<1;}
(79 bytes). Com o Java 8 e suas lambdas, ele pode ser reduzido ainda mais para 62 bytes. Com relação à sua resposta como está atualmente, oint l=c.length-1
uso eml
vez del-1
também é mais curto.Prolog (SWI) , 46 bytes
Experimente online!
Garfo da minha resposta Python .
fonte
is
como#=
, o que permitiria remover algum espaço em branco).JavaScript (ES6),
81696764 bytesLeva a lista de moedas
c
e a quantidade alvoa
na sintaxe de curry(c)(a)
. Retorna0
outrue
.Casos de teste
Mostrar snippet de código
fonte
Haskell , 28 bytes
A função do operador
(#)
pega um número inteiro e uma lista de números inteiros (ou, geralmente, qualquerTraversable
contêiner de números) e retorna aBool
.Use como
6#[1, 2, 5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000]
.Experimente online!
Como funciona
c
é o valor desejado el
a lista de valores da moeda.mapM(:[0])l
mapas(:[0])
maisl
, emparelhando cada valor com 0, e depois constrói o produto cartesiano, dando listas onde cada elemento é ou seu valor correspondente eml
, ou 0.sum<$>
soma cada combinação eelem c$
verifica sec
está na lista resultante.fonte
R,
88bytes-5 bytes graças a @Jarko Dubbeldam
retorna uma função anônima. Ele gera todas as combinações possíveis de moedas (usando
expand.grid
pares deT,F
) e verifica se os valores estão presentes.k
é moedas, já quec
é uma palavra reservada em R. Pode verificar vários valores de uma só vez.Experimente online!
fonte
c(T,F)
por!0:1
erep(list(!0:1),length(k))
porlapply(k,function(x)!0:1)
Map(function(x)!0:1,k)
Japonês , 7 bytes
Experimente online! Saídas
0
para falsy, um número inteiro positivo para a verdade.Explicação
fonte
Python 3 , 52 bytes
5 bytes graças a ovs.
Experimente online!
fonte
Ruby , 39 bytes
Retorna
nil
como o valor falso e o menor valor da moeda na lista que compõe o número como verdade (todos os números são verdadeiros em Ruby).Porém, lembre-se de que esse algoritmo é incrivelmente lento, com
O(C!)
complexidade de tempo, ondeC
está o tamanho da lista de moedas. Eventualmente, ele termina, mas a maioria dos casos de teste atinge o tempo limite na maioria dos intérpretes onlinef(UK_POUND, 5)
.Aqui está uma versão de 41 bytes que termina muito mais rapidamente adicionando uma condição de finalização extra e é muito mais difícil realmente atingir o tempo limite
Experimente online!
fonte
Utilitários Bash + GNU,
5639A lista de denominações de entrada (sem classificação) é fornecida como uma lista separada por vírgulas. A lista de entrada e o valor são fornecidos como parâmetros de linha de comando.
Saída fornecida na forma do código de retorno do shell. Inspecione
echo $?
depois de executar o script.0
significa verdade,1
significa falsidade.Experimente online .
printf %$2s
gera uma sequência devalue
espaços"^ {${1//,/\}? {}}?$"
é uma expansão de shell que expande a lista de denominação para um regex como^ {1}? {2}? {5}? {10}? ... $
. Acontece que oegrep
mecanismo regex é inteligente o suficiente para corresponder corretamente a isso, independentemente da ordem em que as denominações estãoegrep
verifica se a sequência de espaços corresponde à regexfonte
C, 66 bytes
Veja como funciona aqui .
C, 53 bytes
Essa variante pega a matriz de moedas, que anula o objetivo desse problema, porque se resume a uma simples subtração.
O primeiro argumento é a matriz de moedas, o segundo é a contagem de moedas e o terceiro é o valor.
C, 48 bytes
Uma alternativa para a variante anterior. Ele pressupõe que a matriz de moedas possa ser revertida e terminada em zero.
fonte
Pitão , 6 bytes
Suíte de teste.
fonte
CJam ,
1817 bytesExperimente online!
Explicação
fonte
C (gcc) , 91 bytes
Experimente online!
fonte
PHP, 70 bytes
imprime 1 para verdadeiro e nada para falso
Experimente online!
fonte
Oitava, 39 bytes
Uma função anônima que pega uma matriz de valores de moeda como o primeiro argumento e o número inteiro de destino como o segundo argumento e retorna verdadeiro ou falso.
Experimente online!
fonte
Mathematica, 42 bytes
entrada
fonte