Buat program untuk menganalisis pilihan urutan flip koin

15

Dalam sebuah teka-teki di buku lama saya, sebuah permainan didefinisikan di mana dua pemain memilih urutan membalik koin yang mereka yakini akan muncul pertama kali ketika koin berulang kali dibalik. (Itu sebenarnya aneh dan bahkan gulungan dadu, tapi detail kecil ini tidak masalah dalam hal kesetaraan masalah.)

Perlu dicatat bahwa jika pemain 1 memilih TTTdan pemain 2 memilih HTT, pemain 2 memiliki peluang 7/8 untuk memenangkan permainan, karena satu-satunya cara TTTbisa datang sebelumnya HTTadalah jika tiga flip pertama semuanya ekor.

Tugas Anda adalah membuat program atau fungsi yang akan menyimpulkan probabilitas bahwa satu dari dua urutan yang dipilih akan didahulukan. Program Anda akan mengambil dua baris input (atau dua string sebagai argumen), masing-masing mewakili urutan panjang 10 atau kurang:

HTT
TTT

Dan hasilkan probabilitas bahwa pemain pertama akan menang, dalam bentuk pecahan atau desimal:

7/8
0.875

Kode terpendek untuk melakukan ini dalam bahasa apa pun menang.

Joe Z.
sumber
6
Apakah urutannya selalu sama panjang satu sama lain?
Uri Granta
1
@ UriZarfaty Tidak, belum tentu.
Joe Z.
Meskipun mungkin urutannya harus berbeda (karena output tidak dapat menentukan dasi).
Uri Granta
Ya, urutannya harus berbeda.
Joe Z.
Lebih khusus, satu tidak bisa menjadi substring terminal yang lain.
Joe Z.

Jawaban:

4

Python 3 (139 136 134 132 126 115 143)

Menggunakan Algoritma Conway seperti yang dijelaskan di sini . Menangani semua pasangan urutan selama yang pertama bukan merupakan pengakhiran dari urutan kedua (sesuai instruksi).

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]

Terima kasih xnor untuk mencukur 6 byte. Terima kasih Zgarb karena menemukan bug dengan yang berikutnya.

Uri Granta
sumber
Versi saat ini tidak berfungsi untuk saya. Untuk input "HTT"dan "TTT", omemiliki nilai -1dan membaginya dengan 0.
Jakube
1
Golf yang bagus! Saya suka trik argumen default. Beberapa tips (belum teruji): Anda dapat mengalikan 2**idengan <<i, dan probabilitas keluaran dapat ditulis sebagai 1/(1/o + 1), di mana Anda dapat menempatkan kebalikan osecara langsung.
xnor
Terima kasih. Tempat yang bagus re (/ 1 + o). Agak malu ketinggalan <<!
Uri Granta
@ Jakube Maaf, tidak menemukan komentar Anda! Versi saat ini berfungsi dengan baik untuk saya dengan "HTT" dan "TTT".
Uri Granta
1
Ini memberikan jawaban bukan nol untuk HTHdan T, meskipun pemain pertama tidak bisa menang. Jawaban lainnya memiliki masalah yang sama.
Zgarb
3

CJam, 44 38 36 byte

Menggunakan Algoritma Conway yang sama seperti di sini .

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

Input adalah dua urutan berbeda dalam dua baris. Outputnya adalah probabilitas menang pertama dari yang kedua. Input tidak harus memiliki panjang yang sama

Saya menggunakan rumus untuk menang odds ( p) untuk pemain pertama A sebagai

masukkan deskripsi gambar di sini

Maka probabilitas didefinisikan sebagai

masukkan deskripsi gambar di sini

yang, setelah disederhanakan menjadi

masukkan deskripsi gambar di sini

dan setelah penyederhanaan, menjadi

masukkan deskripsi gambar di sini


Input contoh:

HTT
TTT

Keluaran:

0.875

Cobalah online di sini

Pengoptimal
sumber
Joe mengatakan dalam komentar (setelah ini diposting) bahwa senarnya tidak harus sama panjang. Tetap saja, +1 karena saya tidak mengerti CJam.
mdc32
@ mdc32 diperbaiki, 1 byte lebih lama sekarang :(
Pengoptimal
Anda sudah membiarkan saya percaya bahwa codegolfSE sekarang mendukung LaTeX ... = (
flawr
@ flawr HAHA. Maaf tentang itu :(. Ini adalah PNG dari editor LaTeX online.
Pengoptimal
Ini memberikan jawaban bukan nol untuk HTHdan T, meskipun pemain pertama tidak bisa menang. Jawaban lainnya memiliki masalah yang sama.
Zgarb
0

Lua 211 190 184

Juga menggunakan Conway's Algorithm. Masih baru bagi Lua sehingga ini bisa dipastikan lebih banyak 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())));

Tidak disatukan

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

Versi pertama

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
sumber