สร้างโปรแกรมเพื่อวิเคราะห์ตัวเลือกลำดับการพลิกเหรียญ


15

ในจิ๊กซอว์ในหนังสือเก่าของฉันเกมมีคำจำกัดความว่าผู้เล่นสองคนเลือกลำดับของการโยนเหรียญที่พวกเขาเชื่อว่าจะปรากฏก่อนเมื่อเหรียญถูกพลิกซ้ำ ๆ (จริง ๆ แล้วมันแปลกและแม้แต่ลูกเต๋าทอย แต่รายละเอียดเล็ก ๆ น้อย ๆ นี้ไม่สำคัญในเรื่องของการเทียบเคียงปัญหา)

มันเป็นข้อสังเกตว่าถ้าผู้เล่นเลือก 1 TTTและผู้เล่น 2 เลือกHTTผู้เล่นที่ 2 มีโอกาสชนะ 7/8 เกมเพราะวิธีเดียวที่TTTจะเกิดขึ้นมาก่อนHTTคือถ้าทั้งสามคนแรกพลิกเป็นหาง

งานของคุณคือการสร้างโปรแกรมหรือฟังก์ชั่นที่จะอนุมานความน่าจะเป็นที่หนึ่งในสองลำดับที่เลือกมาก่อน โปรแกรมของคุณจะรับอินพุตสองบรรทัด (หรือสองสตริงเป็นอาร์กิวเมนต์) แต่ละอันแทนลำดับความยาว 10 หรือน้อยกว่า:

HTT
TTT

และแสดงความน่าจะเป็นที่ผู้เล่นคนแรกจะชนะในรูปแบบเศษส่วนหรือทศนิยม:

7/8
0.875

รหัสที่สั้นที่สุดในการทำเช่นนี้ในภาษาใด ๆ ที่ชนะ


6
ลำดับนั้นมักมีความยาวเท่ากันหรือไม่?
Uri Granta

1
@UriZarfaty ไม่ไม่จำเป็น
Joe Z.

แม้ว่าลำดับจะต้องแตกต่างกันอย่างชัดเจน (เนื่องจากเอาต์พุตไม่สามารถระบุการผูก)
Uri Granta

ใช่ลำดับต้องชัดเจน
Joe Z.

โดยเฉพาะอย่างยิ่งหนึ่งไม่สามารถเป็นสายอักขระย่อยของอื่น ๆ
Joe Z.

คำตอบ:


4

Python 3 (139 136 134 132 126 115 143)

ใช้อัลกอริทึมของคอนเวย์ตามที่อธิบายไว้ที่นี่ จัดการคู่ลำดับทั้งหมดตราบใดที่คู่แรกไม่ใช่การยุติลำดับที่สอง (ตามคำแนะนำ)

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
Jakube

1
กอล์ฟดี! ฉันชอบเคล็ดลับการโต้เถียงเริ่มต้น เคล็ดลับสองข้อ (ยังไม่ทดลอง): คุณสามารถคูณด้วย2**iด้วย<<iและความน่าจะเป็นผลลัพธ์สามารถเขียนเป็น1/(1/o + 1)ซึ่งคุณสามารถใส่ส่วนกลับซึ่งกันและกันoได้โดยตรง
xnor

ขอบคุณ Good spot re o / (1 + o) ค่อนข้างอายที่จะพลาด <<!
Uri Granta

@Jakube ขออภัยไม่ได้แสดงความคิดเห็นของคุณ! เวอร์ชันปัจจุบันใช้งานได้ดีสำหรับฉันด้วย "HTT" และ "TTT"
Uri Granta

1
นี่เป็นคำตอบที่ไม่ใช่ศูนย์HTHและTแม้ว่าผู้เล่นคนแรกจะไม่สามารถชนะได้ คำตอบอื่นมีปัญหาเดียวกัน
Zgarb

3

CJam, 44 38 36 bytes

ใช้เดียวกันของคอนเวย์อัลกอริทึมในขณะที่ที่นี่

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

อินพุตเป็นสองลำดับที่แตกต่างกันในสองบรรทัด ผลลัพธ์คือความน่าจะเป็นในการชนะครั้งแรกในรอบที่สอง อินพุตไม่จำเป็นต้องมีความยาวเท่ากัน

ฉันใช้สูตรสำหรับการชนะเดิมพัน ( p) สำหรับผู้เล่นคนแรก A เป็น

ป้อนคำอธิบายรูปภาพที่นี่

จากนั้นความน่าจะเป็นถูกกำหนดให้เป็น

ป้อนคำอธิบายรูปภาพที่นี่

ซึ่งหลังจากลดความซับซ้อนจะกลายเป็น

ป้อนคำอธิบายรูปภาพที่นี่

และหลังจากการทำให้เข้าใจง่ายบางอย่างจะกลายเป็น

ป้อนคำอธิบายรูปภาพที่นี่


อินพุตตัวอย่าง:

HTT
TTT

เอาท์พุท:

0.875

ลองออนไลน์ได้ที่นี่


โจพูดในความคิดเห็น (หลังจากโพสต์สิ่งนี้) ว่าสตริงไม่จำเป็นต้องมีความยาวเท่ากัน ยัง +1 เพราะฉันไม่เข้าใจ CJam
mdc32

@ mdc32 แก้ไขแล้ว 1 ไบต์นานขึ้นในขณะนี้ :(
เครื่องมือเพิ่มประสิทธิภาพ

คุณให้ฉันเชื่อว่าตอนนี้ codegolfSE รองรับ LaTeX ... = (
ข้อผิดพลาด

@flawr ฮ่า ๆ ขออภัยเกี่ยวกับที่ :( เหล่านี้เป็น PNGs จากบรรณาธิการ LaTeX ออนไลน์
เครื่องมือเพิ่มประสิทธิภาพ

นี่เป็นคำตอบที่ไม่ใช่ศูนย์HTHและTแม้ว่าผู้เล่นคนแรกจะไม่สามารถชนะได้ คำตอบอื่นมีปัญหาเดียวกัน
Zgarb

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

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

รุ่นแรก

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.