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.
Odpowiedzi:
Galaretka , 8 bajtów
Wypróbuj online! lub sprawdź rozkład dla N = 7 .
tło
Niech n będzie liczbą par; są 2 pojedyncze skarpety.
Do pierwszego losowania są 2n skarpetek, a 0 z nich dałoby pasującą parę. Dlatego prawdopodobieństwo sukcesu wynosi 0 / 2n = 0 .
Ponieważ pierwsze losowanie się nie powiodło, na stosie znajdują się 2n - 1 skarpet, a 1 z nich dałoby pasującą parę. Dlatego prawdopodobieństwo sukcesu wynosi 1 / (2n - 1) .
Jeśli drugie losowanie się nie powiedzie, na stosie znajdują się 2n - 2 skarpetki, a 2 z nich dają pasującą parę. Dlatego prawdopodobieństwo sukcesu wynosi 2 / (2n - 2) .
Ogólnie rzecz biorąc, jeśli pierwsze k losowanie zakończyło się niepowodzeniem, na stosie znajdują się skarpety 2n - k, a 2 z nich dałyby pasującą parę. Dlatego prawdopodobieństwo sukcesu wynosi k / (2n - k) .
Wreszcie, jeśli żadne z pierwszych n losowań nie zakończyło się sukcesem, na stosie znajdują się skarpety 2n-k i wszystkie z nich dałyby pasującą parę. Dlatego prawdopodobieństwo sukcesu wynosi n / (2n - n) = 1 .
Jak to działa
źródło
Galaretka, 8 bajtów
Wypróbuj online!
Aby to sprawdzić, oto wersja, która wyświetla zarówno pożądane dane wyjściowe, jak i wynik operacji „losowej listy” (aby zobaczyć, w jakiej kolejności zostały pobrane skarpety).
źródło
Python, 66 bajtów
Dennis wymyślił sprytny sposób na zmianę układu, oszczędzając 5 bajtów.
źródło
MATL ,
1615 bajtówWypróbuj online! Lub obserwuj rozkład empiryczny dla 1000 próbek w przypadku N = 7 (zajmuje to chwilę).
To bezpośrednio generuje zmienną losową reprezentującą wynik na podstawie jego rozkładu prawdopodobieństwa. Niech N będzie liczbą par skarpet i niech p ( k ) oznacza prawdopodobieństwo, że k -te losowanie zakończy się powodzeniem, pod warunkiem, że k -1 losowanie nie zakończyło się powodzeniem. Następnie (patrz również tutaj ):
Tak więc kod iteruje maksymalnie N losowań +1. Przy k-tym losowaniu generowana jest zmienna losowa, która jest równa 1 z prawdopodobieństwem ( k -1) / (2 * N - k ) lub 0 w przeciwnym razie. Ilekroć zmienna losowa jest równa 1 (losowanie się powiodło), proces zatrzymuje się, a bieżące k jest wyprowadzane.
źródło
MATL ,
1413 bajtówWypróbuj online! Lub obserwuj rozkład empiryczny dla 4000 próbek w przypadku N = 7 (zajmuje to trochę czasu).
źródło
JavaScript,
7773 bajtówWyjaśnienie
źródło
f=(n)=>
jen=>
(lub dwie, jeśli chcesz zachować zadanie, niektóre zachowaj , inne usuń ).CJam, 17 bajtów
Sprawdź to tutaj.
źródło
Python 3,
142105104 bajtówDzięki Eʀɪᴋ ᴛʜᴇ Gᴏʟғᴇʀ za oszczędność jednego bajtu!
Moja pierwsza odpowiedź:
Moja nowa odpowiedź:
Oba wychodzą z
NameError
włączonyms
.źródło
R, 49
Jestem pewien, że musi istnieć lepszy sposób na zrobienie tego w R! Próbowałem zrobić coś mądrzejszego, ale to nie zadziałało.
Edycja: Ulepszony przez @bouncyball, ponieważ nie musi to być funkcja.
źródło
function(N)
? użycieN=scan();
zaoszczędziłoby 2 bajtyPython 2, 101 bajtów
źródło
VBA, 61 bajtów
- modeluje prawdopodobieństwo przesunięcia dopasowania skarpety przy podanym wcześniej braku dopasowania. W punkcie oceny K jest „skarpetkami w ręku”, więc liczba losowań jest jeszcze jedna.
źródło
Pyth, 14 bajtów
Wyjaśnienie:
źródło