Nuggets of Code
Jest to hipotetyczna sytuacja, w której jest piątek wieczorem, a zaprosiłeś zwykłych kumpli golfowych do udziału w swoim ulubionym hobby: golfie kodowym. Ponieważ jednak jest to tak wyczerpujące zadanie, musisz zebrać trochę pokarmu dla grupy, abyś mógł grać w golfa jak najwięcej z kodu.
Teraz ulubioną przekąską wszystkich są nuggetsy z kurczaka, ale jest problem: nie ma jednej paczki, która zaspokoi potrzeby wszystkich. Ponieważ jesteś już w golfowym nastroju, postanowiłeś stworzyć program, który dokładnie określi, jakie pakiety musisz kupić, aby móc zaspokoić potrzeby każdego z samorodków.
Rozmiary opakowań samorodków z kurczaka są wszędzie, aw zależności od miejsca zamieszkania na świecie zmieniają się również standardowe rozmiary. Jednak najbliższe [miejsce, które obsługuje samorodki] zawiera następujące rozmiary pakietów samorodków:
4, 6, 9, 10, 20, 40
Teraz możesz zauważyć, że nie możesz zamówić pewnych kombinacji bryłek. Na przykład 11
samorodki nie są możliwe, ponieważ nie ma 11
dokładnie takiej kombinacji . Możesz jednak zrobić 43
, zdobywając 1 paczkę 20
, 1 paczkę 10
, 1 paczkę 9
i 1 paczkę 4
,
20 + 10 + 9 + 4 = 43 (597)
gdzie 597
każdy termin jest podniesiony do kwadratu i zsumowany (wskazówka: optymalne rozwiązanie ma to jako najwyższą wartość) . Istnieją oczywiście inne sposoby tworzenia 43
, ale jak wiadomo, im więcej samorodków na opakowanie, tym taniej robi na samorodek. Tak więc chcesz idealnie kupić najmniejszą liczbę paczek i jak najwięcej, aby zminimalizować koszty.
Zadanie
Powinieneś stworzyć program lub funkcję, która pobiera listę liczb całkowitych odpowiadających wymaganiom każdej osoby. Następnie należy obliczyć i wydrukować najbardziej opłacalne zamówienie α , aby kupić samorodki kurczaka. Najbardziej opłacalnym zamówieniem α jest kombinacja, w której suma kwadratów każdej ilości jest najwyższa. Jeśli nie ma absolutnie żadnego sposobu, aby kupić bryłki doskonale, trzeba wydrukować wartość falsy takie jak 0
, False
, Impossible!
, lub, co jest dostępne w języku polskim.
Przykład I / O:
[2 7 12 4 15 3] => [20 10 9 4]
1, 1, 2, 1 => False
6 5 5 5 5 5 9 => 40
[6, 4, 9] => 9 10
1 => 0
199 => 40, 40, 40, 40, 20, 10, 9
2 => Impossible!
Oto lista idealnych rozwiązań dla pierwszych 400. Pamiętaj, że nie są one sformatowane w sposób, w jaki oczekiwałbym twojego, każde tuple
ma formę (N lots of M)
.
Zasady
- Brak standardowych luk.
- Bez użycia wbudowanych funkcji, które wykonują wszystkie lub większość zadań, takich jak
FrobeniusSolve
Mathematica.
α - Aby wyjaśnić to na przykładzie, możesz również zrobić 43, robiąc to 4 + 6 + 6 + 9 + 9 + 9 = 43 (319)
, ale nie byłoby to optymalne, a zatem niepoprawne wyjście, ponieważ suma kwadratów jest mniejsza niż kombinacja, którą zauważyłem we wstępie. Zasadniczo wyższa suma kwadratów = niższy koszt = najbardziej opłacalny.
Odpowiedzi:
Pyth,
2625 bajtówZauważ, że istnieją pewne niedrukowalne znaki. Wypróbuj online: demonstracja . Jest dość wolny (ale nie tak wolny jak moje 26-bajtowe rozwiązanie).
Wyjaśnienie:
Pyth, 32 bajty
Zauważ, że istnieją pewne niedrukowalne znaki. Wypróbuj online: Demonstracja Ta wersja jest znacznie szybsza. Znajduje rozwiązanie dla danych wejściowych
[6,7,8]
w ciągu około jednej sekundy, a rozwiązanie dla danych wejściowych[30]
w około 90 sekund.Wyjaśnienie:
źródło
.a
metody jest krótsze niż kwadrat i sumowanies^R2
.Perl,
175153Pobiera dane wejściowe z argumentów programu. Wyświetla a :(, jeśli nie może znaleźć idealnego rozwiązania.
Nieskluczony kod:
PS: To chyba pierwszy wpis, który nie zajmuje 10 minut
1 2
;)Sprawdź to tutaj.
źródło
18
powinny zostać wydrukowane9 9
, a nie4 4 10
.9
i10
.CJam,
452928 bajtówZauważ, że to podejście jest bardzo wolne i wymaga dużej ilości pamięci.
Wypróbuj online w interpretatorze CJam .
Można go znacznie przyspieszyć kosztem 5 bajtów:
Złożoność jest wciąż wykładnicza w sumie danych wejściowych, ale powinno to obsłużyć przypadki testowe do 159 z interpreterem online i do 199 z interpreter Java w ciągu kilku sekund.
Wypróbuj online w interpretatorze CJam .
Pomysł
Zakup optymalna (maksymalna suma kwadratów) to ważny zakup (poprawna ilość bryłek), który ma aż 40 „s, jak to możliwe, to jak wielu 20 ” s, jak to możliwe, a następnie aż 9 „s jak to możliwe (na przykład,
9 9
jest preferowane powyżej10 4 4
) i tak dalej przez 10 , 6 i 4 .W tym podejściu generujemy iloczyn kartezjański N kopii N tablicy [40 20 9 10 6 4 0] , gdzie N jest pożądaną liczbą bryłek. N to (zła) górna granica liczby zakupów, które musimy zrobić. W przyspieszonej wersji kodu zamiast tego używamy N / 40 + 4 .
Ze względu na sposób uporządkowania tablicy produkt kartezjański rozpocznie się od wektora [40 ... 40] i zakończy na wektorze [0 ... 0] . Obliczamy indeks pierwszego wektora, który ma poprawną sumę (która będzie miała również optymalną sumę kwadratów), wyszukujemy odpowiedni element tablicy, usuwamy zera, które służyły za symbole zastępcze i wypisujemy wynik.
Jeśli nie można znaleźć wektora, indeks będzie wynosił -1 , więc pobieramy [0 ... 0] , które zamiast tego wypisuje pustą tablicę.
Kod
źródło
Julia, 126 bajtów
Tworzy to nienazwaną funkcję, która przyjmuje tablicę jako dane wejściowe i drukuje tablicę lub wartość logiczną do STDOUT, w zależności od tego, czy istnieje rozwiązanie. Aby to nazwać, nadaj mu nazwę, np
f=n->...
.Niegolfowane + wyjaśnienie:
Przykłady:
źródło
Python 3 - 265 znaków
Pokazuje odstępy:
Przechodzi wszystkie przypadki testowe
Uwaga: nie wiem, czy to przejdzie wszystkie przypadki, ponieważ jest tak wolny ... Ale powinien ...
źródło
from blah import*
zawsze jest to najlepsze. Jedynym wyjątkiem, który mogę wymyślić powyżej, jest to, że masz wieleimport
s, co jest jedynym czasem, który przychodzi mi na myśl, gdzieas
jest to rzeczywiście przydatne.JavaScript,
261256261Nie jestem pewien, czy to w porządku, wydaje się, że działa, ale na pewno brakuje mi rzeczy.
Nie wydaje się jednak być powolny, aż do
123456
wyjścia[40 x 3086, 10, 6]
prawie natychmiastowego .Wyjaśnienie:
Iteracja po rozmiarach modelu użytkowego (najpierw największy)
Dla 199 | 1 zbudowany stos wygląda tak
Za 1
źródło
11
wydruki[6]
i18
wydruki[10, 4]
.[10,4]
ponieważ brakowało mi pary parens. Sprawdzenie było rzeczywiście niepoprawne, właśnie sprawdziłem, czy w zestawie wyników znajduje się co najmniej jeden element, a nie, czy sumuje się poprawnie. Nie wiem, co tam pomyślałem