Ejecute el problema de Monty Hall

11

Ya ha habido una pregunta sobre la simulación del problema de Monty Hall . Este es diferente. El usuario va a reproducir el problema de Monty Hall. Su programa desempeñará el papel del anfitrión. Montybot, si quieres.

Aquí están los pasos:

  1. Elija (al azar) cuál de las tres puertas esconde el premio.
  2. Salida de una pantalla visual de tres puertas. Un simple ABClo hará. O tres cuadrados. O lo que sea.
  3. Reciba información eligiendo una de las puertas. Esto podría ser un clic del mouse en la puerta elegida, o una entrada de una sola letra ( B) o lo que sea.
  4. Abre otra puerta. No abres la puerta elegida. No abres la puerta escondiendo el premio principal. Eso puede significar que no tiene otra opción, o puede significar que tiene una opción de dos. Si tiene dos opciones, elija una al azar. Indique visualmente que la puerta se ha abierto y que no se oculta ningún premio detrás de ella. Para un programa de entrada / salida basada en texto, esto podría ser tan simple como la salida AB0, para mostrar que la puerta Cse ha abierto. Siéntase libre de ser más inventivo. Si está haciendo un programa GUI, su elección de pantalla depende de usted.
  5. Aceptar aportes del usuario. El usuario puede ingresar sticko switch(o, para un programa GUI, hacer clic en los botones, o usar una entrada de selección, o lo que sea). Si el usuario ingresa algo que no sea sticko switch, la implementación no está definida. Haz lo que quieras.
  6. Salida del texto You won!o You lost.
  7. Terminar el programa.

Reglas:

  1. Cuando tenga que elegir algo al azar , no se preocupe por la aleatoriedad criptográfica. Cualquier rand()función servirá.
  2. El programa no debe hacer trampa. El premio debe estar en su lugar antes de que comience el juego. Es decir que los pasos deben realizarse en el orden dado: primero elige una puerta detrás de la cual esconder tu premio, luego pide al jugador que elija. La elección de qué puerta abrir en el paso 4 debe realizarse en el paso 4: no se selecciona de antemano.
  3. El resultado en el paso 6 debe ser honesto.
  4. Este es el código de golf. El código más corto gana.
Trigonometría
fuente
La primera vez que publico en este sitio, pero acecho mucho, así que creo que estoy familiarizado con sus normas.
TRiG
En meta.codegolf.stackexchange.com hay un hilo para proponer preguntas y dejar que las personas resuelvan cualquier problema antes de que se publique oficialmente. No sé si hay algo específicamente incorrecto aquí que podría haberse solucionado, pero sería bueno saberlo la próxima vez.
undergroundmonorail
Preveo que el ganador será solo otra respuesta de golfscript ...
Victor Stafusa
1
Por cierto, "ser inventivo" no va bien con codegolfing, ya que ser inventivo consume algunos bytes y el objetivo de codegolfing es lo opuesto a esto.
Victor Stafusa
Sí, @Victor. Ser inventivo no es un requisito. Simplemente (a) no quería limitar esto a los programas de línea de comando, y (b) no tenía idea de cómo un programa de línea de comando no debería implementar la selección del usuario. Así que se lo dejé a los que respondieron. Ser inventivo es una opción, pero es una que no obtendrá puntos extra.
TRiG

Respuestas:

2

APL, 77

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

Necesidades ⎕IO←0. Probado en Dyalog.

Explicación

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

Ejemplos

      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
fuente
¡Encantador! Pero creo que hay una fuente que muta en una =explicación.
TRiG
Gracias, fue un error tipográfico, el último error que solucioné antes de publicar.
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]

Ejemplo:

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

PowerShell: 192 174

Cambios del original:

  • -8 caracteres Dado que la presentación visual de las puertas puede ser "lo que sea", me di cuenta de que podía guardar algunos caracteres (en particular, los apóstrofes necesarios para definir cadenas) mediante el uso de números en lugar de letras.
  • -8 Caracteres Al elegir específicamente números primos de un solo dígito para representar las puertas, podría usar el operador de módulo más corto en lugar de un operador de comparación real cuando necesito hacer coincidir las puertas para descubrir las posibles opciones del anfitrión o el cambio de puerta del jugador. ( Brevemente explicado aquí. )
  • -2 Personajes Intercambiar las respuestas de ganar / perder en la última declaración if / else me permitió usar el truco del módulo allí también.

Código de golf

$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 sin golf con comentarios

# 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
fuente
Me gusta si contiene un truco 'w' .
TRiG
Por cierto, originalmente dije que si la entrada no era "stick" o "switch", el programa debería terminar, pero cambié de opinión antes de publicar.
TRiG
@TRiG Gracias por eso. Si bien no habría sido difícil de implementar, habría agregado un poco de hinchazón.
Iszi
Y los diversos trucos (tu detección de w, o contar caracteres ) son más divertidos, de todos modos.
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')

Utiliza dos llamadas a Date.now () por aleatoriedad con un mensaje intermedio para garantizar un retraso. La entrada del usuario es un índice basado en 0 (la regla decía "lo que sea"). La siguiente alerta dice qué puerta se abrió. Aquí hay una versión un poco más larga que da la respuesta antes de que el usuario elija, para verificar que no haga trampa:

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

Violín: http://jsfiddle.net/acbabis/9J2kP/

EDITAR: Gracias Dave

aebabis
fuente
Se podría reducir su longitud a 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 Eso es útil. No pensé en usar el operador ternario aquí. Sin embargo, no puedo pasar Date.now (), porque los números aleatorios deben ser independientes. Sin embargo, puedo pasar Date.now.
aebabis
@acbabis "I can't pass Date.now() ... I can, however, pass Date.now"???
Timtech
@Timtech date.nowpasa la función, date.now()pasa el resultado de la función
dave
@dave Oh, lo entiendo. Gracias :)
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.');

Salida:

012
1
01_
stick
You won!
Dabbler decente
fuente