Créer un programme pour analyser les choix de séquence de retournement de pièces

15

Dans un puzzle dans un vieux livre à moi, un jeu est défini dans lequel deux joueurs choisissent des séquences de lancers de pièces qui, selon eux, apparaîtront en premier lorsqu'une pièce est retournée à plusieurs reprises. (C'était en fait des lancers de dés impairs et pairs, mais ce petit détail n'a pas d'importance en termes d'équivalence de problème.)

Il est à noter que si le joueur 1 choisit TTTet que le joueur 2 choisit HTT, ce joueur 2 a 7/8 chances de gagner la partie, car la seule façon de TTTvenir avant HTTest que les trois premiers flips soient tous des queues.

Votre travail consiste à créer un programme ou une fonction qui déduira la probabilité qu'une des deux séquences choisies vienne en premier. Votre programme prendra deux lignes d'entrée (ou deux chaînes comme arguments), chacune représentant une séquence de longueur 10 ou moins:

HTT
TTT

Et affichez la probabilité que le premier joueur gagne, sous forme fractionnaire ou décimale:

7/8
0.875

Le code le plus court pour le faire dans n'importe quelle langue gagne.

Joe Z.
la source
6
Les séquences sont-elles toujours de la même longueur?
Uri Granta
1
@UriZarfaty Non, pas nécessairement.
Joe Z.
Bien que les séquences doivent probablement être distinctes (car la sortie ne peut pas spécifier de lien).
Uri Granta
Oui, les séquences doivent être distinctes.
Joe Z.
Plus précisément, l'un ne peut pas être une sous-chaîne terminale de l'autre.
Joe Z.

Réponses:

4

Python 3 (139 136 134 132 126 115 143)

Utilise l'algorithme de Conway comme décrit à ici . Gère toutes les paires de séquences tant que la première n'est pas une sous-séquence de terminaison de la seconde (selon les instructions).

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]

Merci xnor d'avoir rasé 6 octets. Merci Zgarb d'avoir repéré un bogue avec des sous-séquences.

Uri Granta
la source
La version actuelle ne fonctionne pas pour moi. Pour l'entrée "HTT"et "TTT", oa la valeur -1et il la divise par 0.
Jakube
1
Beau golf! J'aime l'astuce d'argument par défaut. Quelques conseils (non testés): vous pouvez multiplier par 2**iavec <<i, et la probabilité de sortie peut être écrite comme 1/(1/o + 1), dans laquelle vous pouvez mettre odirectement l'inverse de .
xnor
Merci. Bon endroit pour o / (1 + o). Un peu gêné d'avoir raté <<!
Uri Granta
@Jakube Désolé, vous n'avez pas repéré votre commentaire! La version actuelle fonctionne bien pour moi avec "HTT" et "TTT".
Uri Granta
1
Cela donne une réponse non nulle pour HTHet T, même si le premier joueur ne peut pas gagner. L'autre réponse a le même problème.
Zgarb
3

CJam, 44 38 36 octets

En utilisant le même algorithme de Conway qu'ici .

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

L'entrée correspond aux deux séquences distinctes sur deux lignes. La sortie est la probabilité de gagner le premier sur le second. Les entrées n'ont pas besoin d'être de la même longueur

J'utilise la formule pour gagner les cotes ( p) pour le premier joueur A comme

entrez la description de l'image ici

Ensuite, la probabilité est définie comme

entrez la description de l'image ici

qui, après simplification, devient

entrez la description de l'image ici

et après une certaine simplification, devient

entrez la description de l'image ici


Exemple d'entrée:

HTT
TTT

Production:

0.875

Essayez-le en ligne ici

Optimiseur
la source
Joe a déclaré dans les commentaires (après que cela a été publié) que les cordes ne sont pas nécessairement de la même longueur. Pourtant, +1 parce que je ne comprends pas CJam.
mdc32
@ mdc32 fixe, 1 octet de plus maintenant :(
Optimizer
Vous m'avez déjà fait croire que codegolfSE prend désormais en charge LaTeX ... = (
flawr
@flawr HAHA. Désolé à ce sujet :(. Ce sont des fichiers PNG de l'éditeur en ligne LaTeX.
Optimizer
Cela donne une réponse non nulle pour HTHet T, même si le premier joueur ne peut pas gagner. L'autre réponse a le même problème.
Zgarb
0

Lua 211 190 184

Utilisant également l'algorithme de Conway. Encore nouveau à Lua, donc cela peut être joué plus à coup sûr.

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

Non golfé

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

Première version

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()));
Teun Pronk
la source