मोंटी हॉल प्रॉब्लम चलाएं


11

मोंटी हॉल समस्या का अनुकरण करने के बारे में पहले से ही एक सवाल है । यह एक अलग है। उपयोगकर्ता होगा खेलने मोंटी हॉल समस्या। आपका कार्यक्रम होस्ट की भूमिका निभाएगा। आप चाहें तो मोंटीबोट।

यहाँ कदम हैं:

  1. उठाओ (बेतरतीब ढंग से) जो तीन दरवाजे पुरस्कार छुपाता है।
  2. आउटपुट तीन दरवाजों का एक दृश्य प्रदर्शन। एक साधारण ABCकरेगा। या तीन वर्ग। जो कुछ भी।
  3. दरवाजों में से किसी एक को चुनने वाला इनपुट प्राप्त करें। यह चुने हुए दरवाजे पर माउस क्लिक, या एक एकल पत्र इनपुट ( B) या जो भी हो सकता है।
  4. एक और दरवाजा खोलें। आप चुने हुए दरवाजे को नहीं खोलते हैं। आप मुख्य पुरस्कार को छिपाने का दरवाजा नहीं खोलते हैं। इसका मतलब हो सकता है कि आपके पास कोई विकल्प नहीं है, या इसका मतलब यह हो सकता है कि आपके पास दो विकल्प हैं। यदि आपके पास दो विकल्प हैं, तो यादृच्छिक पर एक चुनें। नेत्रहीन इंगित करते हैं कि दरवाजा खोला गया है और इसके पीछे कोई पुरस्कार नहीं छिपा है। एक प्रोग्राम टेक्स्ट-आधारित इनपुट / आउटपुट के लिए, यह आउटपुट के रूप में सरल हो सकता है, यह AB0दिखाने के लिए कि दरवाजा Cखोला गया है। अधिक आविष्कारशील होने के लिए स्वतंत्र महसूस करें। यदि आप GUI प्रोग्राम कर रहे हैं, तो आपकी पसंद का प्रदर्शन आपके ऊपर है।
  5. उपयोगकर्ता से इनपुट स्वीकार करें। उपयोगकर्ता इनपुट stickकर सकता है या switch(या, GUI प्रोग्राम के लिए, बटन पर क्लिक कर सकता है, या चुनिंदा इनपुट का उपयोग कर सकता है, या जो भी हो)। उपयोगकर्ता अन्य कुछ भी दर्ज करता है की तुलना में stickया switch, कार्यान्वयन अपरिभाषित है। आप जो चाहे करें।
  6. पाठ का आउटपुट You won!या You lost
  7. प्रोगम को समाप्त करें।

नियम:

  1. जब आपको यादृच्छिक पर कुछ चुनना हो , तो क्रिप्टोग्राफ़िक यादृच्छिकता के बारे में चिंता न करें। कोई भी rand()फंक्शन करेंगे।
  2. कार्यक्रम को धोखा नहीं देना चाहिए। खेल शुरू होने से पहले पुरस्कार होना चाहिए। यह कहना है कि दिए गए क्रम में चरणों का पालन किया जाना चाहिए: पहले एक दरवाजा चुनें, जिसके पीछे अपना पुरस्कार छिपाएं, फिर खिलाड़ी को चुनने के लिए कहें। चरण 4 में किस दरवाजे को खोलना है इसका विकल्प चरण 4 में होना चाहिए: यह पहले से चयनित नहीं है।
  3. चरण 6 में आउटपुट ईमानदार होना चाहिए।
  4. यह कोड गोल्फ है। सबसे छोटा कोड जीतता है।

मेरी पहली बार इस साइट पर पोस्टिंग है, लेकिन मैं बहुत पीछे हट गया, इसलिए मुझे लगता है कि मैं आपके मानदंडों से परिचित हूं।
टीआरआईजी

Meta.codegolf.stackexchange.com पर प्रश्नों के प्रस्ताव के लिए एक धागा है और लोगों को आधिकारिक तौर पर पोस्ट करने से पहले इसके साथ किसी भी समस्या को हल करने की अनुमति देता है। मुझे नहीं पता कि यहाँ कुछ विशेष रूप से गलत है, जिसे इस्त्री किया जा सकता है, लेकिन अगली बार के लिए जानना अच्छा हो सकता है।
अंडरग्राउंडोरेल

मैं पूर्वावलोकन कर रहा हूं कि विजेता सिर्फ एक और गोल्फस्क्रिप्ट उत्तर होगा ...
विक्टर स्टैफुसा

1
BTW, "आविष्कारशील होना" कोडगॉल्फिंग के साथ अच्छी तरह से नहीं चलता है, क्योंकि आविष्कारशील कुछ बाइट्स का उपभोग करता है और कोडगॉल्फिंग का उद्देश्य इसके विपरीत है।
विक्टर स्टैफुसा

