Chạy vấn đề Monty Hall


11

Đã có một câu hỏi về việc mô phỏng vấn đề Monty Hall . Cái này thì khác. Người dùng sẽ chơi Bài toán Monty Hall. Chương trình của bạn sẽ đóng vai trò của chủ nhà. Montybot, nếu bạn thích.

Dưới đây là các bước:

  1. Chọn (ngẫu nhiên) trong số ba cửa ẩn giải thưởng.
  2. Xuất ra một màn hình hiển thị của ba cửa. Một đơn giản ABCsẽ làm. Hoặc ba hình vuông. Hay bất cứ cái gì.
  3. Nhận đầu vào chọn một trong các cửa. Đây có thể là một cú click chuột vào cánh cửa đã chọn, hoặc một chữ cái đầu vào ( B) hoặc bất cứ thứ gì.
  4. Mở một cánh cửa khác. Bạn không mở cánh cửa đã chọn. Bạn không mở cửa ẩn giải thưởng chính. Điều đó nghĩa là bạn không có lựa chọn, hoặc có thể có nghĩa là bạn có hai lựa chọn. Nếu bạn có hai lựa chọn, hãy chọn một cách ngẫu nhiên. Trực quan chỉ ra rằng cánh cửa đã được mở và không có giải thưởng nào được giấu đằng sau nó. Đối với đầu vào / đầu ra dựa trên văn bản chương trình, điều này có thể đơn giản như xuất ra AB0, để cho thấy rằng cánh cửa Cđã được mở. Hãy thoải mái để sáng tạo hơn. Nếu bạn đang làm một chương trình GUI, sự lựa chọn hiển thị của bạn là tùy thuộc vào bạn.
  5. Chấp nhận đầu vào từ người dùng. Người dùng có thể nhập stickhoặc switch(hoặc, đối với chương trình GUI, nhấp vào nút hoặc sử dụng đầu vào được chọn hoặc bất cứ thứ gì). Nếu người dùng nhập bất cứ thứ gì khác ngoài stickhoặc switch, việc triển khai không được xác định. Làm bất cứ điều gì bạn muốn.
  6. Xuất văn bản You won!hoặc You lost.
  7. Chấm dứt progam.

Quy tắc:

  1. Khi bạn phải chọn một cái gì đó một cách ngẫu nhiên , đừng lo lắng về tính ngẫu nhiên của tiền điện tử. Bất kỳ rand()chức năng sẽ làm.
  2. Chương trình không được gian lận. Giải thưởng phải được đưa ra trước khi trò chơi bắt đầu. Điều đó có nghĩa là các bước phải được thực hiện theo thứ tự được đưa ra: Đầu tiên hãy chọn một cánh cửa phía sau để ẩn giải thưởng của bạn, sau đó yêu cầu người chơi chọn. Lựa chọn mở cửa ở bước 4 phải xảy ra ở bước 4: không được chọn trước.
  3. Đầu ra ở bước 6 phải trung thực.
  4. Đây là mã golf. Mã ngắn nhất sẽ thắng.

Lần đầu tiên tôi đăng bài trên trang này, nhưng tôi ẩn giấu rất nhiều, vì vậy tôi nghĩ rằng tôi quen thuộc với các quy tắc của bạn.
TRiG

Trên meta.codegolf.stackexchange.com có ​​một chủ đề để đề xuất câu hỏi và cho phép mọi người giải quyết bất kỳ vấn đề nào với nó trước khi nó được đăng chính thức. Tôi không biết nếu có bất cứ điều gì đặc biệt sai ở đây có thể được giải quyết, nhưng có lẽ sẽ tốt khi biết lần sau.
undergroundmonorail

Tôi đang xem trước rằng người chiến thắng sẽ chỉ là một câu trả lời golf khác ...
Victor Stafusa

1
BTW, "sáng tạo" không phù hợp với codegolfing, vì việc sáng tạo tiêu tốn một số byte và mục tiêu của codegolfing là ngược lại với điều này.
Victor Stafusa

Vâng, @Victor. Sáng tạo không phải là một yêu cầu. Tôi chỉ (a) không muốn giới hạn điều này với các chương trình dòng lệnh và (b) không biết làm thế nào một chương trình dòng lệnh không nên thực hiện lựa chọn người dùng. Vì vậy, tôi để nó cho người trả lời. Sáng tạo là một lựa chọn, nhưng đó là một lựa chọn sẽ không có thêm điểm.
TRiG

