Pierwsze pytanie tutaj, nie krzycz na mnie, jeśli jest to duplikat lub złe wyzwanie.
Wprowadzenie
Sam pomyślałem o tym wyzwaniu i wydaje się, że jest to dobra podstawowa łamigłówka dla początkujących golfistów. Może także pomóc mi zdecydować, którego języka golfowego muszę się nauczyć.
Wyzwanie
Biorąc pod uwagę tablicę liczb całkowitych mniejszych lub równych n
, wyprowadzaj lub zwracaj minimalną liczbę liczb z tablicy, które sumują się dokładnie n
.
Możesz napisać funkcję lub pełny program.
Wejście
Możesz bezpiecznie założyć 0 <= n < 2^31
.
Weź tablicę lub listę dowolnego rodzaju ( vector
dla C ++ lub Java LinkedList
są dozwolone), wraz z n
opcjonalnym parametrem length
, który określa długość tablicy.
Możesz również wziąć dane wejściowe jako ciąg oddzielony spacjami, oddzielony n
przecinkiem lub spacją:
1 5 7 3 7 3 6 3 2 6 3,10
1 5 7 3 7 3 6 3 2 6 3 10
jeśli to jest łatwiejsze.
Wynik
Wyjdź lub zwróć minimalną liczbę liczb z tablicy, które sumują się dokładnie n
. Korzystając z powyższego przykładu:
1 5 7 3 7 3 6 3 2 6 3,10
Twój program powinien wydrukować:
2
ponieważ minimalna liczba liczb, które sumują się 10
to 2
( 7
i 3
).
W przypadku braku rozwiązania, wydrukuj lub zwróć albo wartość ujemną, 0
„Brak rozwiązania” (choć nie byłoby to mądre), ∞
(jak sugerowano), lub dowolną inną wartość fałszowania, z wyjątkiem pustego ciągu.
Przykład wejścia i wyjścia
Wejście:
1 5 7 3 7 3 6 3 2 6 3,10
143 1623 1646 16336 1624 983 122,18102
5 6 9,12
Wynik:
2
3
-1
Punktacja
To jest golf golfowy, więc wygrywa najkrótszy kod w bajtach.
Najlepsza odpowiedź zostanie przyjęta w Boże Narodzenie.
źródło
false
dla spraw bez rozwiązań?Odpowiedzi:
Pyth,
1211 bajtówPobiera to
n
jako pierwszy wiersz danych wejściowych i listę w drugim wierszu.Wypróbuj tutaj .
źródło
Japt ,
302118 bajtówOkazuje się, że była to znacznie bardziej wydajna metoda. ;)
Przetestuj online! (Uwaga:
n-
zmienionon@X-Y}
na ze względu na kompatybilność)Pobiera to dane wejściowe w postaci tablicy oddzielonej spacjami lub przecinkami, po której następuje liczba. Dane wyjściowe
undefined
dla przypadków testowych bez rozwiązań.Nie mogę uwierzyć, że nie pomyślałem o tej wersji, kiedy pierwotnie to napisałem ...
Od tego czasu dokonano kilku optymalizacji, które przydają się tutaj:
U
na początku programu zwykle można pominąć.Ã
jest skrótem do}
.n
teraz domyślnie porządkuje liczby.Każdy z nich usuwa bajt, w sumie 15:
Przetestuj online!
źródło
Mathematica,
7365 bajtówFunkcja czysta, zwraca,
∞
jeśli nie ma rozwiązania.źródło
Python 3, 128 bajtów
To nie jest tak golfa, jak bym chciał, ale popracuję nad tym później.
źródło
Mathematica, 45 bajtów
źródło
CJam, 34 bajty
Wypróbuj online . Format wejściowy to suma, po której następuje lista wartości, np .:
Pamiętaj, że spowoduje to wyjątek, jeśli nie zostanie znalezione rozwiązanie. Wyjątkiem jest stderr, gdy CJam jest uruchamiany z wiersza poleceń, a poprawny wynik (
0
) jest nadal wypisywany na standardowe wyjście. Jest to więc zgodne z konsensusem ustalonym w Czy należy dopuścić, aby przedłożenie zakończyło się błędem?Kod może wyglądać dłużej, niż można się spodziewać. Głównym powodem jest to, że CJam nie ma wbudowanego generowania kombinacji. A przynajmniej taka jest moja wymówka i trzymam się jej.
Wyjaśnienie:
źródło
JavaScript (ES6), 84 bajtów
Wyjaśnienie
Trwa
Array
odNumber
s, aNumber
jako argumenty. Zwraca liczbę,Infinity
jeśli nie ma wyniku. Jest to funkcja rekurencyjna, która odejmujen
i usuwa każdy element z tablicy jeden po drugim don == 0
.Test
Ten zestaw testów
m
naInfinity
później zamiast jako domyślny argument, aby działał w Chrome (zamiast tylko Firefox).Pokaż fragment kodu
źródło
Haskell, 72 bajty
Zwraca,
0
jeśli nie ma rozwiązania.Przykład użycia:
10 # [1,5,7,3,7,3,6,3,2,6,3]
->2
.Znajdź wszystkie podlisty listy wejściowej,
l
które mają sumęn
. Weź długość każdej takiej podlisty i sortuj. Dołącz a0
i weź pierwszy element.Jeśli lista Singleton jest dozwolone na wyjściu, np
[2]
, możemy zaoszczędzić 7 bajtów:n#l=minimum[length x|x<-subsequences l,sum x==n]
. W przypadku braku rozwiązania[]
zwracana jest pusta lista .źródło