Escriba un programa que calcule si un valor monetario ingresado, como un entero, puede representarse mediante una combinación única de monedas y / o billetes, lo que significa que la misma moneda / billete no puede usarse más de una vez.
Su programa debe tomar un valor como entrada, y puede tomar una lista de valores de monedas / billetes ya sea a través de la entrada o del equivalente de una matriz de su idioma. La lista de monedas / billetes debería poder cambiar, así que asegúrese de que esté claro dónde está definido si está usando una constante.
Su programa debería generar cualquier valor de verdad / falsedad respectivamente.
Tenga en cuenta que no se requiere generar la lista de monedas / billetes que componen el valor .
EJEMPLO
Usando la libra esterlina, (£ 1.00 = 100 y £ 420.69 = 42069)
coins = [1, 2, 5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000]
Lo siguiente dará como resultado verdadero:
6 (1, 5)
15 (10, 5)
88 (1, 2, 5, 10, 20, 50)
512 (500, 10, 2)
7003 (5000, 2000, 2, 1)
Lo siguiente dará como resultado falso:
4
209
8889
4242424242
[ANYTHING ABOVE 8888]
DATOS ALTERNATIVOS DE PRUEBA (Dólar estadounidense)
coins = [1, 5, 10, 25, 50, 100, 200, 500, 1000, 2000, 5000, 10000]
¡Buena suerte!
Respuestas:
Brachylog 2 (TIO Nexus), 2 bytes
Pruébalo en línea!
Toma la lista de monedas ya sea a través de la entrada estándar o anteponiéndola al inicio del programa como una matriz literal (cualquiera de las dos funcionará, por lo que depende de usted lo que considere "más legítimo"; la primera está permitida por defecto Reglas PPCG, esta última específicamente permitida por la pregunta); y toma el valor para producir como un argumento de línea de comando.
Explicación
Este programa hace uso de detalles de implementación de la forma en que el contenedor de TIO Nexus para las funciones de Brachylog; específicamente, le permite dar un argumento de línea de comando para dar entrada a través de la Salida. (Esto no estaba previsto en el diseño original de Brachylog; sin embargo, los idiomas se definen por su implementación en PPCG, y si aparece una implementación que haga lo que necesito, por lo tanto, puedo aprovecharla). Eso significa que el programa se ve así:
Como programa completo, devuelve un valor booleano;
true.
si todas las afirmaciones en el programa pueden ser satisfechas simultáneamente, ofalse.
si no pueden serlo.(Un recordatorio, o para las personas que aún no lo saben: Brachylog 2 usa su propia codificación de caracteres en la que
⊇
hay un solo byte de largo).fuente
08
2B
(puede ver las codificaciones aquí ). La razón por la que no enumeré la codificación específica es que es irrelevante; todo lo que realmente importa es que Brachylog no use más de 256 caracteres únicos, de modo que cada uno pueda representarse en un solo byte. Esto se hace comúnmente en los idiomas de golf para que el código sea más legible; podrían usar una codificación como la página de códigos 437 en su lugar, pero si lo hicieras, nadie podría leerla .05AB1E , 4 bytes
Explicación:
Pruébalo en línea!
fuente
Mathematica, 25 bytes
Función pura que toma una matriz de valores de monedas como primer argumento y el entero objetivo como segundo argumento, y devuelve
True
oFalse
.fuente
Jalea, 6 bytes
Pruébalo en línea!
-2 bytes gracias a Leaky Nun
-13 bytes gracias a Leaky Nun (larga historia)
fuente
Retina ,
5231 bytesPruébalo en línea! Toma datos como una lista de monedas y billetes separados por espacios, seguidos del valor deseado. Editar: ahorré 18 bytes gracias a @Kobi que depuró mi código. Explicación: Las dos primeras líneas simplemente se convierten de decimal a unario. La tercera línea captura la lista de monedas y billetes. La alternancia permite que el motor retroceda y elija no capturar monedas / billetes específicos. El grupo de equilibrio luego compara el valor con todos los sufijos de la lista de captura (innecesario pero más golfista).
fuente
^((1+) )+(\2?(?<-2>)|){99}$
(34 bytes, con límite en el número de monedas) o^((1+) |1+ )+(\2?(?<-2>))+$
(también 34 bytes).(?<-2>\2?)
funciona, más un byte adicional de su segunda respuesta porque?
ya no es necesario.Brachylog , 7 bytes
Pruébalo en línea!
Cómo funciona
Incluyendo la combinación, 9 bytes
Pruébalo en línea!
fuente
Java (OpenJDK 8) , 125 bytes
Pruébalo en línea!
fuente
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). Con Java 8 y sus lambdas, se puede reducir aún más a 62 bytes. Con respecto a su respuesta como es actualmente,int l=c.length-1
usar enl
lugar del-1
también es más corto.Prólogo (SWI) , 46 bytes
Pruébalo en línea!
Tenedor de mi respuesta Python .
fuente
is
como#=
, lo que le permitiría eliminar algunos espacios en blanco).JavaScript (ES6),
81696764 bytesToma la lista de monedas
c
y la cantidad objetivoa
en sintaxis de curry(c)(a)
. Devoluciones0
otrue
.Casos de prueba
Mostrar fragmento de código
fuente
Haskell , 28 bytes
La función de operador
(#)
toma un entero y una lista de enteros (o, más generalmente, cualquierTraversable
contenedor de números) y devuelve unBool
.Usar como
6#[1, 2, 5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000]
.Pruébalo en línea!
Cómo funciona
c
es el valor deseado yl
la lista de valores de monedas.mapM(:[0])l
mapas(:[0])
sobrel
, el emparejamiento de cada valor con 0 y, a continuación construye el producto cartesiano, dando listas donde cada elemento es o bien su valor correspondiente enl
, o 0.sum<$>
suma cada combinación yelem c$
comprueba sic
está en la lista resultante.fuente
R,
8883 bytes-5 bytes gracias a @Jarko Dubbeldam
devuelve una función anónima Genera todas las combinaciones posibles de monedas (utilizando
expand.grid
pares deT,F
) y comprueba si los valores están presentes.k
es monedas ya quec
es una palabra reservada en R. Puede verificar múltiples valores a la vez.Pruébalo en línea!
fuente
c(T,F)
por!0:1
, yrep(list(!0:1),length(k))
porlapply(k,function(x)!0:1)
Map(function(x)!0:1,k)
Japt , 7 bytes
Pruébalo en línea!Salidas
0
para falsedad, un entero positivo para verdad.Explicación
fuente
Python 3 , 52 bytes
5 bytes gracias a los ovs.
Pruébalo en línea!
fuente
Ruby , 39 bytes
Devuelve
nil
como el valor falso, y el valor de moneda más pequeño en la lista que compone el número como verdadero (todos los números son verdaderos en Ruby).Sin embargo, tenga en cuenta que este algoritmo es increíblemente lento, con
O(C!)
complejidad de tiempo, dondeC
está la longitud de la lista de monedas. Eventualmente termina, pero la mayoría de los casos de prueba se agotarán en la mayoría de los intérpretes en línea, inclusof(UK_POUND, 5)
.Aquí hay una versión de 41 bytes que termina mucho más rápido al agregar una condición de finalización adicional, y es mucho más difícil de superar.
Pruébalo en línea!
fuente
Bash + utilidades GNU,
5639La lista de denominación de entrada (sin clasificar) se proporciona como una lista separada por comas. La lista de entrada y el valor se proporcionan como parámetros de línea de comandos.
Salida dada en forma de código de retorno de shell. Inspeccione con
echo $?
después de ejecutar el script.0
significa verdad,1
significa falsedad.Pruébalo en línea .
printf %$2s
genera una cadena devalue
espacios"^ {${1//,/\}? {}}?$"
es una expansión de shell que expande la lista de denominaciones a una expresión regular como^ {1}? {2}? {5}? {10}? ... $
. Resulta que elegrep
motor regex es lo suficientemente inteligente como para coincidir correctamente con esto, independientemente del orden en que se encuentren las denominacionesegrep
comprueba si la cadena de espacios coincide con la expresión regularfuente
C, 66 bytes
Véalo funcionar aquí .
C, 53 bytes
Esta variante toma la matriz de monedas, lo que anula el propósito de este problema, porque se reduce a una simple resta.
El primer argumento es la matriz de monedas, el segundo es el recuento de monedas y el tercero es el valor.
C, 48 bytes
Una alternativa a la variante anterior. Se supone que la matriz de monedas se puede revertir y terminar con cero.
fuente
Pyth , 6 bytes
Banco de pruebas.
fuente
CJam ,
1817 bytesPruébalo en línea!
Explicación
fuente
C (gcc) , 91 bytes
Pruébalo en línea!
fuente
PHP, 70 bytes
imprime 1 para verdadero y nada para falso
Pruébalo en línea!
fuente
Octava, 39 bytes
Una función anónima que toma una matriz de valores de monedas como el primer argumento y el entero de destino como el segundo argumento, y devuelve verdadero o falso.
Pruébalo en línea!
fuente
Mathematica, 42 bytes
entrada
fuente