Câu trả lời:


2

APL, 77

p←?3⋄d[e[?⍴e←(⍳3)~p,c←⍞⍳⍨⎕←d←3↑⎕A]]←'_'⋄⎕←d⋄⎕←'You','lost' 'won!'[(c=p)=5=⍴⍞]

Nhu cầu ⎕IO←0. Đã thử nghiệm trên Dyalog.

Giải trình

p←?3                       ⍝ p(rize) is a random number between 1 and 3
⎕←d←3↑⎕A                   ⍝ d(oors) is the string 'ABC'; output it
c←d⍳⍞                      ⍝ ask for one of the letters; c(hoice) is its position
o←e[?⍴e←(⍳3)~p,c]          ⍝ o(pen) is a random position except for p and c
d[o]←'_'                   ⍝ replace the o position in the d string with a '_'
⎕←d                        ⍝ output the modified d string
w←(c=p)=5=⍴⍞               ⍝ get choice, if it's stick (5 chars) and c=p, or neither, (w)in 
⎕←'You','lost' 'won!'[w]   ⍝ print the result

Ví dụ

      p←?3⋄d[e[?⍴e←(⍳3)~p,c←⍞⍳⍨⎕←d←3↑⎕A]]←'_'⋄⎕←d⋄⎕←'You','lost' 'won!'[(c=p)=5=⍴⍞]
ABC
A
AB_
stick
You lost 
      p←?3⋄d[e[?⍴e←(⍳3)~p,c←⍞⍳⍨⎕←d←3↑⎕A]]←'_'⋄⎕←d⋄⎕←'You','lost' 'won!'[(c=p)=5=⍴⍞]
ABC
A
AB_
stick
You won! 

Đáng yêu! Nhưng tôi nghĩ rằng có một nguồn trong đó đột biến thành một =trong lời giải thích.
TRiG

Cảm ơn, đó là một lỗi đánh máy, lỗi cuối cùng tôi đã sửa trước khi đăng.
Tobia

2

Con trăn, 157

from random import*
C=choice
I=raw_input
p='\n> '
a='ABC'
g=C(a)
i=I(a+p)
print'You '+'lwoosnt!'[(i==g)^('w'in I(a.replace(C(list(set(a)-{g,i})),'_')+p))::2]

Thí dụ:

$ python monty.py
ABC
> A
AB_
> switch
You won!

2

PowerShell: 192 174

Thay đổi từ bản gốc:

  • -8 Ký tự Vì màn hình hiển thị trực quan của các cửa có thể là "bất cứ thứ gì" Tôi nhận ra rằng tôi có thể lưu một số ký tự (đặc biệt là dấu nháy đơn để xác định chuỗi) bằng cách sử dụng số thay vì chữ cái.
  • -8 Ký tự Bằng cách chọn cụ thể một chữ số, số nguyên tố để biểu thị các cửa, tôi có thể sử dụng toán tử modulo ngắn hơn thay cho toán tử so sánh thực tế khi tôi cần ghép các cửa để tìm ra các lựa chọn có thể của máy chủ hoặc hoán đổi cửa của người chơi. ( Giải thích ngắn gọn ở đây. )
  • -2 Ký tự Hoán đổi các phản hồi thắng / thua trong câu lệnh if / other cho phép tôi sử dụng thủ thuật modulo ở đó.

Mã Golf

$w=($d=3,5,7)|random;357;$p=read-host;-join$d-replace($h=$d|?{$_%$w-and$_%$p}|random),0;if((read-host)-match'w'){$p=$d|?{$_%$p-and$_%$h}}if($p%$w){'You lost'}else{'You won!'}

Mã không đánh gôn với ý kiến

# Set up an array of doors ($d), and choose one to be the winner ($w).
$w=($d=3,5,7)|random;

# Show doors.
357;

# Get input and save player's choice ($p).
$p=read-host;

# Join the doors into one string, replacing the host's choice ($h) with a zero, and display them again.
-join$d-replace
(
    # Host will randomly choose a door from those which are not evenly divisible by $w or $p.
    $h=$d|?{$_%$w-and$_%$p}|random
 ),0;

