Pepitas de código
Es una situación hipotética donde es viernes por la noche, y has invitado a los amigos de golf habituales a participar en tu pasatiempo favorito: el golf de código. Sin embargo, como se trata de una tarea que drena el cerebro, debe recoger algo de alimento para el grupo para que pueda jugar al golf lo más posible de su código.
Ahora, la merienda favorita de todos son las nuggets de pollo, pero hay un problema: no hay un paquete único que cubra las necesidades de todos. Entonces, dado que ya tiene ganas de jugar al golf, decide crear un programa que descubra exactamente qué paquetes debe comprar para poder cubrir las necesidades de Nugget de todos.
Los tamaños de los paquetes de nugget de pollo están por todas partes, y dependiendo de dónde viva en el mundo, los tamaños estándar también cambian. Sin embargo, el [lugar que sirve pepitas] más cercano almacena los siguientes tamaños de paquetes de pepitas:
4, 6, 9, 10, 20, 40
Ahora puede notar que no puede ordenar ciertas combinaciones de pepitas. Por ejemplo, las 11
pepitas no son posibles, ya que no existe una combinación que sea 11
exactamente igual . Sin embargo, puede 43
obtener 1 paquete de 20
, 1 paquete de 10
, 1 paquete de 9
y 1 paquete de 4
,
20 + 10 + 9 + 4 = 43 (597)
donde 597
se cuadra cada término y se suma (sugerencia: la solución óptima tiene este como el valor más alto) . Por supuesto, hay otras formas de hacer 43
, pero como sabes, cuantas más pepitas por paquete, más barato se vuelve por pepita. Por lo tanto, lo ideal es comprar el menor número de paquetes y en las mayores cantidades para minimizar su costo.
La tarea
Debe crear un programa o función que tome una lista de enteros correspondientes a los requisitos de cada persona. Luego debe calcular e imprimir la orden α más rentable para comprar las pepitas de pollo. El orden α más rentable es la combinación por la cual la suma de los cuadrados de cada cantidad es la más alta. Si no hay absolutamente ninguna manera de comprar las pepitas perfectamente, debe imprimir un valor Falsy tales como 0
, False
, Impossible!
, o lo que está disponible en su idioma.
Ejemplo de E / S:
[2 7 12 4 15 3] => [20 10 9 4]
1, 1, 2, 1 => False
6 5 5 5 5 5 9 => 40
[6, 4, 9] => 9 10
1 => 0
199 => 40, 40, 40, 40, 20, 10, 9
2 => Impossible!
Aquí está la lista de soluciones ideales para los primeros 400. Tenga en cuenta que estos no están formateados como esperaría que fueran los suyos, cada uno tuple
tiene la forma (N lots of M)
.
Reglas
- No hay lagunas estándar.
- No se utilizan funciones integradas que realizan la totalidad o la mayoría de la tarea, como
FrobeniusSolve
en Mathematica.
α: para aclarar esto con un ejemplo, también podría hacer 43 haciendo 4 + 6 + 6 + 9 + 9 + 9 = 43 (319)
, pero esto no sería óptimo y, por lo tanto, una salida incorrecta, ya que la suma de los cuadrados es menor que la combinación que anoté en la introducción. Esencialmente, mayor suma de cuadrados = menor costo = más rentable.
Respuestas:
Pyth,
2625 bytesTenga en cuenta que hay algunos caracteres no imprimibles. Pruébelo en línea: demostración . Es bastante lento (pero no tan lento como mi solución de 26 bytes).
Explicación:
Pyth, 32 bytes
Tenga en cuenta que hay algunos caracteres no imprimibles. Pruébelo en línea: demostración Esta versión es mucho más rápida. Encuentra la solución para la entrada
[6,7,8]
en aproximadamente un segundo y la solución para la entrada[30]
en aproximadamente 90 segundos.Explicación:
fuente
.a
método es más corto que cuadrar y sumars^R2
.Perl,
175153Toma su entrada de los argumentos del programa. Imprime a :( si no puede encontrar una solución perfecta.
Código sin golf:
PD: Esta es probablemente la primera entrada que no toma 10 minutos
1 2
;)Compruébalo aquí.
fuente
18
debe imprimirse9 9
, no4 4 10
.9
y10
.CJam,
452928 bytesTenga en cuenta que este enfoque es muy lento y requiere mucha memoria.
Pruébelo en línea en el intérprete de CJam .
Se puede acelerar significativamente a un costo de 5 bytes:
La complejidad sigue siendo exponencial en la suma de la entrada, pero esto debería manejar casos de prueba hasta 159 con el intérprete en línea y hasta 199 con el intérprete de Java en un par de segundos.
Pruébelo en línea en el intérprete de CJam .
Idea
Una compra óptima (suma máxima de cuadrados) es una compra válida (número correcto de pepitas) que tiene la mayor cantidad de 40 's posible, luego la mayor cantidad posible de 20 ' s, luego la mayor cantidad de 9 's posible (por ejemplo,
9 9
es preferible sobre10 4 4
) y así sucesivamente para 10 's, 6 ' sy 4 's.En este enfoque, generamos el producto cartesiano de N copias de la matriz [40 20 9 10 6 4 0] , donde N es el número deseado de pepitas. N es un límite superior (malo) para la cantidad de compras que tenemos que hacer. En la versión acelerada del código, usamos N / 40 + 4 en su lugar.
Debido a cómo se ordena la matriz, el producto cartesiano comenzará con el vector [40 ... 40] y finalizará con el vector [0 ... 0] . Calculamos el índice del primer vector que tiene la suma correcta (que también tendrá la suma óptima de cuadrados), recuperamos el elemento de matriz correspondiente, eliminamos los ceros que sirvieron como marcadores de posición e imprimimos el resultado.
Si no se puede encontrar ningún vector, el índice será -1 , por lo que recuperamos [0 ... 0] , que imprimirá una matriz vacía en su lugar.
Código
fuente
Julia, 126 bytes
Esto crea una función sin nombre que acepta una matriz como entrada e imprime una matriz o booleano en STDOUT, dependiendo de si existe una solución. Para llamarlo, dale un nombre, por ejemplo
f=n->...
.Ungolfed + explicación:
Ejemplos:
fuente
Python 3 - 265 caracteres
Mostrando espaciado:
Pasa todos los casos de prueba
Nota: No sé si esto pasará todos los casos porque es muy lento ... Pero debería ...
fuente
from blah import*
siempre es mejor. Sin embargo, la única excepción que puedo pensar en lo anterior es si tiene múltiplesimport
s, que es la única vez que se me ocurre dóndeas
es realmente útil.JavaScript,
261256261No estoy seguro de si esto está bien, parece funcionar, pero seguramente me faltan cosas.
Sin embargo, no parece ser lento, hasta
123456
que sale[40 x 3086, 10, 6]
casi de inmediato.Explicación:
Iterando sobre los tamaños de pepita (el más grande primero)
Para 199 | 1 la pila construida se ve así
Para 1
fuente
11
grabados[6]
y18
estampados[10, 4]
.[10,4]
porque me faltaban un par de parens. La verificación fue realmente incorrecta, solo verifiqué si había al menos un elemento en el conjunto de resultados, no si se resume correctamente. No sé lo que pensé allí