建立一个程序来分析硬币翻转顺序选择


15

在我的一本老书中的一个谜题中,定义了一个游戏,其中两个玩家选择掷硬币的顺序,他们认为当硬币被反复掷硬币时,硬币掷序列会首先出现。(实际上掷骰子是奇数,甚至是掷骰子,但是就问题对等而言,这个小细节并不重要。)

注意,如果玩家1选择,TTT而玩家2选择HTT,则该玩家2赢得游戏的机会为7/8,因为唯一的方法TTT可能HTT是前三局都是尾巴。

您的工作是创建一个程序或函数,以推断出两个选定序列之一首先出现的可能性。您的程序将接受两行输入(或两个字符串作为参数),每行代表长度为10或更短的序列:

HTT
TTT

并以小数或小数形式输出第一个玩家获胜的概率:

7/8
0.875

以任何语言执行此操作的最短代码都会胜出。


6
序列是否总是彼此相同的长度?
乌里·格兰塔

1
@UriZarfaty不,不一定。
Joe Z. 2015年

尽管大概顺序必须是不同的(因为输出不能指定平局)。
乌里·格兰塔

是的,顺序必须是不同的。
Joe Z.

更具体地说,一个不能是另一个的终端子串。
Joe Z. 2015年

Answers:


4

Python 3(139 136 134 132 126 115 143)

使用此处介绍的Conway算法。只要第一个不是第二个的终止子序列,就处理所有序列对(按照指令)。

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]

感谢xnor节省了6个字节。感谢Zgarb发现带有子序列的错误。


当前版本不适用于我。对于输入"HTT""TTT"o具有值-1,并将其除以0
雅库布2015年

1
高尔夫不错!我喜欢默认的参数技巧。一对夫妇的(未经测试)提示:您可以乘2**i<<i,并输出概率可以写成1/(1/o + 1),可以在其中放置的倒数o直接。
xnor 2015年

谢谢。好点re o /(1 + o)。有点尴尬地错过了<<!
乌里·格兰塔

@Jakube对不起,没有发现您的评论!当前版本对我来说可以通过“ HTT”和“ TTT”正常运行。
乌里·格兰塔

1
即使第一个玩家无法获胜,这也会为HTH和给出非零的答案T。另一个答案有相同的问题。
Zgarb 2015年

3

CJam,44 38 36字节

使用与此处相同的Conway算法。

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

输入是两行中的两个不同序列。输出是第一名胜第二名的概率。输入的长度不必相同

我正在使用公式p为第一名玩家A 赢得赔率()

在此处输入图片说明

然后将概率定义为

在此处输入图片说明

经过简化后变成

在此处输入图片说明

经过简化后,变成

在此处输入图片说明


输入示例:

HTT
TTT

输出:

0.875

在这里在线尝试


Joe在发表评论后说(字符串发布后),字符串的长度不一定相同。还是+1,因为我不了解CJam。
mdc32

@ mdc32已修复,现在增加1个字节:(
优化器

您已经让我相信codegolfSE现在支持LaTeX ... =(
缺陷

@flawr哈哈。。很抱歉,:(这是从网上LaTeX的编辑PNG图像。
优化

即使第一个玩家无法获胜,这也会为HTH和给出非零的答案T。另一个答案有相同的问题。
Zgarb 2015年

0

Lua的211 190 184

还使用Conway的算法。对Lua来说仍然是新手,因此可以肯定地打更多。

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

不打高尔夫球

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

第一版

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()));
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.