मुझे शट द बॉक्स में मदद करें


12

इस चुनौती की प्रेरणा पोस्टिंग के समय हास्यास्पद रूप से स्पष्ट होनी चाहिए।

काम

आपको शट द बॉक्स स्टाइल प्रोग्राम (फंक्शन, प्रोग्राम नहीं) बनाना होगा। बॉक्स को बंद करने की मूल बातें हैं:

खिलाड़ी 1-9 लेबल वाले लीवर के सेट को चालू करके बॉक्स को बंद करने का प्रयास करते हैं। उन्हें लीवर को फड़फड़ा कर ऐसा करना चाहिए। प्रत्येक मोड़ की घटनाओं का क्रम इस प्रकार है:

  1. लीवर की वर्तमान स्थिति को दिखाया गया है।
    • एक नए खेल पर, लीवर की स्थिति को प्रदर्शित किया जाना चाहिए 123456789
    • बंद लीवर वाले खेल पर, सभी बंद लीवर को प्रदर्शित किया जाता है -। उदाहरण के लिए, एक ऐसे खेल पर जिसमें 1, 5 और 9 बंद हैं, आउटपुट होगा -234-678-
  2. Di (c) e (is | are) लुढ़का हुआ है।
    • यदि लीवर 7, 8, और 9 सभी बंद हैं, तो केवल एक छह-मुखी मर जाता है। अन्यथा, 2 छह मुंह वाले पासे फेंके जाते हैं।
  3. खिलाड़ी को यह चुनने के लिए प्रेरित किया जाता है कि वे कितने लीवर को फ्लिप करना चाहते हैं।
    • यदि खिलाड़ी एक नंबर> 9 या <0 चुनता है, तो खेल समाप्त हो जाता है।
    • यदि खिलाड़ी पहले से ही बंद लीवर चुनता है, तो खेल समाप्त हो जाता है।
  4. खिलाड़ी कई लीवर का चयन करता है।
    • यदि लीवर का योग डि (सी) ई थ्रो के मूल्य के बराबर नहीं है, तो खेल समाप्त होता है।
  5. यदि सभी लीवर बंद हैं, तो बधाई, आप जीतते हैं। अन्यथा, चरण 1 पर वापस जाएं।

कार्यक्रम के लिए नियम

  • प्रत्येक मोड़ पर, आपको लीवर की वर्तमान स्थिति को आउटपुट करना चाहिए।
  • आपको वाक्यांश के साथ रोल का मूल्य आउटपुट करना चाहिए You rolled:(स्थान पर ध्यान दें)।
  • वाक्यांशों के साथ स्विच करने के लिए लीवर की संख्या के लिए आपको (और प्रतीक्षा करना होगा) How many levers to flip:(स्थान पर ध्यान दें)।
  • मुहावरे के साथ निर्दिष्ट खिलाड़ी Which lever to flip:(स्थान पर ध्यान दें ) के रूप में उतने लीवर के लिए आपको (और प्रतीक्षा) करनी चाहिए ।
  • आपको निर्दिष्ट लीवर को फ्लिप करना होगा।
  • यदि किसी भी बिंदु पर खेल समाप्त होता है, तो आपको आउटपुट करना होगा Game Over
  • यदि खिलाड़ी कोई लीवर नहीं खुला है, तो आपको आउटपुट देना होगा You win!

उदाहरण के खेल

123456789
You rolled: 5
How many levers to flip: 5
Which lever to flip: 1
Which lever to flip: 2
Which lever to flip: 3
Which lever to flip: 4
Which lever to flip: 5
Game Over
123456789
You rolled: 5
How many levers to flip: 3
Which lever to flip: 2
Which lever to flip: 2
Which lever to flip: 1
Game Over
123456789
You rolled: 12
How many levers to flip: 2
Which lever to flip: 3
Which lever to flip: 9
12-45678-
You rolled: 6
How many levers to flip: 2
Which lever to flip: 2
Which lever to flip: 4
1---5678-
You rolled: 11
How many levers to flip: 2
Which lever to flip: 5
Which lever to flip: 6
1-----78-
You rolled: 8
How many levers to flip: 1
Which lever to flip: 8
1-----7--
You rolled: 8
How many levers to flip: 2
Which lever to flip: 1
Which lever to flip: 7
---------
You win!

