Erstes Puzzle von mir, Verbesserungsvorschläge gerne erhalten!
Das Szenario ist; Sie arbeiten als Manager für eine Wildwasser-Rafting-Firma. Jeden Morgen erhalten Sie eine Liste mit Buchungen, die Sie in Floßladungen sortieren müssen. Schreiben Sie ein Programm oder eine Funktion in der von Ihnen gewählten Sprache, die dies für Sie erledigt.
Jedes Floß hat ein Maximum an n
Kunden und jede Buchung ist für eine Gruppe von 1 bisn
einschließlich Personen. Die folgenden Regeln müssen beachtet werden;
Es dürfen keine Gruppen aufgeteilt werden. Wenn sie zusammen gebucht haben, müssen sie sich alle im selben Floß befinden.
Die Anzahl der Flöße muss minimiert werden.
Vorbehaltlich der beiden vorhergehenden Regeln müssen die Gruppen so gleichmäßig wie möglich auf die Flöße verteilt werden.
Eingänge.
Die Nummern
(Sie können davon ausgehen, dass dies eine positive Ganzzahl ist) und die Größe aller Buchungen. Dies kann ein Array, eine Liste oder eine ähnliche Datenstruktur sein, wenn Ihre Sprache solche Dinge unterstützt. All dies sind positive ganze Zahlen zwischen 1 und n
. Die Reihenfolge der Buchungen ist nicht festgelegt und auch nicht wichtig.
Ausgabe. Eine Liste der Buchungsnummern, gruppiert nach Floßladungen. Die Gruppierung muss eindeutig angegeben werden, wie z.
- eine Liste oder ein Array von Arrays.
- eine durch Kommas getrennte Liste für jedes Floß. Newline zwischen jedem Floß.
Wie Sie die dritte Regel implementieren, bleibt Ihnen überlassen. Dies kann jedoch bedeuten, dass Sie die durchschnittliche Floßbelegung ermitteln und Abweichungen davon so gering wie möglich halten. Hier sind einige Testfälle.
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]
Es gelten Standardregeln, der kürzeste Code gewinnt. Habe Spaß!
Bearbeitet; Ein vorgeschlagener Weg, um so gleich wie möglich zu definieren die dritte Regel .
Nachdem die Anzahl der Flöße r
bestimmt wurde (vorbehaltlich der zweiten Regel), kann die durchschnittliche Belegung a
berechnet werden, indem die Buchungen summiert und durch dividiert werden r
. Für jedes Floß kann die Abweichung von der durchschnittlichen Belegung findet Verwendung d(x) = abs(n(x)-a)
, wo n(x)
die Zahl der Menschen in jedem Floß ist und 1 <= x <= r
. Für eine kontinuierliche, einwertige Funktion f(y)
, die streng positiv ist und eine streng positive erste und eine nicht negative zweite Ableitung für alle positiven hat y
, definieren wir eine nicht negative Größe F
als die Summe aller f(d(x)), 1 <= x <= r
. Jede Wahl der Floßzuweisung, die die ersten beiden Regeln erfüllt und bei F
der das globale Minimum gleich ist, erfüllt auch die dritte Regel.
quelle
g(y) = y
(zweite Ableitung von Null) oderg(y) = y²
(erste Ableitung von Null, wenny = 0
) nicht verwenden können .Antworten:
Perl 6 ,
163158 BytesProbieren Sie es online!
Wie es funktioniert
Erzeugt alle möglichen Partitionen aller Permutationen des Eingabearrays.
Filtert diejenigen, bei denen kein Floß überbucht ist.
Filtert diejenigen, bei denen die Anzahl der Flöße minimal ist.
Erhält das erste mit minimalem ∑ (n x -a) 2 .
-4 Bytes dank @ Pietu1998
quelle
.abs
wenn Sie das Ergebnis abgleichen?Haskell 226
228234268BytesNaive Antwort in Haskell
Oder ungolfed
Mit einigen Testfällen
Woher
test
ErträgeBearbeiten
Vielen Dank an @flawr und @nimi für den Rat.
Gequetscht
p
.Ein paar Bytes abgeschabt.
quelle
s=sum
und verwenden Sie danns
stattsum
, und vielleicht könnten Sie auch ersetzenfst$ ...
mit...!!0
.minimumBy(c s)
mithead.sortOn s
und Funktion entfernenc
. Auch:\t->sum t<=n
ist(<=n).sum
.Python3, 224 Bytes
Mit Testfällen:
Wie funktioniert es?
Die
p
Funktion generiert einfach alle Partitionen einer bestimmten Liste (alle Möglichkeiten, sie in Unterlisten aufzuteilen).s=sum
benennt einfach die Summenfunktion um, sodass die letzte Zeile die ganze Arbeit erledigt.Ich bin mir sicher, dass dies weiter verbessert werden kann, insbesondere die
p
Funktion, aber ich habe bereits stundenlang daran gearbeitet, also los geht's.quelle