O serii
Po pierwsze, możesz potraktować to jak każde inne wyzwanie związane z golfem i odpowiedzieć na nie, nie martwiąc się serią. Istnieje jednak tabela wyników dla wszystkich wyzwań. Możesz znaleźć tabelę liderów wraz z kilkoma więcej informacji o serii w pierwszym poście .
Chociaż mam szereg pomysłów w szeregu, przyszłe wyzwania nie są jeszcze ustalone. Jeśli masz jakieś sugestie, daj mi znać w odpowiednim poście z piaskownicą .
Dziura 3: partycje całkowite
Czas trochę zwiększyć trudność.
Partycja o dodatnia n
jest zdefiniowany jako MultiSet liczb całkowitych, które sumują się do pozytywnych n
. Na przykład, jeśli n = 5
istnieją następujące partycje:
{1,1,1,1,1}
{2,1,1,1}
{2,2,1}
{3,1,1}
{3,2}
{4,1}
{5}
Należy pamiętać, że są to multisets, więc nie ma celu nich {3,1,1}
, {1,3,1}
i {1,1,3}
są uważane za identyczne.
Twoim zadaniem jest n
wygenerowanie losowej partycji n
. Oto szczegółowe zasady:
Rozkład produkowanych przegród musi być jednolity . Oznacza to, że w powyższym przykładzie każda partycja powinna zostać zwrócona z prawdopodobieństwem 1/7.
Oczywiście, ze względu na ograniczenia techniczne PRNG, idealna jednolitość będzie niemożliwa. W celu oceny jednolitości przesłanych danych następujące operacje zostaną uznane za zapewniające idealnie jednolite rozkłady:
- Uzyskiwanie numeru z PRNG (w dowolnym zakresie), który jest udokumentowany jako (w przybliżeniu) jednolity.
- Mapowanie równomiernego rozkładu większego zbioru liczb na mniejszy zbiór poprzez modulo lub mnożenie (lub inną operację, która równomiernie rozprowadza wartości). Większy zestaw musi zawierać co najmniej 1024 razy więcej możliwych wartości niż mniejszy zestaw.
Ponieważ partycje są wielosektorowe, możesz zwracać je w dowolnej kolejności, a ta kolejność nie musi być spójna. Jednak dla celów losowego rozkładu kolejność jest ignorowana. Oznacza to, że w powyższym przykładzie
{3,1,1}
,{1,3,1}
a{1,1,3}
razem muszą mieć prawdopodobieństwo 1/7 zwracane.- Twój algorytm musi mieć deterministyczne środowisko wykonawcze. W szczególności nie można generować losowych multiset i odrzucać ich, jeśli się nie sumują
n
. - Złożoność czasowa algorytmu musi być wielomianowa
n
. W szczególności nie można po prostu wygenerować wszystkich partycji i wybrać losowej (ponieważ liczba partycji rośnie wykładniczon
). Możesz założyć, że używany PRNG może zwracać równomiernie rozłożone wartości w O (1) na wartość. - Nie wolno używać żadnej wbudowanej funkcji, która rozwiązuje to zadanie.
Możesz napisać pełny program lub funkcję i pobrać dane wejściowe za pomocą STDIN lub najbliższej alternatywy, argumentu wiersza poleceń lub argumentu funkcji i wygenerować wynik poprzez wartość zwracaną lub drukując do STDOUT (lub najbliższej alternatywy).
Możesz założyć, że n ≤ 65
(tak, że liczba partycji jest mniejsza niż 2 21 ). Dane wyjściowe mogą być w dowolnym dogodnym, jednoznacznym formacie listy lub ciągu.
Jeśli przesyłasz funkcję, zastanów się nad zapewnieniem małego programu testowego, który wywołuje tę funkcję wiele razy i drukuje wyniki. Nie ma potrzeby modyfikowania parametrów w kodzie. Ma to na celu sprawdzenie, czy rozwiązanie jest w przybliżeniu jednolite.
To jest kod golfowy, więc wygrywa najkrótsze przesłanie (w bajtach). I oczywiście najkrótsze zgłoszenie na użytkownika wejdzie również do ogólnej tabeli liderów serii.
Tabela liderów
Pierwszy post z serii generuje tabelę wyników.
Aby upewnić się, że Twoje odpowiedzi się pojawią, zacznij każdą odpowiedź od nagłówka, używając następującego szablonu Markdown:
# Language Name, N bytes
gdzie N
jest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:
# Ruby, <s>104</s> <s>101</s> 96 bytes
(Język nie jest obecnie wyświetlany, ale fragment go wymaga i analizuje, a w przyszłości mogę dodać tabelę wyników według języków).