Premier puzzle de ma part, des suggestions d'amélioration reçues avec plaisir!
Le scénario est; Vous travaillez en tant que manager pour une entreprise de rafting en eau vive. Chaque matin, une liste de réservations vous est remise et vous devez les trier en radeaux. Écrivez un programme ou une fonction dans la langue de votre choix qui le fait pour vous.
Chaque radeau peut accueillir un maximum de n
clients, et chaque réservation est pour un groupe entre 1 et n
personnes (inclus). Les règles suivantes doivent être respectées;
Aucun groupe ne peut être divisé. S'ils ont réservé ensemble, ils doivent tous être dans le même radeau.
Le nombre de radeaux doit être minimisé.
Sous réserve des deux règles précédentes, les groupes doivent être répartis le plus équitablement possible entre les radeaux.
Contributions.
Le nombre n
(vous pouvez supposer qu'il s'agit d'un entier positif) et la taille de toutes les réservations. Il peut s'agir d'un tableau, d'une liste ou d'une structure de données similaire si votre langue prend en charge de telles choses. Tous ces éléments seront des entiers positifs compris entre 1 etn
. L'ordre des réservations n'est pas défini, ni important.
Production. Une liste des numéros de réservation, regroupés en radeaux. Le groupement doit être indiqué sans ambiguïté, tel que;
- une liste ou un tableau de tableaux.
- une liste séparée par des virgules pour chaque radeau. Retour à la ligne entre chaque radeau.
La façon dont vous implémentez la troisième règle dépend de vous, mais cela pourrait impliquer de trouver l'occupation moyenne du radeau et de minimiser autant que possible les écarts par rapport à celle-ci. Voici quelques cas de test.
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]
Les règles standard s'appliquent, le code le plus court l'emporte. S'amuser!
Édité; Une façon suggérée de définir le plus équitablement possible la troisième règle.
Une fois le nombre de radeaux r
déterminé (sous réserve de la deuxième règle), l'occupation moyenne a
peut être calculée en additionnant les réservations et en divisant par r
. Pour chaque radeau, l'écart par rapport à l'occupation moyenne peut être trouvé en utilisant d(x) = abs(n(x)-a)
, où n(x)
est le nombre de personnes dans chaque radeau et 1 <= x <= r
. Pour une fonction continue, à valeur unique f(y)
, qui est strictement positive et qui a une première dérivée strictement positive et une seconde dérivée non négative pour tout positif y
, nous définissons une quantité non négative F
, comme la somme de tous les f(d(x)), 1 <= x <= r
. Tout choix d'allocation de radeaux qui satisfait aux deux premières règles et où F
est égal au minimum global satisfera également la troisième règle.
g(y) = y
(deuxième dérivé zéro) oug(y) = y²
(premier dervier zéro quandy = 0
).Réponses:
Perl 6 ,
163158 octetsEssayez-le en ligne!
Comment ça fonctionne
Génère toutes les partitions possibles de toutes les permutations du tableau d'entrée.
Filtre ceux où aucun radeau n'est surbooké.
Filtre ceux où le nombre de radeaux est minimal.
Obtient le premier avec un minimum ∑ (n x -a) 2 .
-4 octets grâce à @ Pietu1998
la source
.abs
si vous conciliez le résultat?Haskell 226
228234268octetsRéponse naïve à Haskell
Ou non golfé
Avec quelques cas de test
Où
test
rendementsÉditer
Merci à @flawr et @nimi pour leurs conseils.
Écrasé
p
un peu.Rasé quelques octets.
la source
s=sum
puis utiliser à las
place desum
, et peut-être vous pouvez également remplacerfst$ ...
par...!!0
.minimumBy(c s)
avechead.sortOn s
et supprimer la fonctionc
. Aussi:\t->sum t<=n
est(<=n).sum
.Python3, 224 octets
Avec des testcases:
Comment ça marche?
La
p
fonction génère simplement toutes les partitions d'une liste donnée (toutes les façons possibles de la diviser en sous-listes).s=sum
renomme simplement la fonction somme, donc la dernière ligne fait tout le travail.Je suis certain que cela peut être approfondi, en particulier la
p
fonction, mais j'ai déjà travaillé dessus pendant des heures, alors c'est parti.la source