Es war ein warmer Sommerabend ...
Als mein dummes Auto beschloss, auf dem Rückweg vom Supermarkt mitten auf der Straße eine Panne zu haben. Ich schob es an die Seitenlinie und beschloss, nach Hause zu gehen. Ich öffnete den Kofferraum, um das Lebensmittelgeschäft und die restlichen Sachen herauszunehmen. Zu diesem Zeitpunkt bemerkte ich, dass die Artikel nicht gleichmäßig verpackt waren. Einige Taschen hatten schwerere Gegenstände, andere hatten weniger leichtere Sachen - einige hatten sogar eine Mischung aus solchen Gegenständen. Um mir das Tragen zu erleichtern, habe ich beschlossen, alles in zwei Säcke zu gruppieren und die Gewichte so nah wie möglich aneinander zu bringen.
Dein Ziel
soll mir helfen, die Artikel in zwei Einkaufstaschen so zu ordnen, dass der Unterschied zwischen beiden Taschen so nahe wie möglich bei Null liegt.
Mathematisch:
GEWICHT LINKE HAND - GEWICHT RECHTE HAND ≈ 0
Beispiel
Wenn ich nur 2 Artikel hatte, Brot und Erdnussbutter, und das Gewicht von Brot beträgt 250 Gramm und Erdnussbutter 150 Gramm, ist der beste Weg, sie separat in zwei Händen zu tragen.
W LH - W RH = W (BROT) - W (P. BUTTER)
250 - 150 = 100
Die andere Möglichkeit ist:
W (BROT, P. BUTTER) - W (leere Hand) = (250 + 150) - 0 = 400
Dies ist nicht besser als unser erster Fall, deshalb sollten Sie den ersten Fall wählen.
Ihr Code sollte
- Geben Sie Zahlen ein, die das Gewicht der Artikel in der Einkaufstasche angeben. Einheiten sind nicht wichtig, sollten aber gleich sein (idealerweise Kilogramm oder Gramm). Die Eingabe kann einzeln oder alle gleichzeitig erfolgen. Sie können die Gesamtanzahl auf maximal 20 Elemente beschränken, wenn Sie möchten.
- Das Eingabeformat / der Eingabetyp können Sie selbst auswählen, es sollte jedoch nichts anderes als die Gewichte vorhanden sein.
- Jede Sprache ist erlaubt, aber halte dich an Standardbibliotheken.
- Ausgabe anzeigen. Auch hier können Sie das Format frei wählen, aber das Format in Ihrem Beitrag erläutern. dh wie können wir erkennen, welche Gegenstände für die linke Hand und welche für die rechte Hand sind.
Punkte
- Kürzester Code gewinnt.
Hinweis
Die beiden möglichen Algorithmen, die ich mir vorstellen könnte, sind Differenzierung (schneller) und Permutationen / Kombinationen (langsamer). Sie können diesen oder einen anderen Algorithmus verwenden, der die Aufgabe erfüllt.
Antworten:
Pyth, 9 Bytes
Eingabe-, Ausgabeformate:
Demonstration.
Dies funktioniert, weil
y
die Teilmengen in einer solchen Reihenfolge zurückgegeben werden, dass jede Teilmenge und ihr Komplement gleich weit vom Zentrum entfernt sind. Da die Summe einer Teilmenge und die Summe ihres Komplements immer gleich weit vom Zentrum entfernt sind, hat auch die nachfolgende ListeosNyQ
diese Eigenschaft. Somit sind die beiden mittleren ElementeosNyQ
Komplemente und müssen eine optimale Aufteilung aufweisen. Wir extrahieren das erste dieser beiden Elemente und drucken es aus.quelle
s
dass es nicht mehr funktioniert. Die Leute mochten die Änderung nicht und Ihr Kommentar war der letzte Schubs, den ich brauchte, um sie wieder zu ändern.Pyth, 16
Dadurch werden die Eingaben als Python-Liste in STDIN übernommen. Die Ausgabe ist eine Liste von 2 Listen, wobei die erste Liste die Artikel in einem Beutel darstellt und die zweite Liste die Artikel im zweiten Beutel darstellt. Dieser Brute erzwingt alle Kombinationen, daher wird er bei großen Eingaben sehr langsam ausgeführt (oder es geht ihm der Speicher aus).
Probieren Sie es hier online aus
Um die Behandlung von nur einer Eingabe zu unterstützen, sind dies bis zu 17:
Dadurch werden die Werte gedruckt, die in einer Hand liegen.
quelle
[[2], [1], [1]]
, aber ich denke, dass es funktioniert, aufgrund genau der Funktionsweise./
.[[x], []]
.CJam,
1918 BytesDies ist eine anonyme Funktion, die ein Array von Ganzzahlen aus dem Stapel löscht und ein durch ein Leerzeichen getrenntes Array von Ganzzahlen zurückgibt.
Vielen Dank an @ jimmy23013 für seinen genialen
:*
Trick, der 1 Byte eingespart hat.Probieren Sie es online im CJam-Interpreter aus .
Wie es funktioniert
Geben Sie das Gesamtgewicht der Einkaufstaschen mit W an . Wenn dann die Beutel in einer der Hände W / 2 - D / 2 wiegen , müssen die in der anderen Hand wiegen und W - (W / 2 - D / 2) = W / 2 + D / 2 .
Wir versuchen den Unterschied D zu minimieren . Aber (W / 2 - D / 2) (W / 2 + D / 2) = W ^ 2/4 - D ^ 2/4 , was größer wird, wenn D kleiner wird.
Das maximale Produkt entspricht also der minimalen Differenz.
quelle
:*
...W=
sollte funktionieren.Python 2.7,
161, 160Code
Algorithmus
Überprüfen Sie, ob sich jede Kombination dem halben Gesamtgewicht nähert. Iteriere und finde den besten.
Eingang
Ausgabe
Das angezeigte Tupel geht in die eine Hand, das nicht angezeigte in die andere (es verstößt nicht gegen die Regeln).
quelle
from itertools import*
JavaScript ( ES6 ) 117
Verwenden Sie eine Bitmaske, um jede mögliche Aufteilung zu versuchen, sodass sie auf 31 Elemente beschränkt ist (gemäß den Regeln in Ordnung). Wie die Antwort gibt es nur eine Hand aus. Hinweis: Ich achte auf die minimale Differenz> = 0, um Math.abs zu vermeiden, da es für jede Minute <0 eine weitere> 0 gibt, bei der nur die Hände getauscht werden.
Zum Testen: Führen Sie das Snippet in Firefox aus, und geben Sie eine Liste mit durch Kommas oder Leerzeichen getrennten Zahlen ein.
quelle
Haskell, 73 Bytes
Gibt eine Liste von Elementen in einer Hand aus. Die fehlenden Elemente gehen dagegen.
Verwendung:
f [7,7,7,10,11]
->[7,7,7]
Berechnen Sie für alle Teilfolgen
s
der Eingabelistel
den absoluten Wert der Gewichtsdifferenz zwischens
und den fehlenden Elementen vonl
. Finde das Minimum.quelle
Haskell, 51 Bytes
Das Ausgabeformat ist, dass die Gewichte für die linke Hand positiv und die Gewichte für die rechte Hand negativ sind.
Um jeden möglichen Split zu generieren
mapM(\x->[x,-x])l
, negieren wir jede mögliche Teilmenge von Elementen. Dann((,)=<<abs.sum)
Etikett jeweils mit ihrer absoluten Summe undsnd$minimum$((,)=<<abs.sum)
nehmen das kleinste markierte Element.Ich konnte es aufgrund von Problemen mit der Typprüfung nicht ohne weiteres bekommen.
quelle
snd.minimum.map((,)=<<abs.sum).mapM(\x->[x,-x])
. Es sind 47 Bytes. (obwohl ich eine ältere Version installiert habe ...)R (234)
eine längere und langsamere Lösung mit R.
Funktion:
Erwartete Eingabe - Vektor mit den Gewichten.
Erwartete Ausgabe - Vektor mit den Gewichten für eine Hand.
Beispiel
Vom Menschen lesbare Codeversion:
quelle
Axiom 292 Bytes
Eine Brute-Force-Anwendung. Dies würde die Menge minimieren
denn wenn ist das Minimum
es wäre auch minimal
Dabei ist (reduzieren (+, a) -reduzieren (+, r)) und reduzieren (+, r) das Gewicht von zwei Beuteln. Ungolf und Ergebnisse
quelle