モンティホール問題の実行


11

モンティホール問題のシミュレーションについてはすでに質問があります。これは違います。ユーザーがします遊ぶモンティ・ホール問題を。プログラムがホストの役割を果たします。モンティボット、あなたが好きなら。

手順は次のとおりです。

  1. 3つのドアのどれが賞品を隠すかを(ランダムに)選択します。
  2. 3つのドアの視覚表示を出力します。簡単ABCにできます。または3つの正方形。または何でも。
  3. ドアの1つを選択する入力を受け取ります。これは、選択したドアをマウスでクリックするか、1文字の入力(B)などです。
  4. 別のドアを開きます。選択したドアを開けません。メインプライズを隠すドアを開けないでください。それはありますが、選択肢がないわけか、それはありますが、2の選択肢を持っていることを意味します。2つの選択肢がある場合は、ランダムに1つ選んでください。ドアが開かれ、その背後に賞品が隠されていないことを視覚的に示します。プログラムのテキストベースの入力/出力の場合、これはoutputのように単純でAB0、ドアCが開かれたことを示します。もっと独創的になってください。GUIプログラムを実行している場合、表示の選択はユーザー次第です。
  5. ユーザーからの入力を受け入れます。ユーザーは、入力するstickかswitch(または、GUIプログラムの場合はボタンをクリックするか、選択入力を使用するなど)できます。利用者は以外を入力した場合stickやswitch、実装が定義されていません。好きなことをしてください。
  6. テキストYou won!またはを出力しますYou lost。
  7. プログラムを終了します。

ルール:

  1. ランダムに何かを選択する必要がある場合、暗号のランダム性について心配しないでください。どのrand()機能でも実行できます。
  2. プログラムはチートしてはなりません。賞品はゲーム開始前に設定されている必要があります。つまり、手順は指定された順序で実行する必要があるということです。まず、背後にある賞品を隠すドアを選択し、次にプレイヤーに選択を求めます。ステップ4で開くドアの選択は、ステップ4で行う必要があります。事前に選択されていません。
  3. ステップ6の出力は正直でなければなりません。
  4. これはコードゴルフです。最短のコードが優先されます。

初めてこのサイトに投稿しますが、私はたくさん潜んでいますので、私はあなたの規範に精通していると思います。
— TRIG

meta.codegolf.stackexchange.comには、質問を提案し、公式に投稿する前に問題を解決するためのスレッドがあります。ここで具体的に間違っているものがあるかどうかはわかりませんが、それが解決された可能性がありますが、次回のために知っておくと良いかもしれません。
— 地下

私は勝者がちょうど別のgolfscriptの答え...になることをプレビューしています
— ビクターStafusa

1
ところで、「独創的であること」は、コードゴルフとうまくいきません。なぜなら、独創的であることはいくつかのバイトを消費し、コードゴルフの目的はこれの反対だからです。
— ビクターStafusa 14

ええ、@ Victor。独創的であることは要件ではありません。私は(a)これをコマンドラインプログラムに限定したくありませんでした。(b)非コマンドラインプログラムがユーザー選択をどのように実装するべきかを知りませんでした。それで、私はそれを回答者に任せました。独創的であることはオプションですが、それは余分なポイントを獲得しないものです。
— TRiG 14

回答:


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! 

ラブリー!しかし≠、ソース=には説明に変異があると思う。
— TRiG 14

おかげで、それはタイプミスで、投稿する前に修正した最後のバグです。
— トビア14

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文字ドアを表すために1桁の素数を選択することにより、ホストに可能な選択肢やプレーヤーのドアスワップを把握するためにドアを一致させる必要がある場合、実際の比較演算子の代わりに短いモジュロ演算子を使用できます。(ここで簡単に説明します。)
  • -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 14

ちなみに、入力が「スティック」または「スイッチ」以外の場合、プログラムは終了するはずだと元々言っていましたが、投稿する前に気が変わりました。
— TRIG

@TRiGそれをありがとう。実装するのは難しいことではありませんでしたが、少し肥大化していたでしょう。
— イッツィ14

とにかく、さまざまなトリック(w検出、または文字のカウント)がもっと楽しいです。
— TRiG 14

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()を2回呼び出し、遅延を保証するための間にプロンプ​​トを表示します。ユーザー入力は0から始まるインデックスです(ルールは「何でも」と言いました)。次のアラートは、どのドアが開かれたかを示しています。以下は、ユーザーが選ぶ前に答えを出し、チートしないことを確認するための少し長いバージョンです。

(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それは役に立ちます。ここで三項演算子を使用することは考えていませんでした。ただし、乱数は独立している必要があるため、Date.now()を渡すことはできません。ただし、Date.nowを渡すことはできます。
— aebabis 14

@acbabis "I can't pass Date.now() ... I can, however, pass Date.now"???
— ティムテック14

@Timtechはdate.now、関数を渡しdate.now()、関数の結果を渡す
— デイブ

@daveああ、わかった。ありがとう:)
— ティムテック14

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!
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.