몬티 홀 문제를 실행


11

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

단계는 다음과 같습니다.

  1. 세 문 중 어느 것이 상을 숨기는지를 선택하십시오.
  2. 3 개의 문을 시각적으로 표시합니다. 간단한 ABC것입니다. 또는 세 개의 사각형. 또는 무엇이든.
  3. 문 중 하나를 선택하여 입력을받습니다. 선택한 문을 마우스로 클릭하거나 문자 입력 ( B) 등을 할 수 있습니다 .
  4. 다른 문을여십시오. 선택한 문을 열지 않습니다. 주요 상품을 숨기고있는 문을 열지 마십시오. 즉 수 있습니다 당신은 선택의 여지가 의미, 또는 수 있습니다 당신은 두 가지 선택의 여지가 있음을 의미한다. 둘 중 하나를 선택할 수 있다면 무작위로 하나를 선택하십시오. 문이 열렸고 그 뒤에 숨겨진 상이 없음을 시각적으로 나타냅니다. 프로그램 텍스트 기반 입력 / 출력의 경우, AB0문 C이 열렸 음을 표시하기 위해 출력하는 것만 큼 간단 할 수 있습니다 . 더 창의력을 발휘하십시오. 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.