আমাকে বক্স বন্ধ করতে সহায়তা করুন


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

উত্তর:


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!");
}

সম্পাদনা: দোহ! আমার গল্ফ উত্তরের একটি অব্যবহৃত পরিবর্তনশীল রেখেছি। আমি এটি সরিয়ে দিয়েছি কিন্তু ভুল সংস্করণটি আটকে দিয়েছি।


2

পাওয়ারশেল ভি 2 + 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}
}

( Get-Randomপাওয়ারশেল ভি 1-তে বিদ্যমান না থাকায় সংস্করণ 2 বা তার পরে পুনরায় প্রয়োজন ...)

ব্যাখ্যা:

$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কত levers জন্য। নোট করুন যে পাওয়ারশেল একটি প্রম্পটের পরে স্বয়ংক্রিয়ভাবে কোলন-স্থান যুক্ত করে , তাই আমরা কমপক্ষে এটি নিখরচায় পাই। এরপরে আমরা যাচাই করে দেখছি যে ব্যবহারকারী লিভারের সংখ্যাটি ফ্লিপ করতে চান অন্যথায় 1 থেকে 9 এর মধ্যে ।:Read-Hostexit

এখন আমরা একটি whileলুপ লিখুন । এই লুপটির প্রতিটি পুনরাবৃত্তি, আমরা Read-Hostযা লিভার করি, এটি স্টোর করি $iএবং সেই মানটি থেকে বিয়োগ করি $b। এরপরেও আমরা অ্যারেতে সম্পর্কিত লিভারটি বিয়োগ করি এবং ব্যবহারকারীর অনুসন্ধানের জন্য কত অতিরিক্ত সময় বিয়োগ করি।

শেষ লাইন (বন্ধনী বন্ধনী বাদে) দুটি বুলিয়ান নির্মাণ পরীক্ষা করে। প্রথমটি, কেবলমাত্র $bতখনই হবে $Trueযদি ব্যবহারকারী ডাই রোল থেকে সমস্ত সংখ্যা সঠিকভাবে বিয়োগ না করে (পাওয়ারশেলের ক্ষেত্রে, কোনও শূন্য নয় এমন নম্বর সত্যবাদী)। অন্যান্য শর্তটি $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
অ্যাডিসন ক্রম্প
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.