Jalankan Masalah Monty Hall

11

Sudah ada pertanyaan tentang simulasi Masalah Monty Hall . Yang ini berbeda. The pengguna akan bermain dengan Masalah Monty Hall. Program Anda akan memainkan peran sebagai tuan rumah. Montybot, jika kamu suka.

Berikut langkah-langkahnya:

  1. Pilih (secara acak) yang mana dari tiga pintu yang menyembunyikan hadiah.
  2. Keluarkan tampilan visual tiga pintu. Sederhana ABCakan dilakukan. Atau tiga kotak. Atau terserah.
  3. Terima input dengan memilih salah satu pintu. Ini bisa berupa klik mouse pada pintu yang dipilih, atau input huruf tunggal ( B) atau apa pun.
  4. Buka pintu lain. Anda tidak membuka pintu yang dipilih. Anda tidak membuka pintu menyembunyikan hadiah utama. Itu mungkin berarti Anda tidak punya pilihan, atau itu mungkin berarti Anda memiliki dua pilihan. Jika Anda memiliki dua pilihan, pilih satu secara acak. Secara visual menunjukkan bahwa pintu telah dibuka dan tidak ada hadiah yang disembunyikan di baliknya. Untuk input / output berbasis teks program, ini bisa sesederhana keluaran AB0, untuk menunjukkan bahwa pintu Ctelah dibuka. Jangan ragu untuk lebih inventif. Jika Anda melakukan program GUI, pilihan tampilan Anda terserah Anda.
  5. Terima input dari pengguna. Pengguna dapat memasukkan stickatau switch(atau, untuk program GUI, klik tombol, atau gunakan input pilih, atau apa pun). Jika pengguna memasukkan sesuatu selain stickatau switch, implementasi tidak ditentukan. Melakukan apapun yang Anda inginkan.
  6. Keluarkan teks You won!atau You lost.
  7. Hentikan progamnya.

Aturan:

  1. Ketika Anda harus memilih sesuatu secara acak , jangan khawatir tentang keacakan kriptografi. Setiap rand()fungsi akan melakukan.
  2. Program tidak boleh curang. Hadiah harus ada di tempat sebelum permainan dimulai. Artinya, langkah-langkah harus dilakukan dalam urutan yang diberikan: Pertama pilih pintu di belakang untuk menyembunyikan hadiah Anda, lalu minta pemain untuk memilih. Pilihan pintu mana yang terbuka pada langkah 4 harus terjadi pada langkah 4: tidak dipilih sebelumnya.
  3. Output pada langkah 6 harus jujur.
  4. Ini golf kode. Kode terpendek menang.
Trigonometri
sumber
Saya pertama kali memposting di situs ini, tapi saya banyak mengintai, jadi saya pikir saya sudah terbiasa dengan norma-norma Anda.
TRiG
Di meta.codegolf.stackexchange.com ada utas untuk mengajukan pertanyaan dan membiarkan orang memecahkan masalah dengannya sebelum diumumkan secara resmi. Saya tidak tahu apakah ada sesuatu yang salah di sini yang bisa diselesaikan, tetapi mungkin baik untuk mengetahui untuk waktu berikutnya.
undergroundmonorail
Saya melihat dulu bahwa pemenangnya hanyalah jawaban skrip golf yang lain ...
Victor Stafusa
1
BTW, "menjadi inventif" tidak berjalan dengan baik dengan codegolfing, karena menjadi inventif menghabiskan beberapa byte dan tujuan dari codegolfing adalah kebalikan dari ini.
Victor Stafusa
Ya, @Victor. Menjadi inventif bukan keharusan. Saya hanya (a) tidak ingin membatasi ini untuk program-program baris perintah, dan (b) tidak tahu bagaimana program baris non-perintah harus menerapkan pemilihan pengguna. Jadi saya menyerahkannya kepada para penjawab. Menjadi inventif adalah sebuah pilihan, tapi itu tidak akan menghasilkan poin tambahan.
TRiG

Jawaban:

2

APL, 77

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

Kebutuhan ⎕IO←0. Diuji pada Dyalog.

Penjelasan

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

Contohnya

      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
sumber
Menyenangkan! Tapi saya pikir ada dalam sumber yang bermutasi menjadi =dalam penjelasan.
TRiG
Terima kasih, itu kesalahan ketik, bug terakhir yang saya perbaiki sebelum memposting.
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]

Contoh:

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

PowerShell: 192 174

Perubahan dari aslinya:

  • -8 Karakter Karena tampilan visual pintu dapat menjadi "apa pun", saya menyadari bahwa saya dapat menyimpan beberapa karakter (khususnya, tanda kutip yang diperlukan untuk mendefinisikan string) dengan menggunakan angka alih-alih huruf.
  • -8 Karakter Dengan secara khusus memilih satu digit, bilangan prima untuk mewakili pintu, saya dapat menggunakan operator modulo yang lebih pendek daripada operator perbandingan yang sebenarnya ketika saya harus mencocokkan pintu untuk mengetahui pilihan yang mungkin dari tuan rumah atau pertukaran pintu pemain. ( Dijelaskan secara singkat di sini. )
  • -2 Karakter Menukar respons win / loss di final jika pernyataan /t lain mengizinkan saya untuk menggunakan trik modulo di sana juga.

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

Un-Golfed Code Dengan Komentar

# 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
sumber
Saya suka jika berisi trik 'w' .
TRiG
Kebetulan, saya awalnya mengatakan bahwa jika input itu selain "stick" atau "switch", program harus dihentikan, tetapi saya berubah pikiran sebelum memposting.
TRiG
@TRiG Terima kasih untuk itu. Meskipun tidak sulit untuk diimplementasikan, itu akan menambahkan sedikit mengasapi.
Iszi
Dan berbagai trik (deteksi w, atau menghitung karakter ) Anda lebih menyenangkan.
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')

Ini menggunakan dua panggilan ke Date.now () untuk keacakan dengan prompt di antara untuk menjamin penundaan. Input pengguna adalah indeks berbasis 0 (aturan memang mengatakan "apa pun"). Peringatan berikut mengatakan pintu mana yang dibuka. Berikut adalah versi yang sedikit lebih panjang yang memberikan jawaban sebelum pengguna memilih, untuk memverifikasi bahwa itu tidak curang:

(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: Terima kasih, dave

aebabis
sumber
Anda dapat mempersingkatnya menjadi 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 Itu sangat membantu. Saya tidak berpikir untuk menggunakan operator ternary di sini. Saya tidak bisa melewati Date.now (), karena angka acak harus independen. Namun, saya bisa melewati Date.now.
aebabis
@acbabis "I can't pass Date.now() ... I can, however, pass Date.now"???
Timtech
@Timtech date.nowmelewati fungsi, date.now()melewati hasil dari fungsi
dave
@ Oh, saya mengerti. Terima kasih :)
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.');

Keluaran:

012
1
01_
stick
You won!
Dabbler yang Layak
sumber