Uruchom problem Monty Hall

11

Było już pytanie o symulację problemu Monty Hall . Ten jest inny. Użytkownik będzie grać w Monty Hall problem. Twój program będzie pełnił rolę gospodarza. Montybot, jeśli chcesz.

Oto kroki:

  1. Wybierz (losowo), które z trzech drzwi ukrywa nagrodę.
  2. Wyświetl wizualny obraz trzech drzwi. Proste ABCwystarczy. Lub trzy kwadraty. Lub cokolwiek.
  3. Odbierz dane wejściowe wybierając jedno z drzwi. Może to być kliknięcie myszką wybranych drzwi, wprowadzanie pojedynczej litery ( B) lub cokolwiek innego.
  4. Otwórz kolejne drzwi. Nie otwierasz wybranych drzwi. Nie otwierasz drzwi, ukrywając główną nagrodę. Które mogą oznaczać nie masz wyboru, czy to może oznaczać, że masz do wyboru dwa. Jeśli masz do wyboru dwa, wybierz jeden losowo. Wskaż wizualnie, że drzwi zostały otwarte i nie kryje się za nimi żadna nagroda. W przypadku wejścia / wyjścia opartego na tekście programu może to być tak proste, jak wyjście AB0, aby pokazać, że drzwi Czostały otwarte. Bądź bardziej pomysłowy. Jeśli wykonujesz program GUI, wybór sposobu wyświetlania zależy od Ciebie.
  5. Zaakceptuj dane wejściowe od użytkownika. Użytkownik może wprowadzić sticklub switch(lub, w przypadku programu GUI, kliknąć przyciski lub użyć wejścia select lub cokolwiek innego). Jeśli użytkownik wprowadzi cokolwiek innego niż sticklub switch, implementacja jest niezdefiniowana. Rób co chcesz.
  6. Wydrukuj tekst You won!lub You lost.
  7. Zakończyć program.

Zasady:

  1. Kiedy musisz wybrać coś losowo , nie martw się przypadkowością kryptograficzną. Każda rand()funkcja zadziała.
  2. Program nie może oszukiwać. Nagroda musi być na miejscu przed rozpoczęciem gry. To znaczy, że kroki należy wykonać w podanej kolejności: Najpierw wybierz drzwi, za którymi ukryjesz swoją nagrodę, a następnie poproś gracza o wybranie. Wybór drzwi do otwarcia w kroku 4 musi nastąpić w kroku 4: nie jest wcześniej wybierany.
  3. Dane wyjściowe w kroku 6 muszą być uczciwe.
  4. To jest kod golfowy. Najkrótszy kod wygrywa.
Wymuskany
źródło
Mój pierwszy post na tej stronie, ale często się czaję, więc myślę , że znam twoje normy.
TRiG
Na stronie meta.codegolf.stackexchange.com znajduje się wątek służący do zadawania pytań i pozwalania innym na rozwiązywanie problemów przed oficjalnym opublikowaniem. Nie wiem, czy jest tu coś szczególnie złego, co mogłoby zostać wyeliminowane, ale warto wiedzieć o tym następnym razem.
undergroundmonorail
Zapowiadam, że zwycięzca będzie kolejną odpowiedzią na golfa ...
Victor Stafusa
1
BTW, „bycie wynalazczym” nie pasuje do kodegolfingu, ponieważ bycie wynalazczym pochłania pewne bajty, a cel codegolfing jest odwrotny.
Victor Stafusa
Tak, @Victor. Bycie pomysłowym nie jest wymogiem. Po prostu (a) nie chciałem ograniczać tego do programów wiersza poleceń i (b) nie miałem pojęcia, jak program inny niż wiersz poleceń powinien implementować wybór użytkownika. Więc zostawiłem to autorom. Pomysłowość jest opcją, ale nie zdobędzie dodatkowych punktów.
TRiG

Odpowiedzi:

2

APL, 77

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

Potrzeby ⎕IO←0. Testowane na Dyalog.

Wyjaśnienie

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

Przykłady

      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
źródło
Śliczny! Ale myślę, że jest źródło, które mutuje się =w wyjaśnienie.
TRiG
Dzięki, to była literówka, ostatni błąd, który naprawiłem przed opublikowaniem.
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]

Przykład:

$ python monty.py
ABC
> A
AB_
> switch
You won!
grc
źródło
2

PowerShell: 192 174

Zmiany w stosunku do oryginału:

  • -8 Znaków Ponieważ wizualne wyświetlanie drzwi może być „czymkolwiek”, zdałem sobie sprawę, że mogę zapisać niektóre znaki (szczególnie apostrofy wymagane do zdefiniowania ciągów), używając cyfr zamiast liter.
  • -8 znaków Wybierając konkretnie jednocyfrowe liczby pierwsze reprezentujące drzwi, mogłem użyć krótszego operatora modulo zamiast rzeczywistego operatora porównania, gdy potrzebowałem dopasować drzwi, aby ustalić możliwe opcje gospodarza lub zamianę drzwi gracza. ( Krótko wyjaśnione tutaj. )
  • -2 Postacie Zamiana odpowiedzi wygranej / przegranej w końcowej instrukcji if / else pozwoliło mi również zastosować tam sztuczkę modulo.

Kod do gry w golfa

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

Kod bez golfa z komentarzami

# 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
źródło
Podoba mi się, jeśli zawiera lewę „w” .
TRiG
Nawiasem mówiąc, pierwotnie powiedziałem, że jeśli dane wejściowe były inne niż „kij” lub „przełącznik”, program powinien zakończyć się, ale przed wysłaniem zmieniłem zdanie.
TRiG
@TRiG Dzięki za to. Chociaż nie byłoby trudno go wdrożyć, dodałoby to nieco rozdęcia.
Iszi
Różne sztuczki (wykrywanie postaci lub liczenie postaci ) są i tak zabawniejsze.
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')

Używa dwóch wywołań funkcji Date.now () dla losowości, z monitem pomiędzy nimi, aby zagwarantować opóźnienie. Dane wejściowe użytkownika są indeksem 0 (reguła mówi „cokolwiek”). Poniższy alert mówi, które drzwi zostały otwarte. Oto nieco dłuższa wersja, która daje odpowiedź, zanim użytkownik wybierze, aby sprawdzić, czy nie oszukuje:

(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/

EDYCJA: Dzięki dave

aebabis
źródło
Można go skrócić do 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 To jest pomocne. Nie pomyślałem, żeby użyć tutaj trójskładnikowego operatora. Nie mogę jednak przekazać funkcji Date.now (), ponieważ liczby losowe muszą być niezależne. Mogę jednak przekazać Date.now.
aebabis
@acbabis "I can't pass Date.now() ... I can, however, pass Date.now"???
Timtech
@Timtech date.nowprzekazuje funkcję, date.now()przekazuje wynik funkcji
dave
@dave Och, rozumiem. Dzięki :)
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.');

Wynik:

012
1
01_
stick
You won!
Przyzwoity Dabbler
źródło