... contado!
Le pasará a su programa una variable que representa una cantidad de dinero en dólares y / o centavos y una variedad de valores de monedas. Su desafío es generar el número de combinaciones posibles de la matriz dada de valores de monedas que se sumarían a la cantidad pasada al código. Si no es posible con las monedas nombradas, el programa debería regresar 0
.
Nota sobre la terminología numismática estadounidense:
- Moneda de 1 centavo: centavo
- Moneda de 5 centavos: níquel
- Moneda de 10 centavos: dime
- Moneda de 25 centavos: cuarto (cuarto de dólar)
Ejemplo 1:
Programa aprobado:
12, [1, 5, 10]
(12 centavos)
Salida:
4
Hay 4 formas posibles de combinar las monedas nombradas para producir 12 centavos:
- 12 centavos
- 1 níquel y 7 centavos
- 2 monedas de 5 centavos y 2 centavos
- 1 centavo y 2 centavos
Ejemplo 2
Programa aprobado:
26, [1, 5, 10, 25]
(26 centavos)
Salida:
13
Hay 13 formas posibles de combinar las monedas nombradas para producir 26 centavos:
- 26 centavos
- 21 centavos y 1 níquel
- 16 centavos y 2 centavos
- 11 centavos y 3 monedas de cinco centavos
- 6 centavos y 4 monedas de cinco centavos
- 1 centavo y 5 centavos
- 16 centavos y 1 centavo
- 6 centavos y 2 monedas de diez centavos
- 11 centavos, 1 centavo y 1 níquel
- 6 centavos, 1 centavo y 2 monedas de cinco centavos
- 1 centavo, 1 centavo y 3 monedas de cinco centavos
- 1 centavo, 2 monedas de diez centavos y 1 níquel
- 1 cuarto y 1 centavo
Ejemplo 3
Programa aprobado:
19, [2, 7, 12]
Salida:
2
Hay 2 formas posibles de combinar las monedas nombradas para producir 19 centavos:
- 1 moneda de 12 centavos y 1 moneda de 7 centavos
- 1 moneda de 7 centavos y 6 monedas de 2 centavos
Ejemplo 4
Programa aprobado:
13, [2, 8, 25]
Salida:
0
No hay formas posibles de combinar las monedas nombradas para producir 13 centavos.
Esto ha sido a través del Sandbox. Se aplican lagunas estándar. Este es el código de golf, por lo que gana la respuesta con la menor cantidad de bytes.
s/count/earn
.Respuestas:
Gelatina ( tenedor ), 2 bytes
Esto se basa en una rama de Jelly donde estaba trabajando en la implementación de Frobenius para resolver átomos, por lo que desafortunadamente no puedes probarlo en línea.
Uso
Explicación
fuente
Haskell,
3734 bytesEjemplo de uso:
26 # [1,5,10,25]
->13
.Enfoque recursivo simple: intente con el siguiente número de la lista (siempre que sea menor o igual a la cantidad) y omítalo. Si restar el número lleva a una cantidad de cero, tome un
1
else (o si la lista se queda sin elementos) tome un0
. Suma esos1
s y0
s.Editar: @Damien: guardó 3 bytes señalando un caso base más corto para la recursión (que también se puede encontrar en @xnors answer ).
fuente
1209 # [1,5,10,33,48]
->1314050
.6000 # [1,5,10,33]
->22086484
.Mathematica,
3522 bytesGracias a las millas por sugerir
FrobeniusSolve
y guardar 13 bytes.Evalúa una función sin nombre, que toma la lista de monedas como primer argumento y el valor objetivo como segundo.
FrobeniusSolve
es una abreviatura para resolver ecuaciones diofantinas de la formapara los enteros no negativos y nos da todas las soluciones.
xi
fuente
(Length@*FrobeniusSolve)[{1, 7, 9}, 18]
Pyth, 8 bytes
Fuerza bruta bruta, demasiado intensiva en memoria para pruebas reales. Esto es O (2 mn ), donde n es el número de monedas ym es la suma objetivo. Toma entrada como
target\n[c,o,i,n,s]
.fuente
Haskell, 37 bytes
El uso de algunos múltiplos de la primera moneda
h
disminuye la suma requeridas
a un valor no negativo en la progresión decreciente[s,s-h..0]
, que luego debe hacerse con las monedas restantes. Una vez que no queden monedas, verifique que la suma sea cero aritméticamente como0^s
.fuente
JavaScript (ES6),
5148 bytesAcepta monedas en cualquier orden. Intenta usar y no usar la primera moneda, calculando recursivamente el número de combinaciones de cualquier manera.
n==0
significa una combinación coincidente,n<0
significa que las monedas exceden la cantidad mientrasc==undefined
que significa que no quedan monedas. Tenga en cuenta que la función es muy lenta y si tiene una moneda de un centavo, la siguiente función es más rápida (no pase la moneda de un centavo en el conjunto de monedas):fuente
Perl, 45 bytes
El recuento de bytes incluye 44 bytes de código y
-p
bandera.Toma los valores de las monedas en la primera línea y la cantidad objetivo en la segunda línea:
Explicaciones cortas:
fuente
Jalea ,
109 bytesPruébalo en línea!
¿Cómo?
fuente
JavaScript (ES6), 59 bytes
Las monedas se ingresan de mayor a menor, por ejemplo
f(26,[100,25,10,5,1])
. Si tiene un centavo, quítelo y use esta versión mucho más rápida en su lugar:Esto usa una fórmula recursiva muy parecida a @ nimi. Originalmente escribí esto hace unos días cuando el desafío todavía estaba en la caja de arena; se veía así:
Las únicas diferencias son el valor predeterminado de
c
(tenía un valor establecido en el desafío original) y el cambio0
de la.reduce
función a1
(esto era dos bytes más corto y un billón de veces más rápido quec=[100,25,10,5,1]
).Aquí hay una versión modificada que genera todas las combinaciones, en lugar del número de combinaciones:
fuente
PHP, 327 bytes
Intentalo
fuente
Axioma,
6362 bytes1 byte guardado por @JonathanAllan
Este enfoque utiliza funciones generadoras. Probablemente eso no ayudó a reducir el tamaño del código. Creo que esta es la primera vez que en mi juego con Axiom fui tan lejos como para definir mi propia función.
La primera vez que se llama a la función, da una advertencia horrenda, pero aún produce el resultado correcto. Después de eso, todo está bien siempre que la lista no esté vacía.
fuente
for
?R,
817663 bytes¡Gracias a @rturnbull por jugar al golf 13 bytes!
Ejemplo (tenga en cuenta que así
c(...)
es como pasa vectores de valores a R):Explicación:
u
es el valor deseado,v
es el vector de valores de monedas.crea un marco de datos con cada combinación posible de 0 a k monedas (k depende de la denominación), donde k es el más bajo, de modo que k multiplicado por el valor de esa moneda es al menos u (el valor a alcanzar).
Normalmente lo usaríamos
as.matrix
para convertir eso en una matriz, pero eso es muchos caracteres. En su lugar, tomamos la transposición de la transposición (!) Que la coacciona automáticamente, pero toma menos caracteres.%*% v
luego calcula el valor monetario de cada fila. El último paso es contar cuántos de esos valores son iguales al valor deseadou
.Tenga en cuenta que la complejidad computacional y los requisitos de memoria de esto son horribles, pero bueno, es el código golf.
fuente
expand.grid
! Y me encanta elt(t())
truco. Como su función solo involucra una sola línea de código, puede eliminar las llaves, ahorrándole 2 bytes. Además, puede cambiardo.call(expand.grid,lapply(u/v,seq,from=0))
por soloexpand.grid(lapply(u/v,seq,f=0))
, ahorrando 11 bytes.expand.grid
que tomaría una lista como entrada. Es una pena que":"
no funcione bien con los no enteros, de lo contrariolapply(u/v,":",0)
habría ahorrado un par más.do.call(x,y)
es igual quex(y)
, por lo que no se trata de qué tipos de entrada se aceptan. Si realmente quiere usar:
, supongo que podría usarlapply(u%/%v,`:`,0)
, pero es el mismo conteo de bytes.do.call(x,y)
es lo mismo quex(y)
" --- solo siy
no es una lista, que es en este caso. Sin embargo, acepta tu segundo punto.J, 27 bytes
Uso
Explicación
fuente
TSQL, 105 bytes
Esto solo puede manejar hasta un dólar con estos 4 tipos de monedas. La versión sin golf puede manejar hasta alrededor de 4 dólares, pero muy lenta: en mi caja, esto toma 27 segundos. El resultado es 10045 combinaciones por cierto
Golfizado:
Sin golf:
Violín
fuente
tinylisp repl, 66 bytes
Solución recursiva: intenta usar la primera moneda y no usar la primera moneda, luego agrega los resultados de cada una. Complejidad de tiempo exponencial y sin recursividad de cola, pero calcula bien los casos de prueba.
Sin golf (clave para construir:
d
= definir,q
= citar,i
= si,l
= menor que,s
= restar,h
= cabeza,t
= cola):Ejemplo de uso:
fuente
PHP, 130 bytes
Función recursiva de 99 bytes (y 31 bytes de llamada) que elimina repetidamente el valor de la moneda actual del objetivo y se llama a sí mismo con el nuevo valor y las otras monedas. Cuenta el número de veces que el objetivo alcanza exactamente 0. Corre como:
fuente
Raqueta 275 bytes
Sin golf:
Pruebas:
Salida:
La siguiente solución recursiva tiene algún error:
No funciona correctamente para:
Salida:
(1 1 3 3) es posible pero no aparece en la lista de soluciones.
fuente
reduce
Scheme
( groups.csail.mit.edu/mac/projects/scheme ) que finalmente condujo a un verdaderoRacket
( racket-lang.org , stackoverflow.com/questions/3345397/… )!Jalea , 15 bytes
Pruébalo en línea! o Verificar todos los casos de prueba.
Esto fue más un ejercicio de escribir una versión eficiente en Jelly sin usar builtins. Esto se basa en el enfoque típico de programación dinámica utilizado para calcular la cantidad de formas de realizar cambios
Explicación
fuente
En realidad , 15 bytes
Sugerencias de golf bienvenidas. Pruébalo en línea!
Ungolfing
fuente
Python, 120 bytes
Fuerza bruta a través de todas las combinaciones de monedas hasta el valor objetivo (incluso si la más pequeña no es 1).
fuente