Execute o problema do Monty Hall

11

Já existe uma pergunta sobre a simulação do problema de Monty Hall . Este é diferente. O usuário vai jogar o problema de Monty Salão. Seu programa desempenhará o papel de host. Montybot, se quiser.

Aqui estão os passos:

  1. Escolha (aleatoriamente) qual das três portas oculta o prêmio.
  2. Saída de uma exibição visual de três portas. Um simples ABCservirá. Ou três quadrados. Como queiras.
  3. Receba entrada escolhendo uma das portas. Pode ser um clique do mouse na porta escolhida, uma entrada de letra única ( B) ou o que seja.
  4. Abra outra porta. Você não abre a porta escolhida. Você não abre a porta escondendo o prêmio principal. Isso pode significar que você não tem escolha ou pode escolher duas. Se você tiver duas opções, escolha uma aleatoriamente. Indique visualmente que a porta foi aberta e que nenhum prêmio foi escondido atrás dela. Para um programa de entrada / saída baseado em texto, isso pode ser tão simples quanto a saída AB0, para mostrar que a porta Cfoi aberta. Sinta-se livre para ser mais criativo. Se você estiver executando um programa GUI, sua escolha de exibição é com você.
  5. Aceite a entrada do usuário. O usuário pode inserir stickou switch(ou, para um programa GUI, clicar nos botões, ou usar uma entrada selecionada ou qualquer outra coisa). Se o usuário digitar algo diferente de stickou switch, a implementação será indefinida. Faça o que você quiser.
  6. Envie o texto You won!ou You lost.
  7. Encerre o programa.

Regras:

  1. Quando você tiver que escolher algo aleatoriamente , não se preocupe com a aleatoriedade criptográfica. Qualquer rand()função serve.
  2. O programa não deve trapacear. O prêmio deve estar no lugar antes do jogo começar. Ou seja, as etapas devem ser executadas na ordem indicada: primeiro escolha uma porta atrás da qual ocultar seu prêmio e peça ao jogador que escolha. A escolha de qual porta abrir na etapa 4 deve ocorrer na etapa 4: ela não é selecionada previamente.
  3. A saída na etapa 6 deve ser honesta.
  4. Isso é código de golfe. O menor código vence.
TRiG
fonte
Minha primeira publicação neste site, mas eu me escondo muito, então acho que estou familiarizado com suas normas.
TRiG 17/02
No meta.codegolf.stackexchange.com, há um tópico para propor perguntas e permitir que as pessoas resolvam quaisquer problemas antes que seja publicado oficialmente. Não sei se há algo especificamente errado aqui que possa ter sido resolvido, mas talvez seja bom saber da próxima vez.
Undergroundmonorail
Estou visualizando que o vencedor será apenas outra resposta golfscript ...
Victor Stafusa
1
BTW, "ser inventivo" não combina bem com o codegolfing, pois ser inventivo consome alguns bytes e o objetivo do codegolfing é o oposto disso.
Victor Stafusa
Sim, @ Victor. Ser inventivo não é um requisito. Eu apenas (a) não queria limitar isso a programas de linha de comando e (b) não fazia ideia de como um programa que não seja de linha de comando deveria implementar a seleção de usuários. Então eu deixei para os respondentes. Ser criativo é uma opção, mas é uma que não acumula pontos extras.
TRiG 17/02

Respostas:

2

APL, 77

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

Necessidades ⎕IO←0. Testado em Dyalog.

Explicação

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

Exemplos

      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! 
Tobia
fonte
Adorável! Mas acho que há um na fonte que se transforma em um =na explicação.
TRiG 17/02
Obrigado, esse foi um erro de digitação, o último bug que corrigi antes de postar.
Tobia
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]

Exemplo:

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

PowerShell: 192 174

Alterações do original:

  • -8 Caracteres Como a exibição visual das portas pode ser "qualquer coisa", percebi que podia salvar alguns caracteres (particularmente os apóstrofos necessários para definir as strings) usando números em vez de letras.
  • -8 Caracteres Ao escolher especificamente números primos de um dígito para representar as portas, eu poderia usar o operador de módulo mais curto, em vez de um operador de comparação real, quando precisasse combinar as portas para descobrir as possíveis opções do host ou a troca de portas do jogador. ( Resumidamente explicado aqui. )
  • -2 Caracteres A troca das respostas de vitória / perda na declaração final if / else me permitiu usar o truque do módulo também.

Código de golfe

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

Código não golfe com comentários

# 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
Iszi
fonte
Eu gosto do que contém um truque 'w' .
TRiG
Aliás, eu disse originalmente que, se a entrada não fosse "stick" ou "switch", o programa deveria terminar, mas mudei de idéia antes de postar.
TRiG
@TRiG Obrigado por isso. Embora não fosse difícil de implementar, teria acrescentado um pouco de inchaço.
Iszi
E os vários truques (sua detecção de w ou contagem de caracteres ) são mais divertidos.
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')

Ele usa duas chamadas para Date.now () para aleatoriedade com um prompt no meio para garantir um atraso. A entrada do usuário é um índice baseado em 0 (a regra dizia "tanto faz"). O alerta a seguir indica qual porta foi aberta. Aqui está uma versão um pouco mais longa que fornece a resposta antes que o usuário escolha, para verificar se ele não trapaceia:

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

Fiddle: http://jsfiddle.net/acbabis/9J2kP/

EDIT: Obrigado dave

aebabis
fonte
Você pode reduzi-lo para 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 Isso é útil. Não pensei em usar o operador ternário aqui. Não posso passar Date.now (), no entanto, porque os números aleatórios precisam ser independentes. No entanto, posso passar o Date.now.
aebabis
@acbabis "I can't pass Date.now() ... I can, however, pass Date.now"???
Timtech 17/02
@Timtech date.nowpassa a função, date.now()passa o resultado da função
dave
@ Dave Oh, eu entendi. Obrigado :)
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.');

Resultado:

012
1
01_
stick
You won!
Dabbler decente
fonte