हाँ, @ विक्टर। आविष्कारशील होना कोई आवश्यकता नहीं है। मैं सिर्फ (ए) कमांड लाइन कार्यक्रमों के लिए इसे सीमित नहीं करना चाहता था, और (बी) को यह पता नहीं था कि गैर-कमांड लाइन प्रोग्राम को उपयोगकर्ता के चयन को कैसे लागू करना चाहिए। इसलिए मैंने इसे उत्तरदाताओं तक छोड़ दिया। आविष्कारशील होना एक विकल्प है, लेकिन यह एक है जो अतिरिक्त अंक नहीं जुटाएगा।
टीआरआईजी

जवाबों:


2

एपीएल, 77

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

की जरूरत है ⎕IO←0। Dyalog पर परीक्षण किया गया।

व्याख्या

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

उदाहरण

      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! 

लवली! लेकिन मुझे लगता है कि स्रोत में एक =है जो स्पष्टीकरण में एक में बदल जाता है ।
TRIG

धन्यवाद, यह एक टाइपो था, आखिरी बग जिसे मैंने पोस्ट करने से पहले तय किया था।
टोबिया

2

पायथन, 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]

उदाहरण:

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

2

पॉवरशेल: 192 174

मूल से परिवर्तन:

  • -8 वर्ण चूंकि दरवाजों के दृश्य प्रदर्शन "जो कुछ भी" हो सकता है मुझे एहसास हुआ कि मैं अक्षरों के बजाय संख्याओं का उपयोग करके कुछ वर्ण (विशेष रूप से, स्ट्रिंग को परिभाषित करने के लिए आवश्यक एपोस्ट्रोफिस) को बचा सकता हूं।
  • -8 वर्ण विशेष रूप से एकल-अंक, मुख्य संख्याओं का चयन करके, मैं एक वास्तविक तुलना ऑपरेटर के बजाय छोटे modulo ऑपरेटर का उपयोग कर सकता हूं जब मुझे मेजबान के संभावित विकल्पों या खिलाड़ी के दरवाजे स्वैप का पता लगाने के लिए दरवाजे से मिलान करने की आवश्यकता होती है। ( संक्षेप में यहां बताया गया है। )
  • -2 वर्ण फाइनल में जीत / हानि प्रतिक्रियाओं की अदला-बदली अगर / और कथन ने मुझे वहाँ modulo चाल का उपयोग करने की अनुमति दी।

गोल्फ कोड

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

टिप्पणियाँ के साथ बिना गोल्फ कोड

# 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

मुझे पसंद है अगर इसमें 'w' ट्रिक है।
टीआरआईजी

संयोग से, मैंने मूल रूप से कहा था कि यदि इनपुट "स्टिक" या "स्विच" के अलावा कुछ भी था, तो कार्यक्रम समाप्त हो जाना चाहिए, लेकिन मैंने पोस्ट करने से पहले अपना विचार बदल दिया।
टीआरआईजी

@TRiG इसके लिए धन्यवाद। हालांकि इसे लागू करना कठिन नहीं होता, लेकिन इसमें थोड़ा सा ब्लोट जोड़ा जाता।
इस्ति

और विभिन्न ट्रिक्स (आपकी डब्ल्यू डिटेक्शन या काउंटिंग कैरेक्टर ) वैसे भी ज्यादा मजेदार हैं।
TRIG

0

जावास्क्रिप्ट, 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')

यह विलंब की गारंटी देने के लिए बीच में शीघ्रता के साथ Date.now () के लिए दो कॉल का उपयोग करता है। उपयोगकर्ता इनपुट 0-आधारित इंडेक्स है (नियम ने "जो कुछ भी कहा")। निम्नलिखित चेतावनी कहती है कि कौन सा दरवाजा खोला गया था। यह थोड़ा लंबा संस्करण है जो उपयोगकर्ता को चुनने से पहले उत्तर देता है, यह सत्यापित करने के लिए कि यह धोखा नहीं देता है:

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

फिडल: http://jsfiddle.net/acbabis/9J2kP/

संपादित करें: धन्यवाद डेव


: आप 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')
डेव

@ यह मददगार है। मैं यहाँ टर्नरी ऑपरेटर का उपयोग करने के बारे में नहीं सोचता था। मैं Date.now () को पास नहीं कर सकता, हालांकि, यादृच्छिक संख्याओं के स्वतंत्र होने की आवश्यकता है। हालाँकि, मैं Date.now पास कर सकता हूँ।
ऐनाबिस

@acbabis "I can't pass Date.now() ... I can, however, pass Date.now"???
टिमटेक

@Timtech date.nowसमारोह से गुजरता है, date.now()फ़ंक्शन के परिणाम से गुजरता है
डेव

@ ओह, मैं समझ गया। धन्यवाद :)
टिमटेक

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.');

आउटपुट:

012
1
01_
stick
You won!
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.