Führen Sie das Monty Hall-Problem aus

11

Es gab bereits eine Frage zur Simulation des Monty Hall-Problems . Dieser ist anders. Der Benutzer wird spielen die Monty Hall Problem. Ihr Programm spielt die Rolle des Hosts. Montybot, wenn Sie möchten.

Hier sind die Schritte:

  1. Wähle (zufällig) aus, welche der drei Türen den Preis verbirgt.
  2. Geben Sie eine visuelle Anzeige von drei Türen aus. Ein einfacher ABCWille reicht aus. Oder drei Quadrate. Oder Wasauchimmer.
  3. Erhalten Sie Eingaben, indem Sie eine der Türen auswählen. Dies kann ein Mausklick auf die ausgewählte Tür oder eine einzelne Buchstabeneingabe ( B) oder was auch immer sein.
  4. Öffne eine andere Tür. Sie öffnen die gewählte Tür nicht. Sie öffnen nicht die Tür, die den Hauptpreis verbirgt. Das kann bedeuten, dass Sie keine Wahl haben, oder es kann bedeuten, dass Sie die Wahl zwischen zwei haben. Wenn Sie zwei zur Auswahl haben, wählen Sie eine nach dem Zufallsprinzip aus. Zeigen Sie visuell an, dass die Tür geöffnet wurde und kein Preis dahinter versteckt war. Bei einer programmtextbasierten Eingabe / Ausgabe kann dies so einfach wie die Ausgabe sein AB0, um anzuzeigen , dass die Tür Cgeöffnet wurde. Fühlen Sie sich frei, erfinderischer zu sein. Wenn Sie ein GUI-Programm ausführen, liegt die Wahl der Anzeige bei Ihnen.
  5. Akzeptieren Sie Eingaben des Benutzers. Der Benutzer kann eingeben stickoder switch(oder für ein GUI-Programm auf Schaltflächen klicken oder eine Auswahleingabe verwenden oder was auch immer). Wenn der Benutzer etwas anderes als stickoder eingibt switch, ist die Implementierung undefiniert. Mach was du willst.
  6. Geben Sie den Text You won!oder aus You lost.
  7. Beenden Sie das Programm.

Regeln:

  1. Wenn Sie etwas zufällig auswählen müssen , sorgen Sie sich nicht um kryptografische Zufälligkeit. Jede rand()Funktion reicht aus.
  2. Das Programm darf nicht schummeln. Der Preis muss vorhanden sein, bevor das Spiel beginnt. Das heißt , dass die Schritte in der angegebenen Reihenfolge durchgeführt werden müssen: Zuerst wählen Sie eine Tür , hinter der Sie Ihren Preis zu verstecken, dann fragen Sie den Spieler zu wählen. Die Auswahl der zu öffnenden Tür in Schritt 4 muss in Schritt 4 erfolgen: Sie wird nicht im Voraus ausgewählt.
  3. Die Ausgabe in Schritt 6 muss ehrlich sein.
  4. Das ist Code Golf. Der kürzeste Code gewinnt.
TRiG
quelle
Mein erstes Mal auf dieser Seite, aber ich lauere viel, also denke ich , dass ich mit Ihren Normen vertraut bin.
TRiG
Auf meta.codegolf.stackexchange.com gibt es einen Thread, in dem Sie Fragen stellen und die Leute Probleme damit lösen können, bevor sie offiziell veröffentlicht werden. Ich weiß nicht, ob hier etwas spezielles falsch ist, das hätte ausgebügelt werden können, aber es könnte gut sein, es für das nächste Mal zu wissen.
U-Bahn:
Ich sehe vor, dass der Gewinner nur eine weitere Golfscript-Antwort sein wird ...
Victor Stafusa
1
Übrigens, "erfinderisch sein" passt nicht gut zum Codegolfing, da erfinderisch zu sein einige Bytes verbraucht und das Ziel des Codegolfing das Gegenteil davon ist.
Victor Stafusa
Ja, @ Victor. Erfindergeist ist keine Voraussetzung. Ich wollte dies nur (a) nicht auf Befehlszeilenprogramme beschränken und (b) hatte keine Ahnung, wie ein Nicht-Befehlszeilenprogramm die Benutzerauswahl implementieren sollte. Also habe ich es den Antwortenden überlassen. Erfinderisch zu sein ist eine Option, aber es ist eine, die keine zusätzlichen Punkte bringt.
TRiG