ओह। मेरे पास शट द बॉक्स को शामिल करने के लिए एक चुनौती बनाने के लिए यह मेरी सूची में था। अच्छा!
mbomb007 22

जवाबों:


3

अजगर 3, 348

सहेजा गया 5 बाइट्स माथियास एटिंगर का धन्यवाद।
7 बाइट डीएसएम के लिए धन्यवाद बचा लिया।

ऊओफ़, यह एक लंबा है। मुझे यह भी नफरत है कि परीक्षण मामलों को करने का एक अच्छा तरीका नहीं है।

from random import*
*l,='123456789'
q=['-']*9
r=randint
p=print
f=' to flip: '
while l!=q:
 p(*l,sep='');t=r(1,6)+r(1,6)*(l[6:]!=q[6:]);p('You rolled: %s'%t);d={int(input('Which lever'+f))for _ in' '*int(input('How many levers'+f))}
 if len(set(d))-len(d)+1-all(str(x)in l for x in d)+t-sum(d):exit('Game Over')
 for x in d:l[x-1]='-'
p('You win!')

2

सी, 405 403 398 392 390 387 बाइट्स

#define R 1+rand()/(2147483647/6+1)
#define G return puts("Game Over");
#define I(s,w)printf(s);scanf("%d",&w);
w,s;main(r,l){char b[]="123456789";for(srand(time(0));w^9;w=strspn(b,"-")){puts(b);printf("You rolled: %d\n",r=R+(strspn(b+6,"-")<3?R:0));I("How many levers to flip: ",l)for(;l--;s+=w,b[w-1]=45){I("Which lever to flip: ",w);if(w>9|w<0|b[w-1]<48)G}if(s^=r)G}puts("You win!");}

Ungolfed

/* Macro to get random integer in range [1,6] */
#define R 1+rand()/(2147483647/6+1)

i; /* Index variable */
main(r,l,w,s)
{
    /* Running game board */
    char b[]="123456789";

    /* Run while still levers not pulled */
    for(srand(time(0));i^9;i=strspn(b,"-"))
    {
        puts(b); /* Print game board */
        r=R+(b[6]^45||b[7]^45||b[8]^45?R:0); /* Get dice roll */
        printf("You rolled: %d\n",r); /* Print dice roll */
        printf("How many levers to flip: ");
        scanf("%d",&l); /* Get # of levers */
        for(i=s=0;i++<l;s+=w)
        {
            printf("Which lever to flip: ");
            scanf("%d",&w); /* Get lever # */
            if(w>9||w<0||b[w-1]==45) /* If invalid lever or lever already pulled, game over man */
                return puts("Game Over");
            b[w-1]=45; /* flip the lever */
        }
        if(s^r) /* If sum does not equal roll, game over */
            return puts("Game Over");
    }
    puts("You win!");
}

संपादित करें: D'oh! मेरे गोल्फ के उत्तर में अप्रयुक्त चर छोड़ दिया। मैंने इसे हटा दिया था लेकिन गलत संस्करण चिपकाया था।


2

PowerShell v2 +, 330 322 बाइट्स

$a=1..9;$r={1+(Random 6)};for($g="Game Over"){($o=-join$a-replace0,'-');if($o-eq'-'*9){"You win!";exit}"You rolled: "+($b=(&$r)+(&$r)*(($a|sort)[8]-ge7));$l=Read-Host "How many levers to flip";if(9-lt$l-or1-gt$l){$g;exit}while($l){$b-=($i=Read-Host "Which lever to flip");$a[$i-1]-=$I;$l-=1}if($b-or($a|sort)[0]){$g;exit}}

स्पष्टता के लिए नई सीमाएँ:

$a=1..9
$r={1+(Random 6)}
for($g="Game Over"){
  ($o=-join$a-replace0,'-')
  if($o-eq'-'*9){"You win!";exit}
  "You rolled: "+($b=(&$r)+(&$r)*(($a|sort)[8]-ge7))
  $l=Read-Host "How many levers to flip"
  if(9-lt$l-or1-gt$l){$g;exit}
  while($l){
    $b-=($i=Read-Host "Which lever to flip")
    $a[$i-1]-=$i
    $l-=1
  }
  if($b-or($a|sort)[0]){$g;exit}
}

(संस्करण 2 या बाद Get-Randomमें PowerShell v1 में मौजूद नहीं था ...)

स्पष्टीकरण:

