Monty Hall Problemini Çalıştırın


11

Monty Hall Problemini simüle etmeyle ilgili bir soru zaten vardı . Bu farklı. Kullanıcı edecek oynamak Monty Hall Sorununu. Programınız ana bilgisayarın rolünü oynayacaktır. İsterseniz Montybot.

İşte adımlar:

  1. Üç kapıdan hangisinin ödülü gizlediğini seçin (rastgele).
  2. Üç kapının görsel görüntüsünü çıkarın. Basit bir ABCiş yapacak. Veya üç kare. Ya da her neyse.
  3. Kapılardan birini seçerek girişi alın. Bu, seçilen kapıya bir fare tıklaması veya tek bir harf girişi ( B) veya herhangi bir şey olabilir.
  4. Başka bir kapı aç. Seçilen kapıyı açmazsınız. Ana ödülü gizleyen kapıyı açmazsınız. Yani olabilir seçeneğin yok demek, ya da olabilir Eğer ikisinin bir seçim var demek. İki seçeneğiniz varsa, rastgele birini seçin. Görsel olarak kapının açıldığını ve arkasında hiçbir ödül gizlenmediğini belirtin. Bir program metin tabanlı giriş / çıkış için, bu AB0, kapının Caçıldığını göstermek için çıkış kadar basit olabilir . Daha yaratıcı olmaktan çekinmeyin. Bir GUI programı yapıyorsanız, ekran seçiminiz size kalmış.
  5. Kullanıcının girişini kabul edin. Kullanıcı girebilir stickveya switch(veya bir GUI programı için düğmelere tıklayabilir veya bir seçim girdisi kullanabilir veya her neyse). Kullanıcı stickveya dışında bir şey girerse switch, uygulama tanımsızdır. Ne istersen onu yap.
  6. Metin çıktısını You won!veya You lost.
  7. Programı sonlandırın.

Kurallar:

  1. Rastgele bir şey seçmeniz gerektiğinde, kriptografik rastgele olma konusunda endişelenmeyin. Herhangi bir rand()işlev yapacak.
  2. Program hile yapmamalıdır. Oyun başlamadan önce ödülün yerinde olması gerekir. Yani adımlar verilen sırayla gerçekleştirilmelidir: Önce ödülünüzü gizleyeceğiniz bir kapı seçin, sonra oyuncudan seçim yapmasını isteyin. 4. adımda açılacak kapının seçimi 4. adımda gerçekleşmelidir: önceden seçilmemiştir.
  3. 6. adımdaki çıktı dürüst olmalıdır.
  4. Bu kod golf. En kısa kod kazanır.

Bu siteye ilk kez gönderiyorum, ama çok pusuda kalıyorum, bu yüzden normlarına aşina olduğumu düşünüyorum .
TRiG

Meta.codegolf.stackexchange.com adresinde, soru önermek ve resmi olarak gönderilmeden önce insanların herhangi bir sorunu çözmesine izin vermek için bir konu vardır. Burada ütülenebilecek özel olarak yanlış bir şey olup olmadığını bilmiyorum, ama bir dahaki sefere bilmek iyi olabilir.
undergroundmonorail

Kazanın başka bir golfscript cevabı olacağını önizleyeceğim ...
Victor Stafusa

1
BTW, "yaratıcı olmak" codegolfing ile iyi gitmez, çünkü yaratıcı olmak bazı byte tüketir ve codegolfing'in amacı bunun tam tersidir.
Victor Stafusa

Evet, @Victor. Yaratıcı olmak bir gereklilik değildir. Sadece (a) bunu komut satırı programlarıyla sınırlamak istemedim ve (b) komut dışı bir programın kullanıcı seçimini nasıl uygulaması gerektiği hakkında hiçbir fikrim yoktu. Ben de cevaplayanlara bıraktım. Yaratıcı olmak bir seçenektir, ancak fazladan puan kazanmayacak bir seçenektir.
TRiG

Yanıtlar:


2

APL, 77

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

İhtiyaçlar ⎕IO←0. Dyalog'da test edildi.

açıklama

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

Örnekler

      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! 

Güzel! Ama bence kaynakta bir =açıklamaya dönüşen bir de var.
TRiG

Teşekkürler, bu bir yazım hatasıydı, göndermeden önce düzelttiğim son hata.
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]

Misal:

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

2

PowerShell: 192 174

Orijinalden değişiklikler:

  • -8 Karakterler Kapıların görsel görüntüsü "ne olursa olsun" olabileceğinden, harf yerine sayılar kullanarak bazı karakterleri (özellikle dizeleri tanımlamak için gereken kesme işaretlerini) kaydedebileceğimi fark ettim.
  • -8 Karakter Kapıları temsil etmek için özellikle tek haneli, asal sayıları seçerek, ana bilgisayarın olası seçimlerini veya oyuncunun kapı takasını anlamak için kapıları eşleştirmem gerektiğinde gerçek bir karşılaştırma operatörü yerine daha kısa modulo operatörünü kullanabilirim. ( Kısaca burada açıklanmıştır. )
  • -2 Karakter Eğer if / else deyiminde kazan / mağlubiyet cevaplarını değiştirmek, modulo numarayı orada da kullanmama izin verdi.

Golf Kodu

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

Yorumlanmamış Golf Kodu

# 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

Ben 'w' hile içeriyor gibi .
TRiG

Bu arada, başlangıçta girdi "sopa" veya "anahtar" dışında bir şey olsaydı, programın sona ermesi gerektiğini söyledim, ama göndermeden önce fikrimi değiştirdim.
TRiG

@TRiG Bunun için teşekkürler. Uygulanması zor olmasa da, biraz şişkinlik ekleyecekti.
Iszi

Ve çeşitli numaralar (w algılama veya karakter sayma ) zaten daha eğlenceli.
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')

Rastgele olmak için Date.now () öğesine iki çağrı kullanır. Kullanıcı girişi 0 tabanlı bir dizindir (kural "ne olursa olsun" derdi). Aşağıdaki uyarı hangi kapının açıldığını söylüyor. İşte aldatmadığından emin olmak için kullanıcı seçmeden önce yanıtı veren biraz daha uzun bir sürüm:

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

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

EDIT: Teşekkürler dave


Sen 197 kısaltabilirsiniz: (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 Bu yardımcı oldu. Üçlü operatörü burada kullanmayı düşünmemiştim. Date.now () 'ı geçemiyorum, çünkü rastgele sayıların bağımsız olması gerekiyor. Ancak, Date.now'u geçebilirim.
aebabis

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

@Timtech date.nowişlevi geçti, işlevin date.now()sonucunu geçti
dave

@dave Oh, anladım. Teşekkürler :)
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.');

Çıktı:

012
1
01_
stick
You won!
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.