Pomóż mi zamknąć skrzynkę

12

Inspiracja do tego wyzwania powinna być absurdalnie oczywista w momencie publikacji.

Zadanie

Musisz utworzyć program w stylu Shut the Box (nie funkcja, program). Podstawy zamknięcia pudełka to:

Gracze próbują zamknąć pudełko, obracając zestaw dźwigni oznaczonych 1-9. Muszą to zrobić, przesuwając dźwignie. Sekwencja wydarzeń każdej tury jest następująca:

  1. Aktualna pozycja dźwigni jest pokazana.
    • W nowej grze położenie dźwigni powinno być wyświetlane jako 123456789.
    • W grze z dźwigniami zamykającymi wszystkie dźwignie zamykające są wyświetlane jako -. Na przykład w grze, która ma 1, 5 i 9 zamkniętych, wyjście byłoby -234-678-.
  2. Di (c) e (is | are) walcowane.
    • Jeśli wszystkie dźwignie 7, 8 i 9 są wyłączone, rzucana jest tylko jedna kostka o sześciu twarzach. W przeciwnym razie rzucane są 2 kostki o sześciu twarzach.
  3. Gracz zostanie poproszony o wybranie liczby dźwigni, które chce przerzucić.
    • Jeśli gracz wybierze liczbę> 9 lub <0, gra się kończy.
    • Jeśli gracz wybierze dźwignię już zamkniętą, gra się kończy.
  4. Gracz wybiera tyle dźwigni.
    • Jeśli suma dźwigni nie jest równa wartości rzuconej di (c) e, gra się kończy.
  5. Jeśli wszystkie dźwignie są zamknięte, gratulacje, wygrywasz. W przeciwnym razie wróć do kroku 1.

Zasady programu

  • Na każdym zakręcie powinieneś wyprowadzać bieżące pozycje dźwigni.
  • Musisz podać wartość rzutu wraz ze zwrotem You rolled:(zwróć uwagę na spację).
  • Musisz zapytać (i poczekać), aby liczba dźwigni przełączyła się z frazą How many levers to flip:(zwróć uwagę na spację).
  • Musisz poprosić (i poczekać) o tyle dźwigni, ile gracz określił frazą Which lever to flip:(zwróć uwagę na spację).
  • Musisz przerzucić określone dźwignie.
  • Jeśli w którymkolwiek momencie gra się skończy, musisz wydać wynik Game Over.
  • Jeśli gracz zakończy turę bez otwartych dźwigni, musisz oddać wynik You win!

Przykładowe gry

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!
Addison Crump
źródło
O. Miałem go na swojej liście, aby stworzyć wyzwanie z udziałem Shut the Box. Ładny!
mbomb007

Odpowiedzi:

3

Python 3, 348

Zaoszczędź 5 bajtów dzięki Mathiasowi Ettingerowi.
Zaoszczędź 7 bajtów dzięki DSM.

Oj, to jest długie. Nienawidzę również tego, że nie ma dobrego sposobu na testowanie przypadków.

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!')
Morgan Thrapp
źródło
2

C 405 403 398 392 390 387 bajtów

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

Nie golfił

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

Edycja: D'oh! Pozostawiłem nieużywaną zmienną w mojej odpowiedzi w golfa. Usunąłem go, ale wkleiłem niewłaściwą wersję.

Cole Cameron
źródło
2

PowerShell v2 +, 330 322 bajtów

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

Nowe linie dla przejrzystości:

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

(Wymaga wersji 2 lub nowszej, ponieważ Get-Randomnie istniała w PowerShell v1 ...)

Wyjaśnienie:

Zacznij od ustawienia $aszeregu dźwigni, biorąc zakres 1..9, a także ustaw $rblok równy skryptowi, który wykonujemy później (opisany poniżej za pomocą $b). Game OverSformułowanie zostanie ustawiony $gna początku nieskończonej pętli for(){...}. Każdej iteracji ustawiamy nasze dane wyjściowe $oi natychmiast je wyprowadzamy (dzięki (...)enkapsulacji), -joinłącząc razem tablicę i zamieniając każdą 0z na -. ( 0Wyjaśniono to poniżej). Jeśli wynik jest równy 9 łączników, wyjście You win!i exit.

Następnie ustawiamy nasze rzuty kostkami $b, wywołując zapisane $r(przez &) dodatkowe parametry. Get-RandomPolecenia z -Maximumod 6(The -Maximumimplikuje) wytwarzającego liczbę całkowitą od 0 do 5 włącznie. Dodajemy 1do tego sześciokątną kostkę i dodajemy ją do kolejnego losowego rzutu kostką pomnożonego przez, (($a|sort)[8]-ge7)który sprawdza, czy najwyższą wartością pozostawioną na dźwigni jest 7,8,9najpierw sortowanie, $aa następnie wzięcie ostatniego elementu i sprawdzenie, czy jest większy -niż-lub-równy 7. Używamy niejawnego rzutowania typu, aby przekształcić wartość logiczną w 0 (False) lub 1 (True) w celu pomnożenia, więc dodatkowa „die” to albo die*0albo die*1. Następnie wyprowadzamy wynik rzutu kostką.

Dalej jest, Read-Hostna $lile dźwigni. Zauważ, że PowerShell automatycznie dodaje przestrzeń dwukropka :po Read-Hostmonicie, więc otrzymujemy to przynajmniej za darmo. Następnie sprawdzamy, czy liczba dźwigni, które użytkownik chce przerzucić, wynosi od 1 do 9, w przeciwnym razie exit.

Teraz wchodzimy w whilepętlę. Każda iteracja tej pętli, od Read-Hostktórej my dźwigamy, przechowujemy ją $ii odejmujemy tę wartość $b. Następnie odejmujemy również odpowiednią dźwignię w tablicy i odejmujemy, ile dodatkowych razy, aby zapytać użytkownika.

Ostatnia linia (oprócz klamry zamykającej) testuje dwie konstrukcje boolowskie. Pierwszy, po prostu $b, będzie miał miejsce tylko $Truewtedy, gdy użytkownik nie odejmie poprawnie wszystkich liczb z rzutu kostką (w PowerShell, każda niezerowa liczba to Prawda). Drugi warunek sortuje się $ai przyjmuje minimalną wartość. Jeśli dwukrotnie odejmiemy tę samą dźwignię, wówczas minimalna wartość będzie ujemna (lub Prawda), w przeciwnym razie minimalna wartość to 0(lub Falsey).

Przykładowy przebieg:

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!
AdmBorkBork
źródło
Doskonałe wyjaśnienie! +1
Addison Crump