상자를 닫아주세요


12

이 도전에 대한 영감은 게시 당시 엄청나게 분명해야합니다.

작업

상자 스타일 종료 프로그램 (기능, 프로그램 아님)을 작성해야합니다. 상자를 닫는 기본 사항은 다음과 같습니다.

플레이어는 1-9라고 표시된 레버 세트를 돌려 상자를 닫으려고합니다. 레버를 뒤집어 놓아야합니다. 각 턴의 이벤트 순서는 다음과 같습니다.

  1. 레버의 현재 위치가 표시됩니다.
    • 새로운 게임에서는 레버의 위치가로 표시되어야합니다 123456789.
    • 셧 레버가있는 게임에서는 모든 셧 레버가로 표시됩니다 -. 예를 들어, 1, 5 및 9가 종료 된 게임에서 출력은입니다 -234-678-.
  2. 디 (c) e가 롤링된다.
    • 레버 7, 8 및 9가 모두 꺼져 있으면 하나의 6면 다이 만 발생합니다. 그렇지 않으면, 6 개의 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

파이썬 3, 348

Mathias Ettinger 덕분에 5 바이트를 절약했습니다.
DSM 덕분에 7 바이트가 절약되었습니다.

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

언 골프

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

( Get-RandomPowerShell v1에 존재하지 않았 으므로 버전 2 이상 이 필요합니다 ...)

설명:

$arange를 취하여 레버 의 레이 설정을 시작하고 나중에 실행하는 스크립트 블록과 동일하게 1..9설정하십시오 $r(아래 설명 참조 $b). Game Over문구로 설정됩니다 $g무한 루프의 시작 for(){...}. 각 반복마다 출력을 설정하고 배열을 함께 묶어 $o즉시 (...)캡슐화 덕분에 출력합니다 (각 캡슐 을 a로 -join대체) . ( 아래에 설명되어 있습니다). 출력이 9 개의 하이픈과 같으면 출력 및 .0-0You win!exit

다음 으로 몇 가지 추가 매개 변수 를 사용 $b하여 저장된 $r(via &)을 호출하여 주사위 롤을 설정합니다 . Get-RandomA의 명령 -Maximum의은 6합니다 (이 -Maximum암시)를 포함한, 0~5의 정수를 생성 할 것이다. 여기에 16면 다이를 얻기 위해 추가하고 (($a|sort)[8]-ge7), 레버에 남은 가장 높은 값 7,8,9이 먼저 정렬 $a한 다음 마지막 요소를 가져 와서 더 큰지 여부 를 확인 하는 다른 임의의 다이 롤에 곱 합니다. 보다 7. 곱셈에 대해 부울 값을 0 (False) 또는 1 (True)로 변환하기 위해 암시 적 유형 캐스팅을 사용하므로 추가 "die"는 die*0또는 die*1입니다. 그런 다음 다이 롤 결과를 출력합니다.

다음은이다 Read-Host$l얼마나 많은 레버합니다. PowerShell 은 프롬프트 후에 콜론 공간 을 자동으로 추가 하므로 적어도 무료로 콜론 공간 :Read-Host얻습니다. 그런 다음 사용자가 뒤집기를 원하는 레버 수가 1에서 9 사이인지 확인합니다 exit.

이제 while루프를 시작합니다. 이 루프를 반복 할 때마다 Read-Host레버를 저장하고에 $i값을 뺍니다 $b. 그런 다음 배열에서 해당 레버를 빼고 사용자에게 쿼리 할 추가 횟수를 뺍니다.

마지막 줄 (닫는 중괄호 제외)은 두 개의 부울 구성을 테스트합니다. 첫 번째 는 사용자가 다이 롤에서 모든 숫자를 올바르게 빼지 않은 경우 $b에만 해당됩니다 $True(PowerShell에서 0이 아닌 숫자는 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.