tło
Mam kolekcję „skarpet w dni powszednie”, czyli siedem par skarpet oznaczonych dniami tygodnia. Kiedy myję skarpetki, kończą się w kupie i muszę je ułożyć w odpowiednie pary, zanim włożę je do szafy. Moją strategią jest wyciąganie jednej losowej skarpety ze stosu i wkładanie jej do szuflady. Ilekroć w szufladzie znajduje się pasująca para skarpet, wiążę je ze sobą i wkładam do szafy. Twoim zadaniem jest symulacja tego losowego procesu i zwrócenie liczby losowań wymaganych do znalezienia pierwszej pasującej pary.
Wejście
Twoje dane wejściowe to liczba całkowita N ≥ 1 . Reprezentuje „liczbę dni w tygodniu”: na stosie znajduje się N par skarpet, a każda para ma inną etykietę. W razie potrzeby możesz również wziąć ziarno PRNG jako dane wejściowe.
Wynik
Twój wynik to liczba skarpet, które muszę narysować, zanim zostanie znaleziona pierwsza pasująca para. Na przykład, jeśli pierwsze dwie skarpety już tworzą pasującą parę, wynikiem jest 2
.
Oczywiście dane wyjściowe są losowe i zależą od kolejności rysowania. Zakładamy, że wszystkie zamówienia na rysowanie są jednakowo prawdopodobne , więc za każdym razem, gdy zostanie wyciągnięta skarpeta, wybór jest jednolity i niezależny od wszystkich innych wyborów.
Przykład
Niech N = 3 , abyśmy mieli w sumie 6 skarpet oznaczonych AABBCC . Jeden z możliwych przebiegów „protokołu rysowania skarpet” jest następujący:
| Pile | Drawer | Pairs
Begin | AABBCC | - | -
Draw B | AABCC | B | -
Draw C | AABC | BC | -
Draw B | AAC | C | BB
Draw A | AC | AC | BB
Draw A | C | C | AA BB
Draw C | - | - | AA BB CC
Pierwsza pasująca para została znaleziona po narysowaniu drugiej B , która była trzecią skarpetą do narysowania, więc prawidłowe wyjście to 3
.
Zasady i punktacja
Możesz napisać pełny program lub funkcję. Wygrywa najniższa liczba bajtów, a standardowe luki są niedozwolone. Dane wejściowe i wyjściowe mogą mieć dowolny rozsądny format, w tym jednoargumentowy (ciąg znaków 1
).
Możesz założyć, że wbudowana w Twój język RNG jest idealna. Nie musisz tak naprawdę symulować protokołu rysowania skarpet, o ile twoje wyniki mają prawidłowy rozkład prawdopodobieństwa.
"Przypadki testowe"
Oto przybliżone prawdopodobieństwo wszystkich wyjść dla wejścia N = 7 :
Output 2 3 4 5 6 7 8
Probability 0.077 0.154 0.210 0.224 0.186 0.112 0.037
Aby przetestować swoje rozwiązanie, możesz uruchomić je, powiedzmy, 40 000 razy i sprawdzić, czy rozkład wyjściowy jest dość zbliżony do tego.
Draw all socks. End up with an odd number.