コインフリップシーケンスの選択を分析するプログラムを作成する


15

私の古い本のパズルでは、2人のプレーヤーがコインを繰り返し弾いたときに最初に現れると信じているコインフリップのシーケンスを選択するゲームが定義されています。(実際にはサイコロと奇数のサイコロが振られましたが、この小さな詳細は問題の等価性の観点では重要ではありません。)

なお、プレイヤー1を選択した場合TTT、プレイヤー2を選択したがHTT、そのプレイヤー2が唯一の方法であるため、試合に勝つの7/8のチャンスがあるTTT前に来ることができますが、HTT最初の3つのフリップは、すべてのテールがある場合です。

あなたの仕事は、2つの選択されたシーケンスのうちの1つが最初に来る確率を推定するプログラムまたは関数を作成することです。プログラムは2行の入力(または引数として2つの文字列)を取り、それぞれが長さ10以下のシーケンスを表します。

HTT
TTT

そして、最初のプレイヤーが勝つ確率を小数または小数形式で出力します:

7/8
0.875

どの言語でもこれを行う最短のコードが優先されます。


6
シーケンスの長さは常に同じですか?
ウリグランタ

1
@UriZarfatyいいえ、必ずしもそうではありません。
ジョーZ.

おそらく、シーケンスは明確である必要があります(出力で同点を指定できないため)。
ウリグランタ

はい、シーケンスは明確でなければなりません。
ジョーZ.

より具体的には、一方を他方の終端部分文字列にすることはできません。
ジョーZ.

回答:


4

Python 3(139 136 134 132 126 115 143)

ここで説明されている Conwayのアルゴリズムを使用します。最初のシーケンスが2番目のサブシーケンスの終了サブシーケンスでない限り、すべてのシーケンスペアを処理します(指示どおり)。

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
ジャクベ

1
素敵なゴルフ!デフォルトの引数トリックが好きです。(未テスト)のヒントのカップル:あなたが掛けることができます2**i<<i、出力確率は、のように書くことができ1/(1/o + 1)ますがの逆数置くことができるそこに、o直接に。
-xnor

ありがとう。o /(1 + o)の良いスポット。<<を逃したことが少し恥ずかしいです!
ウリグランタ

@ジャクベ申し訳ありませんが、コメントを見つけられませんでした!現在のバージョンは、「HTT」と「TTT」でうまく動作します。
ウリグランタ

1
これにより、最初のプレイヤーが勝てない場合でも、HTHとに対してゼロ以外の答えが返されますT。他の答えにも同じ問題があります。
ズガルブ

3

CJam、44 38 36バイト

ここと同じConwayのアルゴリズムを使用します

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

入力は、2行の2つの異なるシーケンスです。出力は、最初に2番目に勝つ確率です。入力は同じ長さである必要はありません

私はp最初のプレイヤーAのオッズ()を勝ち取るための公式を次のように使用しています。

ここに画像の説明を入力してください

次に、確率は次のように定義されます

ここに画像の説明を入力してください

これは、単純化した後

ここに画像の説明を入力してください

いくつかの単純化の後、

ここに画像の説明を入力してください


入力例:

HTT
TTT

出力:

0.875

こちらからオンラインでお試しください


ジョーは(これが投稿された後)コメントで、文字列は必ずしも同じ長さではないと言った。それでも、CJamが理解できないので+1。
mdc32

@ mdc32修正、1バイト長くなりました:(
オプティマイザー

codegolfSEがLaTeXをサポートするようになったと既に信じさせていただきました... =(
flawr

@flawr HAHA。それについて申し訳ありません:(。これらはオンラインLaTeXエディターからのPNGです。–
オプティマイザー

これにより、最初のプレイヤーが勝てない場合でも、HTHとに対してゼロ以外の答えが返されますT。他の答えにも同じ問題があります。
ズガルブ

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()));
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.