Exécutez le problème de Monty Hall

11

Il y a déjà eu une question sur la simulation du problème de Monty Hall . Celui-ci est différent. L' utilisateur va jouer le problème de Monty Hall. Votre programme jouera le rôle d'hôte. Montybot, si vous voulez.

Voici les étapes:

  1. Choisissez (au hasard) laquelle des trois portes cache le prix.
  2. Sortie d'un affichage visuel de trois portes. Une simple ABCvolonté suffira. Ou trois carrés. Ou peu importe.
  3. Recevez une entrée en choisissant l'une des portes. Cela peut être un clic de souris sur la porte choisie, ou une entrée d'une seule lettre ( B) ou autre.
  4. Ouvrez une autre porte. Vous n'ouvrez pas la porte choisie. Vous n'ouvrez pas la porte en cachant le prix principal. Cela peut signifier que vous n'avez pas le choix, ou cela peut signifier que vous avez le choix entre deux. Si vous avez le choix entre deux, choisissez-en un au hasard. Indiquez visuellement que la porte a été ouverte et qu'aucun prix n'a été caché derrière. Pour une entrée / sortie textuelle de programme, cela peut être aussi simple que de sortir AB0, pour montrer que la porte Ca été ouverte. N'hésitez pas à être plus inventif. Si vous faites un programme GUI, votre choix d'affichage dépend de vous.
  5. Acceptez les entrées de l'utilisateur. L'utilisateur peut entrer stickou switch(ou, pour un programme GUI, cliquer sur les boutons, ou utiliser une entrée de sélection, ou autre). Si l'utilisateur entre autre chose que stickou switch, l'implémentation n'est pas définie. Fais ce que tu veux.
  6. Sortez le texte You won!ou You lost.
  7. Arrêtez le programme.

Règles:

  1. Lorsque vous devez choisir quelque chose au hasard , ne vous inquiétez pas du caractère aléatoire cryptographique. N'importe quelle rand()fonction fera l'affaire.
  2. Le programme ne doit pas tricher. Le prix doit être en place avant le début du jeu. C'est-à-dire que les étapes doivent être effectuées dans l'ordre indiqué: choisissez d' abord une porte derrière laquelle cacher votre lot, puis demandez au joueur de choisir. Le choix de la porte à ouvrir à l'étape 4 doit se faire à l'étape 4: elle n'est pas sélectionnée à l'avance.
  3. Le résultat de l'étape 6 doit être honnête.
  4. C'est le golf de code. Le code le plus court gagne.
Trigonométrie
la source
Ma première fois sur ce site, mais je me cache beaucoup, donc je pense que je connais vos normes.
TRiG
Sur meta.codegolf.stackexchange.com, il y a un fil de discussion pour proposer des questions et permettre aux gens de résoudre tout problème avant qu'il ne soit officiellement publié. Je ne sais pas s'il y a quelque chose de mal ici qui aurait pu être corrigé, mais il serait peut-être bon de le savoir pour la prochaine fois.
undergroundmonorail
Je prévois que le gagnant sera juste une autre réponse de golfscript ...
Victor Stafusa
1
BTW, "être inventif" ne va pas bien avec le golf de code, car être inventif consomme quelques octets et l'objectif du golf de code est à l'opposé de cela.
Victor Stafusa
Ouais, @Victor. Être inventif n'est pas une exigence. Je (a) ne voulais pas limiter cela aux programmes en ligne de commande, et (b) ne savais pas comment un programme sans ligne de commande devrait implémenter la sélection des utilisateurs. J'ai donc laissé le soin aux répondeurs. Être inventif est une option, mais c'est une option qui ne rapportera aucun point supplémentaire.
TRiG

Réponses:

2

APL, 77

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

Besoins ⎕IO←0. Testé sur Dyalog.

Explication

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

Exemples

      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
la source
Charmant! Mais je pense qu'il y a un dans la source qui se transforme en un =dans l'explication.
TRiG
Merci, c'était une faute de frappe, le dernier bug que j'ai corrigé avant de poster.
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]

Exemple:

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

PowerShell: 192 174

Changements par rapport à l'original:

  • -8 Caractères Étant donné que l'affichage visuel des portes peut être "quoi que", j'ai réalisé que je pouvais enregistrer certains caractères (en particulier, les apostrophes nécessaires pour définir les chaînes) en utilisant des chiffres au lieu de lettres.
  • -8 caractères En choisissant spécifiquement des nombres premiers à un chiffre pour représenter les portes, je pouvais utiliser l'opérateur modulo le plus court au lieu d'un opérateur de comparaison réel lorsque je devais faire correspondre les portes pour comprendre les choix possibles de l'hôte ou l'échange de porte du joueur. ( Brièvement expliqué ici. )
  • -2 Personnages L' échange des réponses de victoire / défaite dans la déclaration finale if / else m'a permis d'utiliser l'astuce modulo là aussi.

Golfed Code

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

Code sans golf avec commentaires

# 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
la source
J'aime le s'il contient une astuce «w» .
TRiG
Soit dit en passant, j'ai initialement dit que si l'entrée était autre chose que "stick" ou "switch", le programme devrait se terminer, mais j'ai changé d'avis avant de poster.
TRiG
@TRiG Merci pour cela. Bien que cela n'aurait pas été difficile à mettre en œuvre, cela aurait ajouté un peu de ballonnement.
Iszi
Et les différentes astuces (votre détection w, ou compter les personnages ) sont de toute façon plus amusantes.
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')

Il utilise deux appels à Date.now () pour l'aléatoire avec une invite entre les deux pour garantir un retard. L'entrée utilisateur est un index basé sur 0 (la règle a dit "peu importe"). L'alerte suivante indique quelle porte a été ouverte. Voici une version légèrement plus longue qui donne la réponse avant que l'utilisateur ne choisisse, pour vérifier qu'elle ne triche pas:

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

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

EDIT: Merci dave

aebabis
la source
Vous pouvez le raccourcir à 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 C'est utile. Je ne pensais pas utiliser l'opérateur ternaire ici. Je ne peux cependant pas passer Date.now (), car les nombres aléatoires doivent être indépendants. Je peux cependant passer Date.now.
aebabis
@acbabis "I can't pass Date.now() ... I can, however, pass Date.now"???
Timtech
@Timtech date.nowpasse la fonction, date.now()passe le résultat de la fonction
dave
@dave Oh, je comprends. Merci :)
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.');

Production:

012
1
01_
stick
You won!
Dabbler décent
la source