몬티 홀 문제를 실행


11

Monty Hall Problem 시뮬레이션 에 대한 질문이 이미있었습니다 . 이것은 다릅니다. 사용자는 것입니다 재생 몬티 홀 문제. 귀하의 프로그램은 호스트의 역할을합니다. 몬티 봇, 원한다면

단계는 다음과 같습니다.

  1. 세 문 중 어느 것이 상을 숨기는지를 선택하십시오.
  2. 3 개의 문을 시각적으로 표시합니다. 간단한 ABC것입니다. 또는 세 개의 사각형. 또는 무엇이든.
  3. 문 중 하나를 선택하여 입력을받습니다. 선택한 문을 마우스로 클릭하거나 문자 입력 ( B) 등을 할 수 있습니다 .
  4. 다른 문을여십시오. 선택한 문을 열지 않습니다. 주요 상품을 숨기고있는 문을 열지 마십시오. 즉 수 있습니다 당신은 선택의 여지가 의미, 또는 수 있습니다 당신은 두 가지 선택의 여지가 있음을 의미한다. 둘 중 하나를 선택할 수 있다면 무작위로 하나를 선택하십시오. 문이 열렸고 그 뒤에 숨겨진 상이 없음을 시각적으로 나타냅니다. 프로그램 텍스트 기반 입력 / 출력의 경우, AB0C이 열렸 음을 표시하기 위해 출력하는 것만 큼 간단 할 수 있습니다 . 더 창의력을 발휘하십시오. GUI 프로그램을 사용하는 경우 디스플레이 선택은 전적으로 귀하에게 달려 있습니다.
  5. 사용자의 입력을 수락하십시오. 사용자는 입력 stick하거나 switchGUI 프로그램의 경우 버튼을 클릭하거나 선택 입력 등을 사용할 수 있습니다. 사용자가 stick또는 이외의 다른 것을 입력 switch하면 구현이 정의되지 않습니다. 너가 원하는 것을해라.
  6. 텍스트 You won!또는을 출력하십시오 You lost.
  7. 프로그램을 종료하십시오.

규칙 :

  1. 무작위로 무언가를 선택해야 할 때 암호화 무작위성에 대해 걱정하지 마십시오. 모든 rand()기능이 가능합니다.
  2. 프로그램은 속이지 않아야합니다. 게임이 시작되기 전에 상이 있어야합니다. 즉, 단계는 주어진 순서대로 수행되어야합니다. 먼저 상을 숨길 문 을 선택한 다음 플레이어에게 선택하도록 요청하십시오. 4 단계에서 어떤 문을 열지 선택하는 것은 4 단계에서 이루어져야합니다. 미리 선택되어 있지 않습니다.
  3. 6 단계의 출력은 정직해야합니다.
  4. 이것은 코드 골프입니다. 가장 짧은 코드가 승리합니다.

나는이 사이트에 처음으로 게시하지만 많이 숨어 있기 때문에 나는 당신의 규범에 익숙 하다고 생각 합니다.
TRiG

meta.codegolf.stackexchange.com에는 질문을 제안하고 사람들이 공식적으로 게시되기 전에 문제를 해결할 수있는 스레드가 있습니다. 다림질 될 수있는 여기에 특별히 잘못된 것이 있는지 모르겠지만 다음 번에 알아 두는 것이 좋습니다.
undergroundmonorail

나는 승자가 또 다른 golfscript 대답은 ... 될 것이라고 미리보기입니다
빅터 Stafusa

1
BTW, "창조적"은 코드 골프와 잘 맞지 않습니다. 발명 적이라는 것은 약간의 바이트를 소비하고 코드 골프의 목적은 이와 반대이기 때문입니다.
Victor Stafusa

예, @ 빅터 독창적 인 것은 필수 요건이 아닙니다. 나는 단지 (a) 이것을 명령 줄 프로그램으로 제한하고 싶지 않았으며, (b) 비 명령 줄 프로그램이 어떻게 사용자 선택을 구현해야하는지 전혀 몰랐다. 그래서 나는 그것을 응답자에게 맡겼습니다. 독창적 인 것은 선택 사항이지만 추가 포인트를 얻지 못하는 옵션입니다.
TRiG

답변:


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

감사합니다. 오타였습니다. 게시하기 전에 마지막으로 수정 한 버그입니다.
Tobia

2

파이썬, 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 문에서 win / loss 응답을 교환하면 거기에서 모듈로 트릭을 사용할 수있었습니다.

골프 코드

$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

덧붙여서, 나는 원래 입력이 "stick"또는 "switch"이외의 것이면 프로그램을 종료해야한다고 말했지만 게시하기 전에 마음이 바뀌었다.
TRiG

@TRiG 감사합니다. 구현하기 힘들지는 않았지만 약간의 부풀어 오른 부분이 추가되었습니다.
Iszi

어쨌든 다양한 속임수 (w 감지 또는 문자 수 계산 )가 더 재미 있습니다.
TRiG

0

자바 스크립트, 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

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

@Timtech date.now는 함수를 전달하고 함수 date.now()의 결과를 전달합니다
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!
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.