Giúp tôi đóng hộp


12

Cảm hứng cho thử thách này nên được thể hiện rõ ràng tại thời điểm đăng.

Nhiệm vụ

Bạn phải tạo một chương trình kiểu Shut the Box (không phải chức năng, chương trình). Những điều cơ bản của việc đóng hộp là:

Người chơi cố gắng đóng hộp bằng cách xoay một bộ đòn bẩy có nhãn 1-9. Họ phải làm như vậy bằng cách lật các đòn bẩy. Chuỗi các sự kiện của mỗi lượt như sau:

  1. Vị trí hiện tại của đòn bẩy được hiển thị.
    • Trên một trò chơi mới, vị trí của các đòn bẩy sẽ được hiển thị là 123456789.
    • Trên một trò chơi có đòn bẩy đóng, tất cả các đòn bẩy đóng được hiển thị dưới dạng -. Ví dụ: trên một trò chơi có 1, 5 và 9 đóng, đầu ra sẽ là -234-678-.
  2. Di (c) e (is | are) được cuộn.
    • Nếu các đòn bẩy 7, 8 và 9 đều tắt, chỉ có một cái chết sáu mặt được ném ra. Nếu không, 2 con xúc xắc sáu mặt được ném.
  3. Người chơi được nhắc chọn bao nhiêu đòn bẩy mà họ muốn lật.
    • Nếu người chơi chọn một số> 9 hoặc <0, trò chơi kết thúc.
    • Nếu người chơi chọn một đòn bẩy đã đóng, trò chơi kết thúc.
  4. Người chơi chọn nhiều đòn bẩy.
    • Nếu tổng số đòn bẩy không bằng giá trị của di (c) e ném, trò chơi kết thúc.
  5. Nếu tất cả các đòn bẩy đều đóng cửa, xin chúc mừng, bạn đã thắng. Nếu không, quay lại bước 1.

Nội quy chương trình

  • Trên mỗi lượt, bạn nên xuất các vị trí hiện tại của đòn bẩy.
  • Bạn phải xuất giá trị của cuộn với cụm từ You rolled:(lưu ý khoảng trắng).
  • Bạn phải nhắc (và chờ) để số lượng đòn bẩy chuyển đổi với cụm từ How many levers to flip:(lưu ý khoảng trắng).
  • Bạn phải nhắc (và chờ) cho nhiều đòn bẩy như trình phát được chỉ định bằng cụm từ Which lever to flip:(lưu ý khoảng trắng).
  • Bạn phải lật các đòn bẩy được chỉ định.
  • Nếu tại bất kỳ thời điểm nào trò chơi kết thúc, bạn phải xuất ra Game Over.
  • Nếu người chơi kết thúc một lượt chơi mà không có đòn bẩy mở, bạn phải xuất ra You win!

Trò chơi ví dụ

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!

Oh. Tôi đã có nó trong danh sách của mình để tạo ra một thử thách liên quan đến Shut the Box. Đẹp!
mbomb007

Câu trả lời:


3

Trăn 3, 348

Đã lưu 5 byte nhờ Mathias Ettinger.
Đã lưu 7 byte nhờ DSM.

Ôi, đây là một cái dài. Tôi cũng ghét rằng không có cách nào tốt để làm các trường hợp thử nghiệm.

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 byte

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

Ung dung

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

Chỉnh sửa: Ôi! Còn lại một biến không sử dụng trong câu trả lời golf của tôi. Tôi đã gỡ bỏ nó nhưng dán phiên bản sai.


2

PowerShell v2 +, 330 322 byte

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

Dòng mới cho rõ ràng:

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

(Yêu cầu phiên bản 2 trở lên vì Get-Randomkhông tồn tại trong PowerShell v1 ...)

Giải trình:

Bắt đầu với việc thiết lập các $ađòn bẩy bằng cách lấy phạm vi 1..9và cũng được đặt $rbằng với một khối tập lệnh mà chúng ta thực hiện sau này (được mô tả bên dưới $b). Từ Game Overngữ được đặt thành $gkhi bắt đầu một vòng lặp vô hạn for(){...}. Mỗi lần lặp, chúng tôi đặt đầu ra của mình $ovà ngay lập tức xuất ra nó (nhờ vào(...) đóng gói) bằng cách -joinghép các mảng lại và thay thế từng mảng 0bằng a -. (Điều 0này được giải thích dưới đây). Nếu đầu ra bằng 9 dấu gạch ngang, đầu ra You win!exit.

Tiếp theo, chúng tôi đặt cuộn xúc xắc $bcủa mình bằng cách gọi $r( được lưu trữ &) thông qua một số tham số bổ sung. Các Get-Randomlệnh với một -Maximumcủa 6(các -Maximumđược áp dụng) sẽ tạo ra một số nguyên 0-5, bao gồm. Chúng tôi thêm 1vào đó để có được một con súc sắc sáu mặt và thêm nó vào một cuộn chết ngẫu nhiên khác nhân với(($a|sort)[8]-ge7) kiểm tra xem giá trị cao nhất còn lại trên đòn bẩy có phải là một trong những 7,8,9cách sắp xếp đầu tiên $avà sau đó lấy phần tử cuối cùng và kiểm tra xem nó có lớn hơn không -than-hoặc-bằng-với 7. Chúng tôi sử dụng kiểu truyền hình ngầm để biến giá trị Boolean thành 0 (Sai) hoặc 1 (Đúng) cho phép nhân, do đó, "chết" bổ sung là die*0hoặc die*1. Chúng tôi sau đó xuất kết quả của cuộn chết.

Tiếp theo là Read-Hostvào $lbao nhiêu đòn bẩy. Lưu ý rằng PowerShell tự động thêm không gian dấu hai chấm :sau một Read-Hostdấu nhắc, vì vậy chúng tôi nhận được điều đó miễn phí ít nhất. Sau đó, chúng tôi kiểm tra xem số lượng đòn bẩy mà người dùng muốn lật là từ 1 đến 9, nếu không exit.

Bây giờ chúng ta nhập một whilevòng lặp. Mỗi lần lặp của vòng lặp này, chúng ta Read-Hostsẽ sử dụng đòn bẩy, lưu trữ nó vào $ivà trừ đi giá trị đó $b. Sau đó, chúng tôi cũng trừ đi đòn bẩy tương ứng trong mảng và trừ đi bao nhiêu lần để truy vấn người dùng.

Dòng cuối cùng (ngoại trừ nẹp đóng) kiểm tra hai cấu trúc Boolean. Đầu tiên, chỉ$b , sẽ chỉ là $Truenếu người dùng không trừ đúng tất cả các số từ cuộn chết (trong PowerShell, bất kỳ số nào khác không là Truthy). Các điều kiện khác sắp xếp $avà lấy giá trị tối thiểu. Nếu chúng ta trừ đi cùng một đòn bẩy hai lần, thì giá trị tối thiểu sẽ là âm (hoặc Truthy), nếu không thì giá trị tối thiểu sẽ là 0(hoặc Falsey).

Chạy ví dụ:

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!

Giải thích tuyệt vời! +1
Addison Crump
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.