Esegui il problema di Monty Hall


11

C'è già stata una domanda sulla simulazione del problema di Monty Hall . Questo è diverso. L' utente si giocherà il Problema di Monty Hall. Il tuo programma svolgerà il ruolo di host. Montybot, se vuoi.

Ecco i passaggi:

  1. Scegli (a caso) quale delle tre porte nasconde il premio.
  2. Emette un display visivo di tre porte. Un semplice ABCfarà. O tre quadrati. O qualunque cosa.
  3. Ricevi input scegliendo una delle porte. Potrebbe trattarsi di un clic del mouse sulla porta scelta o di un input di una sola lettera ( B) o altro.
  4. Apri un'altra porta. Non si apre la porta scelta. Non si apre la porta nascondendo il premio principale. Ciò può significare che non hai scelta, oppure può avere una scelta tra due. Se hai una scelta di due, scegline uno a caso. Indica visivamente che la porta è stata aperta e che nessun premio è stato nascosto dietro di essa. Per un programma di input / output basato su testo, questo potrebbe essere semplice come emettere AB0, per mostrare che la porta Cè stata aperta. Sentiti libero di essere più creativo. Se stai eseguendo un programma GUI, la scelta del display dipende da te.
  5. Accetta input da parte dell'utente. L'utente può inserire sticko switch(o, per un programma di interfaccia grafica, fare clic sui pulsanti o utilizzare un input di selezione o altro). Se l'utente inserisce qualcosa di diverso da sticko switch, l'implementazione non è definita. Fai quello che vuoi.
  6. Emette il testo You won!o You lost.
  7. Termina il programma.

Regole:

  1. Quando devi scegliere qualcosa a caso , non preoccuparti della casualità crittografica. Qualsiasi rand()funzione farà.
  2. Il programma non deve barare. Il premio deve essere fissato prima dell'inizio del gioco. Vale a dire che i passaggi devono essere eseguiti nell'ordine indicato: prima scegli una porta dietro la quale nascondere il tuo premio, quindi chiedi al giocatore di scegliere. La scelta della porta da aprire al passaggio 4 deve avvenire al passaggio 4: non viene selezionata in anticipo.
  3. L'output nel passaggio 6 deve essere onesto.
  4. Questo è il codice golf. Il codice più corto vince.

La mia prima volta che pubblico su questo sito, ma mi nascondo molto, quindi penso di avere familiarità con le vostre norme.
TRiG,

Su meta.codegolf.stackexchange.com c'è un thread per proporre domande e consentire alle persone di risolvere eventuali problemi prima che vengano pubblicati ufficialmente. Non so se ci sia qualcosa di specificamente sbagliato qui che avrebbe potuto essere risolto, ma potrebbe essere utile sapere per la prossima volta.
undergroundmonorail,

Sto prevedendo che il vincitore sarà solo un'altra risposta da golfscript ...
Victor Stafusa,

1
A proposito, "essere inventivi" non va bene con il codegolfing, poiché essere inventivi consuma alcuni byte e l'obiettivo del codegolfing è l'opposto di questo.
Victor Stafusa,

Sì, @Victor. Essere inventivi non è un requisito. Semplicemente (a) non volevo limitare questo ai programmi da riga di comando e (b) non avevo idea di come un programma senza riga di comando dovesse implementare la selezione dell'utente. Quindi l'ho lasciato ai rispondenti. Essere inventivi è un'opzione, ma è uno che non raccoglierà punti extra.
TRiG,

Risposte:


2

APL, 77

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

Necessità ⎕IO←0. Testato su Dyalog.

Spiegazione

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

Esempi

      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! 

Bello! Ma penso che ci sia un nella fonte che si trasforma in un =nella spiegazione.
TRiG,

Grazie, è stato un refuso, l'ultimo bug che ho corretto prima di pubblicare.
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]

Esempio:

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

2

PowerShell: 192 174

Modifiche rispetto all'originale:

  • -8 Personaggi Dato che la visualizzazione visiva delle porte può essere "qualunque", mi sono reso conto che avrei potuto salvare alcuni personaggi (in particolare, gli apostrofi necessari per definire le stringhe) usando i numeri anziché le lettere.
  • -8 Personaggi Scegliendo specificamente numeri primi a una cifra per rappresentare le porte ho potuto usare l'operatore modulo più corto invece di un vero operatore di confronto quando avevo bisogno di abbinare le porte per capire le possibili scelte dell'host o lo scambio di porte del giocatore. ( Qui brevemente spiegato. )
  • -2 Personaggi Scambiare le risposte di vincita / perdita nell'istruzione if / else finale mi ha permesso di usare anche il trucco del modulo.

Codice Golfed

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

Codice non golfato con commenti

# 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

Mi piace se contiene un trucco "w" .
TRiG

Per inciso, originariamente ho detto che se l'input era diverso da "stick" o "switch", il programma dovrebbe terminare, ma ho cambiato idea prima di pubblicare.
TRiG

@TRiG Grazie per quello. Anche se non sarebbe stato difficile da implementare, avrebbe aggiunto un po 'di gonfiore.
Iszi,

E i vari trucchi (il tuo rilevamento o il conteggio dei personaggi ) sono comunque più divertenti.
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')

Utilizza due chiamate a Date.now () per casualità con un prompt in mezzo per garantire un ritardo. L'input dell'utente è un indice basato su 0 (la regola ha detto "qualunque"). La seguente segnalazione indica quale porta è stata aperta. Ecco una versione leggermente più lunga che fornisce la risposta prima che l'utente scelga, per verificare che non tradisca:

(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: Grazie dave


Potresti accorciarlo 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 È utile. Non pensavo di usare l'operatore ternario qui. Non posso passare Date.now (), però, perché i numeri casuali devono essere indipendenti. Posso, tuttavia, passare Date.now.
aebabis,

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

@Timtech date.nowpassa la funzione, date.now()passa il risultato della funzione
dave

@dave Oh, ho capito. Grazie :)
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.');

Produzione:

012
1
01_
stick
You won!
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.