Primer acertijo mío, ¡sugerencias de mejora recibidas con gusto!
El escenario es; Trabajas como gerente de una empresa de rafting en aguas bravas. Todas las mañanas, se le da una lista de reservas, y debe clasificarlas en cargas de balsa. Escriba un programa o función en el idioma elegido que haga esto por usted.
Cada balsa tiene un máximo de n
clientes, y cada reserva es para un grupo de entre 1 y n
personas (inclusive). Deben observarse las siguientes reglas;
No se pueden dividir grupos. Si reservaron juntos, todos deben estar en la misma balsa.
Se debe minimizar el número de balsas.
Sujeto a las dos reglas anteriores, los grupos deben distribuirse lo más equitativamente posible entre las balsas.
Entradas.
El número n
(puede suponer que es un número entero positivo) y el tamaño de todas las reservas. Esto puede ser una matriz, una lista o una estructura de datos similar si su idioma admite tales cosas. Todos estos serán enteros positivos entre 1 y n
. El orden de las reservas no está definido, ni es importante.
Salida. Una lista de los números de reserva, agrupados en cargas de balsa. La agrupación debe indicarse sin ambigüedades, como;
- una lista o matriz de matrices.
- una lista separada por comas para cada balsa. Nueva línea entre cada balsa.
La forma en que implemente la tercera regla depende de usted, pero esto podría implicar encontrar la ocupación promedio de la balsa y minimizar las desviaciones de ella tanto como sea posible. Aquí hay algunos casos de prueba.
n Bookings Output
6 [2,5] [5],[2]
4 [1,1,1,1,1] [1,1,1],[1,1]
6 [2,3,2] [2,2],[3]
6 [2,3,2,3] [2,3],[2,3]
6 [2,3,2,3,2] [2,2,2],[3,3]
12 [10,8,6,4,2] [10],[8,2],[6,4]
6 [4,4,4] [4],[4],[4]
12 [12,7,6,6] [12],[7],[6,6]
Se aplican reglas estándar, gana el código más corto. ¡Que te diviertas!
Editado; Una forma sugerida de definir lo más equitativamente posible para la tercera regla.
Una vez que r
se ha determinado el número de balsas (sujeto a la segunda regla), la ocupación promedio a
se puede calcular sumando las reservas y dividiendo por r
. Para cada balsa, se puede encontrar la desviación de la ocupación promedio d(x) = abs(n(x)-a)
, donde n(x)
es el número de personas en cada balsa y 1 <= x <= r
. Para alguna función continua de un solo valor f(y)
, que es estrictamente positiva y tiene una primera derivada estrictamente positiva y una segunda derivada no negativa para todas las positivas y
, definimos una cantidad no negativa F
, como la suma de todas las f(d(x)), 1 <= x <= r
. Cualquier elección de asignación de balsa que satisfaga las dos primeras reglas, y donde F
sea igual al mínimo global, también satisfará la tercera regla.
fuente
g(y) = y
(segundo derivado cero) og(y) = y²
(primer derivado cero cuandoy = 0
).Respuestas:
Perl 6 ,
163158bytesPruébalo en línea!
Cómo funciona
Genera todas las particiones posibles de todas las permutaciones de la matriz de entrada.
Filtra los que no tienen exceso de balsa.
Filtra aquellos donde el número de balsas es mínimo.
Obtiene el primero con mínimo ∑ (n x -a) 2 .
-4 bytes gracias a @ Pietu1998
fuente
.abs
si cuadras el resultado?Haskell 226
228234268bytesRespuesta ingenua en Haskell
O sin golf
Con algunos casos de prueba
Donde
test
rindeEditar
Gracias a @flawr y @nimi por sus consejos.
Aplastado
p
un poco.Afeitado un par de bytes.
fuente
s=sum
y luego usar ens
lugar desum
, y quizás también podría reemplazarfst$ ...
con...!!0
.minimumBy(c s)
conhead.sortOn s
y eliminar la funciónc
. También:\t->sum t<=n
es(<=n).sum
.Python3, 224 bytes
Con estuches de prueba:
¿Como funciona?
La
p
función simplemente genera todas las particiones de una lista dada (todas las formas posibles de dividirla en sublistas).s=sum
simplemente cambia el nombre de la función de suma, por lo que la última línea hace todo el trabajo.Estoy seguro de que esto se puede jugar más, especialmente la
p
función, pero ya trabajé en esto durante horas, así que aquí tienes.fuente