Bozuk para çevirme sırası seçeneklerini analiz etmek için bir program oluşturun


15

Eski bir kitabımdaki bir bulmacada, iki oyuncunun bir bozuk para tekrar tekrar çevrildiğinde ilk görüneceğine inandıkları bozuk para dizilerini seçtiği bir oyun tanımlanır. (Aslında tuhaftı ve hatta zar attı, ama bu küçük detay problem denkliği açısından önemli değil.)

Oyuncu 1'i seçer TTTve oyuncu 2'yi seçerse HTT, oyuncu 2'nin oyunu kazanma şansı 7 / 8'dir, çünkü TTTdaha önce gelebilecek tek yol HTT, ilk üç döndürmenin hepsinin kuyruk olması.

İşiniz, seçilen iki diziden birinin önce gelme olasılığını ortaya çıkaracak bir program veya işlev oluşturmaktır. Programınız, her biri 10 veya daha kısa uzunluktaki bir diziyi temsil eden iki girdi satırı (veya bağımsız değişken olarak iki dize) alır:

HTT
TTT

Ve ilk oyuncunun kazanma olasılığını kesir veya ondalık formda çıktılayın:

7/8
0.875

Herhangi bir dilde bunu yapmak için en kısa kod kazanır.


6
Diziler her zaman birbiriyle aynı uzunlukta midir?
Uri Granta

1
@UriZarfaty Hayır, ille de değil.
Joe Z.

Her ne kadar muhtemelen diziler farklı olmalıdır (çünkü çıktı bir kravat belirleyemez).
Uri Granta

Evet, diziler farklı olmalıdır.
Joe Z.

Daha spesifik olarak, biri diğerinin terminal alt dizesi olamaz.
Joe Z.

Yanıtlar:


4

Python 3 (139 136 134 132 126 115 143)

Conway Algoritmasını burada açıklandığı gibi kullanır . Birincisi, ikincisinin sonlandırıcı bir dizisi olmadığı sürece tüm talimat çiftlerini işler (talimatlara göre).

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]

6 bayt kapalı tıraş için xnor teşekkürler. Alt dizileri olan bir hata tespit ettiğiniz için teşekkürler Zgarb.


Geçerli sürüm benim için çalışmıyor. Girdi için "HTT"ve "TTT", odeğerine sahiptir -1ve onu böler 0.
Jakube

1
Güzel golf! Varsayılan argüman hilesini seviyorum. Birkaç (denenmemiş) ipucu: 2**iile çarpabilirsiniz <<ive çıktı olasılığı 1/(1/o + 1), odoğrudan karşılıklı olarak koyabileceğiniz şekilde yazılabilir .
xnor

Teşekkürler. İyi nokta yeniden o / (1 + o). Biraz kaçırmış olmaktan biraz utanmış <<!
Uri Granta

@ Jakube Üzgünüm, yorumunuzu fark etmediniz! Geçerli sürüm benim için "HTT" ve "TTT" ile iyi çalışıyor.
Uri Granta

1
Bu bir sıfırdan farklı cevap verir HTHve Tilk oyuncu kazanamaz halde. Diğer cevap da aynı soruna sahip.
Zgarb

3

CJam, 44 38 36 bayt

Buradaki Conway Algoritmasını kullanarak .

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

Giriş, iki satırdaki iki ayrı dizidir. Çıktı, ilk saniyenin ikincisi kazanma olasılığıdır. Girişlerin aynı uzunluklarda olması gerekmez

pİlk oyuncu A için oranlar ( ) kazanmak için formülü kullanıyorum.

resim açıklamasını buraya girin

Sonra olasılık şu şekilde tanımlanır:

resim açıklamasını buraya girin

basitleştirdikten sonra

resim açıklamasını buraya girin

ve basitleştirmeden sonra,

resim açıklamasını buraya girin


Örnek girdi:

HTT
TTT

Çıktı:

0.875

Buradan çevrimiçi deneyin


Joe yorumlarda (bu yayınlandıktan sonra) dizelerin mutlaka aynı uzunlukta olmadığını söyledi. Yine de +1 çünkü CJam'ı anlamıyorum.
mdc32

@ mdc32 düzeltildi, 1 bayt daha uzun :(
Doktor

CodegolfSE'in artık LaTeX'i desteklediğine inanmama izin veriyorsunuz ... = (
flawr

@flawr HAHA. Üzgünüm :(. Bunlar çevrimiçi LaTeX editöründen PNG'ler.
Optimizer

Bu bir sıfırdan farklı cevap verir HTHve Tilk oyuncu kazanamaz halde. Diğer cevap da aynı soruna sahip.
Zgarb

0

Lua 211 190 184

Ayrıca Conway Algoritmasını kullanarak. Yine de Lua için yeni, bu emin daha golf olabilir.

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

İlk versiyon

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()));
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.