Antworten:

2

APL, 77

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

Bedürfnisse ⎕IO←0. Auf Dyalog getestet.

Erläuterung

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

Beispiele

      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
quelle
Schön! Aber ich denke, es gibt eine in der Quelle, die =in der Erklärung zu einer mutiert .
TRiG
Danke, das war ein Tippfehler, der letzte Fehler, den ich vor dem Posten behoben habe.
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]

Beispiel:

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

PowerShell: 192 174

Änderungen gegenüber dem Original:

  • -8 Zeichen Da die visuelle Anzeige von Türen "was auch immer" sein kann, wurde mir klar, dass ich einige Zeichen (insbesondere die zum Definieren von Zeichenfolgen erforderlichen Apostrophe) durch Verwendung von Zahlen anstelle von Buchstaben speichern konnte.
  • -8 Zeichen Durch die gezielte Auswahl einstelliger Primzahlen zur Darstellung der Türen konnte ich den kürzeren Modulo-Operator anstelle eines tatsächlichen Vergleichsoperators verwenden, wenn ich Türen abgleichen musste, um die möglichen Auswahlmöglichkeiten des Hosts oder den Türwechsel des Spielers herauszufinden. (Hier kurz erklärt. )
  • -2 Zeichen Durch das Austauschen der Gewinn- / Verlust-Antworten in der letzten if / else-Anweisung konnte ich auch dort den Modulo-Trick anwenden.

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 ohne Golf mit Kommentaren

# 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
quelle
Ich mag das, wenn es einen 'w'- Trick enthält.
TRiG
Übrigens habe ich ursprünglich gesagt, dass das Programm beendet werden sollte, wenn die Eingabe etwas anderes als "Stick" oder "Switch" war, aber ich habe meine Meinung vor dem Posten geändert.
TRiG
@ TRiG Danke dafür. Es wäre zwar nicht schwer zu implementieren gewesen, aber es hätte ein bisschen Aufblähung hinzugefügt.
Iszi
Und die verschiedenen Tricks (Ihre W-Erkennung oder das Zählen von Zeichen ) machen sowieso mehr Spaß.
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')

Es werden zwei Aufrufe von Date.now () zur Zufälligkeit mit einer dazwischen liegenden Eingabeaufforderung verwendet, um eine Verzögerung zu gewährleisten. Die Benutzereingabe ist ein 0-basierter Index (die Regel sagte "was auch immer"). Die folgende Warnung gibt an, welche Tür geöffnet wurde. Hier ist eine etwas längere Version, die die Antwort gibt, bevor der Benutzer sie auswählt, um sicherzustellen, dass sie nicht betrügt:

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

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

EDIT: Danke Dave

aebabis
quelle
Sie könnten es auf 197 verkürzen: (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 Das ist hilfreich. Ich habe nicht daran gedacht, den ternären Operator hier zu verwenden. Ich kann Date.now () jedoch nicht übergeben, da die Zufallszahlen unabhängig sein müssen. Ich kann jedoch Date.now übergeben.
Aebabis
@acbabis "I can't pass Date.now() ... I can, however, pass Date.now"???
Timtech
@ Timtech date.nowübergibt die Funktion, date.now()übergibt das Ergebnis der Funktion
Dave
@ Dave Oh, ich verstehe. Danke :)
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.');

Ausgabe:

012
1
01_
stick
You won!
Anständiger Dabbler
quelle