ช่วยฉันปิดกล่อง


12

แรงบันดาลใจสำหรับความท้าทายนี้ควรชัดเจนในเวลาโพสต์

งาน

คุณต้องสร้างโปรแกรมสไตล์ Shut the Box (ไม่ใช่ฟังก์ชั่น, โปรแกรม) พื้นฐานของการปิดกล่องคือ:

ผู้เล่นพยายามปิดกล่องโดยหมุนคันโยกที่มีป้ายกำกับ 1-9 พวกเขาต้องทำเช่นนั้นโดยการพลิกคันโยก ลำดับของเหตุการณ์ในแต่ละตาร์มีดังนี้:

  1. ตำแหน่งปัจจุบันของคันโยกจะแสดงขึ้น
    • 123456789ในเกมใหม่ตำแหน่งของคันโยกที่ควรจะแสดงเป็น
    • -กับเกมที่มีคันโยกปิดทุกคันปิดจะแสดงเป็น ตัวอย่างเช่นในเกมที่มี 1, 5 และ 9 -234-678-ปิดการส่งออกจะเป็น
  2. di (c) e (คือ | ถูก) รีด
    • ถ้าคันโยก 7, 8, และ 9 ปิดหมดจะต้องโยนตายหกครั้งเดียวเท่านั้น มิฉะนั้นจะโยนลูกเต๋าสองหน้าไปหกครั้ง
  3. ผู้เล่นจะได้รับแจ้งให้เลือกจำนวนคันที่ต้องการพลิก
    • หากผู้เล่นเลือกหมายเลข> 9 หรือ <0 เกมจะสิ้นสุดลง
    • หากผู้เล่นเลือกคันโยกปิดที่มีอยู่แล้วเกมจะจบลง
  4. ผู้เล่นเลือกคันโยกหลายอัน
    • หากจำนวนรวมของคานไม่เท่ากับค่าของ di (c) e ที่ถูกโยนเกมจะจบลง
  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

Python 3, 348

บันทึก 5 ไบต์ด้วย Mathias Ettinger
บันทึกแล้ว 7 ไบต์ด้วย DSM

Ooof นี่คืออันยาวหนึ่ง ฉันเกลียดที่ไม่มีวิธีทดสอบกรณีที่ดี

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

C, 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และทันทีที่การส่งออกมัน (ขอบคุณที่(...)encapsulation) โดย-joinไอเอ็นจีร่วมกันอาร์เรย์และแทนที่แต่ละกับ0 -( 0อธิบายไว้ด้านล่าง) หากการส่งออกมีค่าเท่ากับ 9 ยัติภังค์เอาท์พุทและYou win!exit

ต่อไปเราตั้งค่าลูกเต๋าของเราเป็น$bโดยการเรียกเก็บไว้$r(ผ่าน&) ด้วยพารามิเตอร์เพิ่มเติมบางอย่าง Get-Randomคำสั่งมี-Maximumของ6(คน-Maximumบอกเป็นนัย ๆ ) จะผลิตเป็นจำนวนเต็ม 0-5 รวม เราเพิ่ม1ลงไปเพื่อให้ได้แม่พิมพ์แบบหกด้านและเพิ่มเข้าไปในแม่พิมพ์แบบสุ่มอีกอันคูณ(($a|sort)[8]-ge7)ซึ่งตรวจสอบว่าค่าสูงสุดที่เหลืออยู่บนคันโยกเป็นหนึ่งใน7,8,9การเรียงลำดับครั้งแรก$aจากนั้นนำองค์ประกอบสุดท้ายและตรวจสอบว่ามันยิ่งใหญ่กว่า 7-than เราใช้ Typecasting นัยที่จะเปิดเข้าไปในค่าบูลีนทั้ง 0 (เท็จ) หรือ 1 (ทรู) คูณเพื่อให้เพิ่มเติม "ตาย" อย่างใดอย่างหนึ่งหรือdie*0 die*1จากนั้นเราจะแสดงผลลัพธ์ของมวนม้วน

ถัดไปคือRead-Hostเข้า$lสำหรับวิธีการหลายคัน โปรดทราบว่า PowerShell จะเพิ่มโคลอนสเปซโดยอัตโนมัติ:หลังจากได้รับRead-Hostพรอมต์ดังนั้นเราจึงได้รับฟรีอย่างน้อย จากนั้นเราตรวจสอบว่าจำนวนคันโยกที่ผู้ใช้ต้องการพลิกอยู่ระหว่าง 1 ถึง 9 หรือexitไม่

ตอนนี้เราเข้าสู่whileวง ย้ำแต่ละวงนี้เราRead-Hostซึ่งคานร้านค้าที่เข้าและลบค่าจากที่$i $bจากนั้นเราจะลบคานที่สอดคล้องกันในอาร์เรย์และลบจำนวนเวลาเพิ่มเติมเพื่อสอบถามผู้ใช้

บรรทัดสุดท้าย (ยกเว้นวงเล็บปีกกาปิด) ทดสอบการสร้างบูลีนสองรายการ ครั้งแรกเพียงแค่$bจะเป็น$Trueถ้าผู้ใช้ไม่ได้ลบตัวเลขทั้งหมดอย่างถูกต้องออกจากม้วนฟิล์ม (ใน PowerShell หมายเลขที่ไม่ใช่ศูนย์ใด ๆ คือ Truthy) เงื่อนไขอื่น ๆ จะเรียงลำดับ$aและรับค่าน้อยที่สุด หากเราลบก้านเดียวกันสองครั้งค่าที่น้อยที่สุดจะเป็นค่าลบ (หรือ Truthy) มิฉะนั้นค่าขั้นต่ำจะเป็น0(หรือ Falsey)

ตัวอย่างการเรียกใช้:

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.