运行蒙蒂·霍尔问题


11

关于模拟Monty Hall问题已经存在一个问题。这是不同的。该用户播放的蒙提霍尔问题。您的程序将扮演主机的角色。Montybot,如果您愿意。

步骤如下:

  1. (随机)选择三个门中的哪个隐藏奖品。
  2. 输出三个门的视觉显示。一个简单的ABC会做。或三个方块。管他呢。
  3. 接收选择其中一扇门的输入。这可以是在所选门上单击鼠标,单个字母输入(B)或其他方式。
  4. 打开另一扇门。您没有打开所选的门。您不会打开隐藏主要奖金的门。那可能意味着您别无选择,或者可能意味着您有两个选择。如果您选择两个,则随机选择一个。直观地表明门已经打开,并且没有任何奖金藏在门后。对于基于程序文本的输入/输出,这可能与output一样简单AB0,以显示门C已打开。随时更具创造力。如果您正在执行GUI程序,则显示选择取决于您。
  5. 接受来自用户的输入。用户可以输入stickswitch(或对于GUI程序,单击按钮,或使用选择输入,或其他)。如果用户输入的不是stickswitch,则实现未定义。做你想做的。
  6. 输出文本You won!You lost
  7. 终止程序。

规则:

  1. 当您必须随机选择某物,不必担心密码随机性。任何rand()功能都可以。
  2. 该程序不得作弊。奖品必须在比赛开始前就位。也就是说,必须按照给定的顺序执行这些步骤:首先选择一扇门,在后面隐藏您的奖金,然后请玩家选择。必须在步骤4中选择在步骤4中打开哪扇门:事先未选择。
  3. 步骤6中的输出必须诚实。
  4. 这是代码高尔夫。最短的代码获胜。

我第一次在这个网站上发帖,但我潜伏了很多,所以我我对您的规范很熟悉。
TRiG 2014年

在meta.codegolf.stackexchange.com上,有一个线程可以提出问题,并让人们在正式发布之前解决所有问题。我不知道这里是否有什么特别的问题可以解决,但是下次知道可能会很好。
undergroundmonorail

我正在预告赢家将只是高尔夫球的另一个答案……
Victor Stafusa 2014年

1
顺便说一句,“有创造力”与代码高尔夫并不能很好地进行,因为有创造力会消耗一些字节,而代码高尔夫的目的与此相反。
Victor Stafusa 2014年

是的,@ Victor。不需要发明。我只是(a)不想将其限制为命令行程序,并且(b)不知道非命令行程序应如何实现用户选择。所以我把它留给了答题者。有创造力是一种选择,但这是没有任何额外要点的。
TRiG 2014年

Answers:


2

APL,77

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

需要⎕IO←0。在Dyalog上测试。

说明

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

例子

      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! 

可爱!但是我认为源中有一个=在解释中会变成a 。
TRiG 2014年

谢谢,这是一个错字,这是我发布之前修复的最后一个错误。
Tobia 2014年

2

Python,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]

例:

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

2

PowerShell的:192 174

与原始版本的不同:

  • -8个字符由于门的视觉显示可以是“任意”,所以我意识到我可以使用数字而不是字母来保存一些字符(特别是定义字符串所需的撇号)。
  • -8个字符通过专门选择一位数,质数来表示门,当我需要匹配门以找出主机的可能选择或玩家的门交换时,可以使用较短的模运算符代替实际的比较运算符。(这里简要说明。
  • -2个字符在最后的if / else语句中交换赢/输响应,使我也可以使用模数技巧。

高尔夫球码

$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!'}

带有注释的非公开代码

# 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

我喜欢如果它包含一个“ w”把戏。
TRiG 2014年

顺便说一句,我最初说的是,如果输入不是“ stick”或“ switch”以外的任何内容,则该程序应终止,但是我在发布之前改变了主意。
TRiG 2014年

@TRiG谢谢你。尽管实现起来并非难事,但它会增加一些膨胀。
Iszi 2014年

无论如何,各种技巧(您的w检测或计数字符)都更加有趣。
TRiG 2014年

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')

它使用两次对Date.now()的调用来实现随机性,并在两者之间进行提示以确保延迟。用户输入是从0开始的索引(规则确实说“ whatever”)。以下警报提示打开了哪扇门。这是一个稍长的版本,可以在用户选择之前给出答案,以验证它不会作弊:

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

小提琴:http : //jsfiddle.net/acbabis/9J2kP/

编辑:谢谢戴夫


您可以将其缩短为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很有帮助。我不认为在这里使用三元运算符。但是,我无法传递Date.now(),因为随机数需要独立。但是,我可以通过Date.now。
aebabis 2014年

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

@Timtech date.now通过函数,date.now()通过函数结果
dave

@dave哦,明白了。谢谢:)
Timtech

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.');

输出:

012
1
01_
stick
You won!
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.