$aरेंज लेकर लीवर की गड़बड़ी को सेट करने के साथ शुरू करें 1..9, और $rएक स्क्रिप्ट ब्लॉक के बराबर सेट करें जिसे हम बाद में निष्पादित करते हैं (नीचे वर्णित है $b)। Game Overशब्दों के लिए सेट हो जाता है $gअनंत लूप के शुरू में for(){...}। प्रत्येक पुनरावृत्ति, हम अपना आउटपुट सेट करते हैं $oऔर तुरंत इसे आउटपुट करते हैं ( (...)इनकैप्सुलेशन के लिए धन्यवाद ) -joinसरणी के 0साथ एक साथ और प्रत्येक को एक के साथ बदलें -। ( 0नीचे समझाया गया है)। यदि आउटपुट 9 हाइफ़न, आउटपुट You win!और के बराबर है exit

अगला, हम कुछ अतिरिक्त मापदंडों के साथ $bसंग्रहीत $r(द्वारा &) कॉल करके हमारे पासा रोल सेट करते हैं । Get-Randomएक साथ आदेश -Maximumकी 6( -Maximumनिहित है) समावेशी, 5 0 से एक पूर्णांक का उत्पादन करेगा। हम 1इसे छह-पक्षीय मरने के लिए जोड़ते हैं, और इसे जोड़कर एक और यादृच्छिक डाई रोल से गुणा करते हैं, (($a|sort)[8]-ge7)जो यह जांचता है कि क्या लीवर पर छोड़ा गया उच्चतम मूल्य 7,8,9पहले छँटाई में से एक है $aऔर फिर अंतिम तत्व ले रहा है और जाँच रहा है कि क्या यह अधिक है -थाना-या-के-बराबर 7। हम बूलियन मान को 0 (गलत) या 1 (ट्रू) में गुणा करने के लिए निहित टाइपकास्टिंग का उपयोग करते हैं, इसलिए अतिरिक्त "डाई" die*0या तो है die*1। हम फिर डाई रोल के परिणाम का उत्पादन करते हैं।

अगला है Read-Hostमें $lकितने लीवर के लिए। ध्यान दें कि PowerShell स्वचालित रूप से कोलन-स्पेस :को एक Read-Hostप्रॉम्प्ट के बाद जोड़ता है , इसलिए हमें कम से कम मुफ्त में मिलता है। फिर हम जाँचते हैं कि उपयोगकर्ता द्वारा लीवर की इच्छा की संख्या 1 से 9 के बीच है exit

अब हम एक whileलूप में प्रवेश करते हैं । इस लूप का प्रत्येक पुनरावृत्ति, हम Read-Hostजो लीवर करते हैं $i, उस में स्टोर करते हैं और उस मान को घटाते हैं $b। फिर हम सरणी में संबंधित लीवर को भी घटाते हैं, और उपयोगकर्ता को क्वेरी करने के लिए कितने अतिरिक्त समय घटाते हैं।

अंतिम पंक्ति (समापन ब्रेस को छोड़कर) दो बूलियन निर्माण का परीक्षण करती है। पहला, बस $b, केवल तभी होगा $Trueजब उपयोगकर्ता डाय रोल से सभी नंबरों को ठीक से घटा नहीं पाए (PowerShell में, कोई भी गैर-शून्य नंबर ट्रुथ है)। अन्य शर्त छाँटते हैं $aऔर न्यूनतम मूल्य लेते हैं। यदि हमने एक ही लीवर को दो बार घटाया है, तो न्यूनतम मान ऋणात्मक (या सत्य) होगा, अन्यथा न्यूनतम मूल्य 0(या फालसे) होगा।

उदाहरण रन:

PS C:\Tools\Scripts\golfing> .\shut-the-box.ps1
123456789
You rolled: 6
How many levers to flip: 1
Which lever to flip: 6
12345-789
You rolled: 6
How many levers to flip: 2
Which lever to flip: 2
Which lever to flip: 4
1-3-5-789
You rolled: 6
How many levers to flip: 2
Which lever to flip: 1
Which lever to flip: 5
--3---789
You rolled: 10
How many levers to flip: 2
Which lever to flip: 3
Which lever to flip: 7
-------89
You rolled: 9
How many levers to flip: 1
Which lever to flip: 9
-------8-
You rolled: 8
How many levers to flip: 1
Which lever to flip: 8
---------
You win!

बहुत बढ़िया स्पष्टीकरण! +1
Addison Crump
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.