箱を閉めてくれ


12

このチャレンジのインスピレーションは、投稿の時点でとんでもなく明白なはずです。

タスク

Shut the Boxスタイルのプログラム(関数、プログラムではない)を作成する必要があります。シャットダウンボックスの基本は次のとおりです。

プレイヤーは、1-9のラベルが付いたレバーのセットを回して、ボックスを閉じようとします。彼らはレバーをひっくり返すことによってそうしなければなりません。各ターンのイベントのシーケンスは次のとおりです。

  1. レバーの現在の位置が表示されます。
    • 新しいゲームでは、レバーの位置はとして表示されるはず123456789です。
    • シャットレバーを使用するゲームでは、シャットレバーはすべてとして表示され-ます。たとえば、1、5、および9が閉じられているゲームでは、出力はになります-234-678-
  2. di(c)eは(ロールバックされます)。
    • レバー7、8、および9がすべてオフの場合、1つの6面ダイスのみがスローされます。それ以外の場合、2つの6面ダイスがスローされます。
  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!

ああ。Shut the Boxに関連するチャレンジを作成するために、リストにそれがありました。いいね!
mbomb007

回答:


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

編集: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}
}

Get-RandomPowerShell v1には存在しなかったため、バージョン2以降が必要です...)

説明:

$arangeを取得してレバーのレイを設定することから始め、後で実行するスクリプトブロックに等しく1..9設定し$rます(以下で説明します$b)。Game Over言葉遣いは、に設定されます$g無限ループの開始時にfor(){...}。繰り返しのたびに、出力を設定し、配列をまとめてそれぞれをに置き換えること$oにより、すぐに出力します((...)カプセル化のおかげです)。(以下で説明します)。出力が9つのハイフンに等しい場合は、とを出力します。-join0-0You win!exit

次に、私たちは私たちにダイスロールを設定して$b保存し呼び出すことによって、$r(経由で&いくつかの追加のパラメータを持ちます)。Get-Randomコマンド-Maximumのは、6-Maximum暗黙れる)包括的、0〜5の整数を生成します。それに加え1て、6面ダイスを取得し、それを別のランダムダイスロールに追加して(($a|sort)[8]-ge7)、レバーに残っている最高値が7,8,9最初にソートされ$a、最後の要素を取得してそれが大きいかどうかを確認することによってチェックされます-than-又は等しく対7。暗黙の型キャストを使用して、乗算のブール値を0(False)または1(True)に変換するため、追加の「ダイ」はまたはのいずれdie*0die*1です。次に、ダイスロールの結果を出力します。

次はあるRead-Host$lどのように多くのレバーのために。PowerShell はプロンプトの後にコロンスペースを自動的に追加するため、少なくとも無料で取得できることに注意してください。次に、ユーザーが反転させたいレバーの数が1から9の間にあることを確認します。:Read-Hostexit

whileループに入ります。このループの各反復では、Read-Hostどのレバーを使用してそれをに格納し$i、その値をから減算します$b。次に、配列内の対応するレバーを減算し、ユーザーに照会するためにさらに何回問い合わせるかを減算します。

最後の行(閉じ括弧を除く)は、2つのブール構造をテストします。1つ目は、ユーザーがサイコロからすべての数値を適切に減算しなかった場合$bのみ$Trueです(PowerShellでは、ゼロ以外の数値はTruthyです)。他の条件はソートされ$a、最小値を取ります。同じレバーを2回引いた場合、最小値は負(またはTruthy)になります。それ以外の場合、最小値は(またはFalsey)になります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.