Costruisci un programma per analizzare le scelte della sequenza di lancio delle monete


15

In un puzzle in un mio vecchio libro, viene definito un gioco in cui due giocatori scelgono sequenze di lanci di monete che credono appaiano per prime quando una moneta viene ripetutamente lanciata. (In realtà era un tiro di dadi dispari e persino, ma questo piccolo dettaglio non importa in termini di equivalenza del problema.)

Si noti che se il giocatore 1 sceglie TTTe il giocatore 2 sceglie HTT, quel giocatore 2 ha una probabilità di 7/8 di vincere la partita, poiché l'unico modoTTT può venire prima HTTè se i primi tre lanci sono tutti code.

Il tuo compito è creare un programma o una funzione che deduca la probabilità che una delle due sequenze scelte venga prima. Il tuo programma prenderà due righe di input (o due stringhe come argomenti), ognuna delle quali rappresenta una sequenza di lunghezza 10 o inferiore:

HTT
TTT

E genera la probabilità che il primo giocatore vincerà, in forma di frazione o decimale:

7/8
0.875

Il codice più breve per farlo in qualsiasi lingua vince.


6
Le sequenze sono sempre della stessa lunghezza l'una dell'altra?
Uri Granta,

1
@UriZarfaty No, non necessariamente.
Joe Z.

Sebbene presumibilmente le sequenze debbano essere distinte (poiché l'output non può specificare un pareggio).
Uri Granta,

Sì, le sequenze devono essere distinte.
Joe Z.

Più specificamente, uno non può essere una sottostringa terminale dell'altro.
Joe Z.

Risposte:


4

Python 3 (139 136 134 132 126 115 143)

Utilizza l'algoritmo di Conway come descritto qui . Gestisce tutte le coppie di sequenze purché la prima non sia una sottosequenza finale della seconda (come da istruzioni).

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]

Grazie xnor per la rasatura di 6 byte. Grazie Zgarb per aver individuato un bug con sottosequenze.


La versione attuale non funziona per me. Per l'input "HTT"e "TTT", oha il valore -1e lo divide per 0.
Jakube,

1
Bel golf! Mi piace il trucco dell'argomento predefinito. Un paio di suggerimenti (non testata): si può moltiplicare per 2**icon <<i, e la probabilità di uscita può essere scritta come 1/(1/o + 1), in cui è possibile inserire il reciproco odirettamente.
xnor

Grazie. Buono spot re / / (1 + o). Un po 'imbarazzato di aver perso <<!
Uri Granta,

@Jakube Siamo spiacenti, non hai notato il tuo commento! La versione attuale funziona bene con "HTT" e "TTT".
Uri Granta,

1
Questo dà una risposta diversa da zero HTHe T, anche se il primo giocatore non può vincere. L'altra risposta ha lo stesso problema.
Zgarb,

3

CJam, 44 38 36 byte

Usando lo stesso algoritmo di Conway come qui .

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

L'input è le due sequenze distinte in due righe. L'output è la probabilità di vincere per prima sul secondo. Gli ingressi non devono avere le stesse lunghezze

Sto usando la formula per vincere quote ( p) per il primo giocatore A come

inserisci qui la descrizione dell'immagine

Quindi la probabilità è definita come

inserisci qui la descrizione dell'immagine

che, dopo la semplificazione, diventa

inserisci qui la descrizione dell'immagine

e dopo qualche semplificazione, diventa

inserisci qui la descrizione dell'immagine


Esempio di input:

HTT
TTT

Produzione:

0.875

Provalo online qui


Joe ha detto nei commenti (dopo che questo è stato pubblicato) che le stringhe non sono necessariamente della stessa lunghezza. Tuttavia, +1 perché non capisco CJam.
mdc32,

@ mdc32 riparato, 1 byte più lungo ora :(
Ottimizzatore

Mi hai già fatto credere che codegolfSE ora supporti LaTeX ... = (
flawr

@flawr HAHA. Mi dispiace per questo :(. Questi sono PNG dall'editor online di LaTeX.
Ottimizzatore

Questo dà una risposta diversa da zero HTHe T, anche se il primo giocatore non può vincere. L'altra risposta ha lo stesso problema.
Zgarb,

0

Lua 211 190 184

Anche usando l'algoritmo di Conway. Ancora nuovo per Lua, quindi questo può sicuramente essere giocato a golf di più.

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())));

Ungolfed

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())));

Prima versione

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()));
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.