Jest to dość złożony, ale bardzo interesujący przedmiot matematyczny (znany jako „problem kryjący” ),
I chciałbym, żebyś pomógł w jego wdrożeniu.
Wyobraź sobie grę loteryjną, w której każdy los musi wybrać 5 liczb losowych z zestawu 50 liczb (od 1 do 50).
Dość łatwo jest poznać prawdopodobieństwo wygranego biletu lub prawdopodobieństwo posiadania 1, 2, 3 lub 4 dobrych liczb.
Bardzo łatwo jest również „wygenerować” wszystkie bilety, które mają 1, 2, 3, 4 dobre liczby.
Moje pytanie (i wyzwanie kodu) jest z tym związane, ale nieco inne:
Chcę kupić losy na loterię (możliwie najmniej), np. Przynajmniej jeden z moich losów ma 3 dobre numery.
Wyzwanie
Twoim celem jest wdrożenie ogólnego rozwiązania (jako programu lub po prostu funkcji), takiego jak to, w dowolnym języku:
// Input: 3 prameters
min_lottery_tickets(total_numbers_to_choose_from, how_many_numbers_to_choose, how_many_good_numbers_i_want)
W powyższym przykładzie wystarczy zadzwonić:
min_lottery_tickets(50, 5, 3)
a program wygeneruje najmniejszy zestaw biletów do gry, aby osiągnąć ten cel.
Przykład:
min_lottery_tickets(10, 5, 2)
wyświetli 7 biletów, takich jak te:
1 2 3 4 5
5 6 7 8 9
10 1 2 6 7
10 3 4 8 9
3 4 6 7 8
1 2 3 8 9
1 4 9 5 10
ponieważ takie bilety wystarczą na pokrycie dowolnej pary liczb od 1 do 10.
Wynik
Tekst, jeden wiersz na bilet, tabulacje lub spacje między liczbami
kto wygrywa
Najbardziej wydajny program wygrywa (tzn. Program generujący najmniej biletów dla powyższych parametrów):
min_lottery_tickets(50, 5, 3)
Dzięki!
Odpowiedzi:
Wiem, że to nie jest optymalne , ale oto kod w node.js:
Niektóre przykładowe wyniki:
inny:
inny:
źródło
min_lottery_tickets(10, 5, 2)
generuje znacznie więcej rozwiązań niż OP.