Zbuduj program do analizy wyborów sekwencji rzutów monetą


15

W łamigłówce ze starej mojej książki zdefiniowana jest gra, w której dwóch graczy wybiera sekwencje rzutów monetą, które według nich pojawią się jako pierwsze, gdy moneta zostanie wielokrotnie odwrócona. (To było rzeczywiście dziwne, a nawet rzuty kostką, ale ten mały szczegół nie ma znaczenia pod względem równoważności problemu.)

Należy zauważyć, że jeśli gracz 1 wybierze, TTTa gracz 2 wybierze HTT, ten gracz 2 ma szansę wygranej 7/8, ponieważ jedyną możliwą drogą TTTmoże być HTTto, że wszystkie trzy pierwsze rzuty są remisem.

Twoim zadaniem jest stworzenie programu lub funkcji, która wydedukuje prawdopodobieństwo, że jedna z dwóch wybranych sekwencji pojawi się pierwsza. Twój program pobierze dwa wiersze danych wejściowych (lub dwa ciągi jako argumenty), z których każdy reprezentuje sekwencję o długości 10 lub mniejszej:

HTT
TTT

Podaj prawdopodobieństwo, że pierwszy gracz wygra, w postaci ułamkowej lub dziesiętnej:

7/8
0.875

Wygrywa najkrótszy kod do wykonania tego w dowolnym języku.


6
Czy sekwencje są zawsze tej samej długości?
— Uri Granta,

1
@UriZarfaty Nie, niekoniecznie.
— Joe Z.

Chociaż przypuszczalnie sekwencje muszą być odrębne (ponieważ dane wyjściowe nie mogą określać remisu).
— Uri Granta,

Tak, sekwencje muszą być odrębne.
— Joe Z.

Mówiąc dokładniej, jeden nie może być terminalnym podciągiem drugiego.
— Joe Z.

Odpowiedzi:


4

Python 3 (139 136 134 132 126 115 143)

Używa algorytmu Conwaya, jak opisano tutaj . Obsługuje wszystkie pary sekwencji, o ile pierwsza nie jest końcowym podsekwencją drugiej (zgodnie z instrukcjami).

def f(a,b):c=lambda x,y=a:sum((x[~i:]==y[:i+1])<<i for i in range(len(x)));return 0 if b in a else(1/(1+(c(a)-c(a,b))/(c(b,b)-c(b))),1)[a in b]

Dzięki xnor za zgolenie 6 bajtów. Dzięki Zgarb za wykrycie błędu z podsekwencjami.


Obecna wersja nie działa dla mnie. Dla wejścia "HTT"i "TTT", oma wartość -1i dzieli go 0.
— Jakube,

1
Niezły golf! Podoba mi się domyślna sztuczka z argumentami. Kilka (nietestowane) Wskazówki: można pomnożyć przez 2**isię <<i, a prawdopodobieństwo wyjścia może być zapisana jako 1/(1/o + 1), w którym można umieścić Odwrotność obezpośrednio.
— xnor

Dzięki. Good spot re o / (1 + o). Nieco zawstydzony brakiem <<!
— Uri Granta

@Jakube Przepraszamy, nie zauważyłem komentarza! Obecna wersja działa dla mnie dobrze z „HTT” i „TTT”.
— Uri Granta,

1
Daje to niezerową odpowiedź na HTHi T, mimo że pierwszy gracz nie może wygrać. Druga odpowiedź ma ten sam problem.
— Zgarb

3

CJam, 44 38 36 bajtów

Korzystanie z tego samego algorytmu Conwaya, jak tutaj .

ll]_m*{~1$,,@f>\f{\#!}2b}/\-:X--Xd\/

Dane wejściowe to dwie odrębne sekwencje w dwóch wierszach. Dane wyjściowe to prawdopodobieństwo pierwszego wygrania w drugim. Wejścia nie muszą być tej samej długości

Używam wzoru na wygraną po kursie ( p) dla pierwszego gracza A as

wprowadź opis zdjęcia tutaj

Następnie prawdopodobieństwo definiuje się jako

wprowadź opis zdjęcia tutaj

który po uproszczeniu staje się

wprowadź opis zdjęcia tutaj

i po pewnym uproszczeniu staje się

wprowadź opis zdjęcia tutaj


Przykładowe dane wejściowe:

HTT
TTT

Wynik:

0.875

Wypróbuj online tutaj


Joe powiedział w komentarzach (po tym, jak to zostało opublikowane), że ciągi niekoniecznie mają taką samą długość. Mimo to +1, ponieważ nie rozumiem CJam.
— mdc32,

@ mdc32 naprawiony, teraz 1 bajt dłużej :(
— Optymalizator

Już mi wierzysz, że codegolfSE obsługuje teraz LaTeX ... = (
— flawr

@flawr HAHA. Przepraszam za to :(. Są to pliki PNG z internetowego edytora LaTeX.
— Optimizer

Daje to niezerową odpowiedź na HTHi T, mimo że pierwszy gracz nie może wygrać. Druga odpowiedź ma ten sam problem.
— Zgarb

0

Lua 211 190 184

Również używając algorytmu Conwaya. To wciąż nowość w Lua, więc na pewno można w nią grać w golfa.

z=io.read;e=function(s,t)r='';for d in s:gmatch"."do r=r..(d==t:sub(1,1)and 1 or 0);end;return tonumber(r,2);end;a=z();b=z();print((e(a,a)-e(a,b))/(e(b,b)-e(b,a))/(1/((1/2)^b:len())));

Nie golfił

z=io.read;
e=function(s,t)
r='';
    for d in s:gmatch"."do 
        r=r..(d==t:sub(1,1)and 1 or 0);
    end;
    return tonumber(r,2);
end;
a=z();
b=z();
print((e(a,a)-e(a,b))/(e(b,b)-e(b,a))/(1/((1/2)^b:len())));

Pierwsza wersja

z=io.read;
e=function(s,t) 
    r=0;
    for d in s:gmatch"."do 
        r=r*10;
        if d==t:sub(1,1)then r=r+1 end;
    end
    return tonumber(r,2);
end;
f=function(n,o)
    return ((e(n,n)-e(n,o))/(e(o,o)-e(o,n)))/(1/((1/2)^3));
end;
print(f(z(),z()));
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.