Primeiro quebra-cabeça de mim, sugestões de melhorias recebidas com prazer!
O cenário é; Você trabalha como gerente de uma empresa de rafting. Todas as manhãs, você recebe uma lista de reservas e precisa classificá-las em jangadas. Escreva um programa ou função no idioma escolhido que faça isso por você.
Cada jangada comporta um máximo de n
clientes e cada reserva é para um grupo de 1 a n
pessoas (inclusive). As seguintes regras devem ser observadas;
Nenhum grupo pode ser dividido. Se eles reservaram juntos, todos devem estar na mesma balsa.
O número de balsas deve ser minimizado.
Sujeitos às duas regras anteriores, os grupos devem ser divididos o mais igualmente possível entre as jangadas.
Entradas.
O número n
(você pode assumir que este é um número inteiro positivo) e o tamanho de todas as reservas. Pode ser uma matriz, lista ou estrutura de dados semelhante se o seu idioma suportar essas coisas. Todos estes serão números inteiros positivos entre 1 e n
. A ordem das reservas não está definida, nem é importante.
Saída. Uma lista dos números de reserva, agrupados em cargas de jangada. O agrupamento deve ser indicado sem ambiguidade, como;
- uma lista ou matriz de matrizes.
- uma lista separada por vírgula para cada jangada. Nova linha entre cada jangada.
A decisão de como você implementa a terceira regra é sua, mas isso pode envolver encontrar a ocupação média da jangada e minimizar os desvios dela o máximo possível. Aqui estão alguns casos de teste.
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]
Aplicam-se regras padrão, o código mais curto vence. Diverta-se!
Editado; Uma maneira sugerida de definir o mais igualmente possível para a terceira regra.
Uma vez determinado o número de balsas r
(sujeito à segunda regra), a ocupação média a
pode ser calculada somando-se as reservas e dividindo por r
. Para cada jangada, o desvio da ocupação média pode ser encontrado usando d(x) = abs(n(x)-a)
, onde n(x)
é o número de pessoas em cada jangada e 1 <= x <= r
. Para algumas funções contínuas de valor único f(y)
, estritamente positivas e com segundas derivadas estritamente positivas e não negativas para todas as positivas y
, definimos uma quantidade não negativa F
, como a soma de todas as f(d(x)), 1 <= x <= r
. Qualquer escolha de alocação de jangada que satisfaça as duas primeiras regras e onde F
seja igual ao mínimo global também atenderá à terceira regra.
fonte
g(y) = y
(segunda derivada zero) oug(y) = y²
(primeiro dervia o zero quandoy = 0
).Respostas:
Perl 6 ,
163158 bytesExperimente online!
Como funciona
Gera todas as partições possíveis de todas as permutações da matriz de entrada.
Filtra aqueles em que nenhuma balsa está com excesso de reservas.
Filtra aqueles em que o número de balsas é mínimo.
Obtém o primeiro com mínimo ∑ (n x -a) 2 .
-4 bytes graças a @ Pietu1998
fonte
.abs
isso ao quadrado o resultado?Haskell 226
228234268bytesResposta ingênua em Haskell
Ou não destruído
Com alguns casos de teste
Onde
test
rendeEditar
Obrigado a @flawr e @nimi pelo conselho.
Esmagou
p
um pouco.Raspou alguns bytes.
fonte
s=sum
e usar ems
vez desum
, e talvez também possa substituirfst$ ...
por...!!0
.minimumBy(c s)
comhead.sortOn s
e remover funçãoc
. Também:\t->sum t<=n
é(<=n).sum
.Python3, 224 bytes
Com caixas de teste:
Como funciona?
A
p
função simplesmente gera todas as partições de uma determinada lista (todas as formas possíveis de dividi-la em sublistas).s=sum
simplesmente renomeia a função soma, para que a última linha faça todo o trabalho.Estou certo de que isso pode ser jogado ainda mais, especialmente a
p
função, mas já trabalhei nisso por horas, então aqui está.fonte