# Get input from player. If it contains a 'w', switch doors.
# While this is generally a sloppy way to distinguish 'switch' from 'stick', it is allowed by the rules.
# "If the user enters anything other than stick or switch, the implementation is undefined. Do whatever you want."
if((read-host)-match'w')
{
    # Player will switch doors to one which is not evenly divisible by the $h or the original $p.
    $p=$d|?{$_%$p-and$_%$h}
}

# Announce the result.
# If $p is not evenly divisible by $w, player has lost. Otherwise, they have won.
if($p%$w){'You lost'}else{'You won!'}

# Variables cleanup - not included in golfed code.
rv w,d,p,h

Tôi thích nếu nó chứa một mẹo 'w' .
TRiG

Ngẫu nhiên, ban đầu tôi nói rằng nếu đầu vào là bất cứ thứ gì khác ngoài "stick" hoặc "switch", chương trình sẽ chấm dứt, nhưng tôi đã thay đổi quyết định trước khi đăng.
TRiG

@TRiG Cảm ơn vì điều đó. Mặc dù nó sẽ không khó để thực hiện, nhưng nó sẽ có thêm một chút phình to.
Iszi

Và các thủ thuật khác nhau (phát hiện w của bạn, hoặc đếm các ký tự ) dù sao cũng vui hơn.
TRiG

0

Javascript, 221 197

(function(q,r,s,t,u,v){f='ABC';d=[0,1,2];b=q()%3;a=r(f);d.splice(a,1);(a==b)?(r(f[d[q()%2]])==t)?s(u):s(v):(r(f[d[(d[0]==b)+0]])!=t)?s(u):s(v)})(Date.now,prompt,alert,'stick','You won!','You lost')

Nó sử dụng hai cuộc gọi đến Date.now () cho sự ngẫu nhiên với một dấu nhắc ở giữa để đảm bảo độ trễ. Đầu vào của người dùng là một chỉ mục dựa trên 0 (quy tắc đã nói "bất cứ điều gì"). Cảnh báo sau cho biết cửa nào đã được mở. Đây là phiên bản dài hơn một chút để đưa ra câu trả lời trước khi người dùng chọn, để xác minh rằng nó không gian lận:

(function(q,r,s,t,u,v){f='ABC';d=[0,1,2];b=q()%3;s('ans:'+b);a=r(f);d.splice(a,1);(a==b)?(r(f[d[q()%2]])==t)?s(u):s(v):(r(f[d[(d[0]==b)+0]])!=t)?s(u):s(v)})(Date.now,prompt,alert,'stick','You won!','You lost')

Câu đố: http://jsfiddle.net/acbabis/9J2kP/

EDIT: Cảm ơn đã


Bạn có thể rút ngắn nó xuống còn 197: (function(q,r,s,t,u,v){f='ABC';d=[0,1,2];b=q%3;a=r(f);d.splice(a,1);(a==b)?((r(f[d[q%2]])==t)?s(u):s(v)):(r(f[d[(d[0]==b)+0]])!=t)?s(u):s(v)})(Date.now(),prompt,alert,'stick','You won!','You lost')
dave

@dave Điều đó hữu ích. Tôi không nghĩ sẽ sử dụng toán tử ternary ở đây. Tuy nhiên, tôi không thể vượt qua Date.now () vì các số ngẫu nhiên cần phải độc lập. Tôi có thể, tuy nhiên, vượt qua Date.now.
aebabis

@acbabis "I can't pass Date.now() ... I can, however, pass Date.now"???
Timtech

@Timtech date.nowvượt qua chức năng, date.now()vượt qua kết quả của chức năng
dave

@dave ơi, tôi hiểu rồi. Cảm ơn :)
Timtech 17/214

0

PHP> = 5,4, 195 192

$r=[0,1,2];unset($r[$p=rand(0,2)]);$d='012';echo"$d\n";fscanf(STDIN,"%d",$c);unset($r[$c]);$d[array_rand($r)]='_';echo"$d\n",!fscanf(STDIN,"%s",$s),'You '.($s=='switch'^$c==$p?'won!':'lost.');

Đầu ra:

012
1
01_
stick
You won!
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.