帮我关上箱子


12

在发布时,这一挑战的灵感应该非常明显。

任务

您必须创建一个Shut the Box样式程序(不是功能程序)。关闭盒子的基本知识是:

玩家尝试通过转动一组标有1-9的杠杆来关闭盒子。他们必须通过翻转操纵杆来这样做。每个回合的事件顺序如下:

  1. 显示了杠杆的当前位置。
    • 在新游戏中,操纵杆的位置应显示为123456789
    • 在带有关闭杆的游戏中,所有关闭杆均显示为-。例如,在关闭了1、5和9的游戏中,输出为-234-678-
  2. di(c)e被滚动。
    • 如果杠杆7、8和9都断开,则仅抛出一个六面模。否则,将抛出2个六面骰子。
  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 '16

Answers:


3

Python 3、348

多亏了Mathias Ettinger,节省了5个字节。
DSM节省了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

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

不打高尔夫球

/* 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

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-RandomPowerShell v1中不存在...)

说明:

首先通过设置$arange来设置杠杆的范围1..9,然后将其设置为$r等于我们稍后执行的脚本块(下面用进行描述$b)。该Game Over措辞被设置$g在一个无限循环的开始for(){...}。每次迭代中,我们设定输出$o它(感谢,并立即输出(...)封装)由-join荷兰国际集团一起阵列和更换每0一个-。(0下面解释)。如果输出等于9个连字符,则输出You win!exit

接下来,$b通过调用带有一些其他参数的$r(通过&)存储的骰子来设置掷骰子。所述Get-Random的命令-Maximum6(在-Maximum被隐含)将产生从0至5的整数,包括端值。我们将其添加1到六面骰子中,然后将其添加到另一个随机骰子中,乘以(($a|sort)[8]-ge7)该值7,8,9,首先检查排序$a,然后取最后一个元素并检查是否更大,以检查杠杆上剩下的最高值是否是其中之一。等于或等于7。我们使用隐式类型转换将布尔值转换为0(假)或1(真)进行乘法运算,因此附加的“ die”为die*0die*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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.