To był ciepły letni wieczór ...
kiedy mój głupi samochód postanowił zepsuć się na środku drogi w drodze powrotnej z supermarketu. Zepchnąłem go na bok i postanowiłem iść do domu. Otworzyłem bagażnik, żeby wyjąć sklep spożywczy i pozostałe rzeczy. Wtedy zauważyłem, że przedmioty nie były równomiernie zapakowane. Niektóre torby miały więcej ciężkich przedmiotów, podczas gdy inne miały kilka lżejszych rzeczy - niektóre miały nawet mieszankę takich przedmiotów. Aby ułatwić mi noszenie, postanowiłem pogrupować wszystko w dwie torby i ustawić ich ciężary jak najbliżej siebie.
Twój cel
jest pomoc w przestawieniu przedmiotów na dwie torby na zakupy w taki sposób, aby różnica między obiema torbami była możliwie bliska zeru.
Matematycznie:
WAGA LEWA RĘKA - WAGA PRAWA RĘKA ≈ 0
Przykład
Gdybym miał tylko 2 przedmioty, Chleb i Masło Orzechowe, a waga Chleba to 250 gramów, a masło orzechowe to 150 gramów, najlepszym sposobem jest noszenie ich osobno w dwóch rękach.
W LH - W RH = W (CHLEB) - W (MASŁO) 250-150
= 100
Inną możliwością jest:
W (CHLEB, P. MASŁO) - W (pusta ręka) = (250 + 150) - 0 = 400
To nie jest lepsze niż nasz pierwszy przypadek, więc powinieneś iść z pierwszym.
Twój kod powinien
- wprowadź liczby wskazujące wagę przedmiotów w torbie na zakupy. Jednostki nie są ważne, ale powinny być takie same (najlepiej kilogramy lub gramy). Dane wejściowe można wprowadzać pojedynczo lub wszystkie jednocześnie. Jeśli chcesz, możesz ograniczyć całkowitą liczbę do 20 przedmiotów.
- Format / typ wejściowy zależy od ciebie, ale nic innego nie powinno być obecne poza wagami.
- Dowolny język jest dozwolony, ale trzymaj się standardowych bibliotek.
- Wyświetl dane wyjściowe. Ponownie możesz wybrać format, ale wyjaśnij format w swoim poście. tzn. w jaki sposób możemy stwierdzić, które z nich są lewymi, a które prawymi.
Zwrotnica
- Najkrótszy kod wygrywa.
Wskazówka
Dwa możliwe algorytmy, o których mogłem myśleć, to różnicowanie (szybsze) i permutacje / kombinacje (wolniejsze). Możesz użyć tych lub innych algorytmów, które wykonują zadanie.
Odpowiedzi:
Pyth, 9 bajtów
Formaty wejściowe, wyjściowe:
Demonstracja.
Działa to, ponieważ
y
zwraca podzestawy w takiej kolejności, że każdy podzbiór i jego dopełnienie znajdują się w równej odległości od środka. Ponieważ suma podzbioru i suma jego dopełnienia będzie zawsze jednakowo oddalona od środka, lista poosNyQ
będzie również miała tę właściwość. Zatem środkowe dwa elementyosNyQ
są dopełnieniami i muszą mieć optymalny podział. Wyodrębniamy pierwszy z tych dwóch elementów i drukujemy go.źródło
s
sprawiło, że przestało działać. Ludzie nie lubili tej zmiany, a twój komentarz był ostatnim impulsem, który potrzebowałem, aby ją zmienić.Pyth, 16 lat
To przyjmuje dane wejściowe jako listę pytonową na STDIN. Dane wyjściowe to lista 2 list, z których pierwsza to pozycje w jednej torbie, a druga lista to pozycje w drugiej torbie. Ten brutalny wymusza wszystkie kombinacje, więc będzie działać bardzo wolno (lub zabraknie pamięci) dla dużych danych wejściowych.
Wypróbuj online tutaj
Aby obsłużyć obsługę tylko jednego wejścia, zwiększa się do 17:
Spowoduje to wydrukowanie wartości, które idą jedną ręką.
źródło
[[2], [1], [1]]
, ale myślę, że działa, ponieważ dokładnie tak./
działa.[[x], []]
?CJam,
1918 bajtówJest to anonimowa funkcja, która wyrzuca tablicę liczb całkowitych ze stosu i zwraca tablicę liczb całkowitych oddzielonych spacją.
Dzięki @ jimmy23013 za jego pomysłową
:*
sztuczkę, która pozwoliła zaoszczędzić 1 bajt.Wypróbuj online w interpretatorze CJam .
Jak to działa
Oznaczają całkowity ciężar torby na zakupy z W . Następnie, jeśli worki w jednej ręce ważą W / 2 - D / 2 , te w drugiej ręce muszą ważyć, a W - (W / 2 - D / 2) = W / 2 + D / 2 .
Staramy się zminimalizować różnicę D . Ale (W / 2 - D / 2) (W / 2 + D / 2) = W ^ 2/4 - D ^ 2/4 , który staje się większy, gdy D staje się mniejszy.
Zatem maksymalny produkt odpowiada minimalnej różnicy.
źródło
:*
...W=
powinien działać.Python 2.7,
161, 160kod
Algorytm
Sprawdź, czy każda kombinacja zbliża się do połowy całkowitej masy. Iteruj i znajdź najlepszy.
wkład
wydajność
Wyświetlana krotka idzie w jednej ręce, te, które nie są wyświetlane, idą w drugiej (nie jest to niezgodne z regułami).
źródło
from itertools import*
JavaScript ( ES6 ) 117
Używanie maski bitowej do wypróbowania każdego możliwego podziału, więc jest ograniczona do 31 elementów (ok z zasadami). Podobnie jak odpowiedź ref, wyprowadza tylko jedną rękę. Uwaga: szukam minimalnej różnicy> = 0, aby uniknąć Math.abs, ponieważ dla każdej min <0 jest kolejne> 0, tylko zamiana rąk.
Aby przetestować: uruchom fragment w przeglądarce Firefox, wprowadź listę liczb oddzielonych przecinkami lub spacjami.
źródło
Haskell, 73 bajty
Wyświetla listę elementów w jednej ręce. Brakujące elementy trafiają do drugiej ręki.
Zastosowanie:
f [7,7,7,10,11]
->[7,7,7]
Dla wszystkich podsekwencji
s
listy wejściowejl
obliczyć wartość bezwzględną różnicy masy międzys
brakującymi elementami al
. Znajdź minimum.źródło
Haskell, 51 bajtów
Format wyjściowy jest taki, że odważniki lewe są dodatnie, a odważniki prawe ujemne.
Aby wygenerować każdy możliwy podział, używamy
mapM(\x->[x,-x])l
do zanegowania każdego możliwego podzbioru elementów. Następnie((,)=<<abs.sum)
oznacz każdą z nich absolutną sumą isnd$minimum$((,)=<<abs.sum)
weź najmniejszy element.Nie mogłem go zdobyć bezcelowo z powodu problemów ze sprawdzaniem typu.
źródło
snd.minimum.map((,)=<<abs.sum).mapM(\x->[x,-x])
. Ma 47 bajtów. (chociaż mam zainstalowaną starszą wersję ...)R (234)
dłuższe i wolniejsze rozwiązanie z R.
Funkcjonować:
Oczekiwany wkład - wektor z wagami.
Oczekiwany wynik - wektor z wagami na jedną rękę.
Przykład
Wersja kodu czytelnego dla człowieka:
źródło
Aksjomat, 292 bajty
Brute force. To zminimalizuje zestaw
bo jeśli jest minimum
to też byłoby minimum
gdzie (zmniejsz (+, a) -redukuj (+, r)) i zmniejsz (+, r) to waga dwóch worków. (Ale ta ostatnia formuła nie znalazła dla mnie minimum w aplikacji). Ungolf i wyniki
źródło