Antecedentes
La moneda oficial de la nación imaginaria de Golfenistán es el foo , y solo hay tres tipos de monedas en circulación: 3 foos, 7 foos y 8 foos. Uno puede ver que no es posible pagar ciertas cantidades, como 4 foos, usando estas monedas. Sin embargo, se pueden formar todas las cantidades suficientemente grandes. Su trabajo es encontrar la mayor cantidad que no se puede formar con las monedas (5 foos en este caso), lo que se conoce como el problema de la moneda .
Entrada
Su entrada es una lista de enteros positivos, que representan los valores de las monedas en circulación. Hay dos cosas garantizadas al respecto:L = [n1, n2, ..., nk]
- El MCD de los elementos de
L
es 1. L
no contiene el número 1.
Puede estar sin clasificar y / o contener duplicados (piense en monedas de edición especial).
Salida
Como el MCD de L
es 1, cada entero lo suficientemente grande m
puede expresarse como una combinación lineal no negativa de sus elementos; en otras palabras, tenemos
m = a1*n1 + a2*n2 + ... + ak*nk
para algunos números enteros . Su salida es el entero más grande que no se puede expresar de esta forma. Como pista, se sabe que la salida siempre es menor que , si y son los elementos máximos y mínimos de ( referencia ).ai ≥ 0
(n1 - 1)*(nk - 1)
n1
nk
L
Reglas
Puede escribir un programa completo o una función. El conteo de bytes más bajo gana, y las lagunas estándar no se permiten. Si su idioma tiene una operación incorporada para esto, no puede usarlo. No hay requisitos de tiempo o eficiencia de memoria, excepto que debe poder evaluar los casos de prueba antes de publicar su respuesta.
Después de publicar este desafío, el usuario @vihan señaló que Stack Overflow tiene un duplicado exacto . Basado en esta discusión Meta , este desafío no se eliminará como un duplicado; sin embargo, pido que todas las respuestas basadas en las de la versión SO deben citar los originales, recibir el estado de Wiki de la comunidad y eliminarse si el autor original desea publicar su respuesta aquí.
Casos de prueba
[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
fuente
FrobeniusNumber
en Mathematica(p - 1)(q - 1)
como el límite superior, dóndep
yq
son el elemento más pequeño y más grande del conjunto.[2,3]
en un tiempo razonable y nada más.[2,5]
crearía alrededor de un millón de listas de Python en la memoria.Respuestas:
Pyth, 23 bytes
Es muy lento, ya que verifica todos los valores hasta el producto de todas las monedas. Aquí hay una versión que es casi idéntica, pero 1) reduce el conjunto de monedas a las que no son divisibles entre sí y 2) solo verifica valores de hasta
(max(coins) - 1) * (min(coins) - 1)
(47 bytes):Explicación
fuente
Perl
605451 bytesCódigo de 50 bytes + línea de comando de 1 bytes
Seguirá jugando al golf y publicará una explicación más tarde. El enfoque básico es dejar que el motor regex haga el trabajo duro con la coincidencia de cadenas. Por ejemplo, construirá una expresión regular similar a
^(.{3})*(.{7})*(.{8})*$
y coincidirá con una cadena de longitudn
donden
desciende del producto de las entradas hasta que no coincida.Tenga en cuenta que esto se volverá exponencialmente lento a medida que aumente el número de argumentos.
Uso: los argumentos se leen desde STDIN (nueva línea separada), por ejemplo:
fuente
R ,
8478 bytesPruébalo en línea!
outer
sin "*" y encolSums
lugar de "aplicar (..., 2, suma)".Una versión más rápida pero más larga (por dos bytes) solo considera
max(a)
:Una versión un poco más corta (78 bytes) que con frecuencia requiere demasiado registro o demasiado espacio para ejecutarse. Pruébelo en línea es
fuente
Python2,
188187 bytesLa segunda sangría se representa como 4 espacios en SO, que deberían ser pestañas.
En realidad, una solución "rápida", no fuerza bruta, utiliza el "Método de Wilf" como se describe aquí .
fuente
Javascript ES6,
120130126128127125 caracteresVersión alternativa de 126 caracteres:
Prueba:
fuente
forEach(
conmap(