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:
- 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-
.
- W nowej grze położenie dźwigni powinno być wyświetlane jako
- 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.
- 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.
- Gracz wybiera tyle dźwigni.
- Jeśli suma dźwigni nie jest równa wartości rzuconej di (c) e, gra się kończy.
- 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!
Odpowiedzi:
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.
źródło
C
405403398392390387 bajtówNie golfił
Edycja: D'oh! Pozostawiłem nieużywaną zmienną w mojej odpowiedzi w golfa. Usunąłem go, ale wkleiłem niewłaściwą wersję.
źródło
PowerShell v2 +,
330322 bajtówNowe linie dla przejrzystości:
(Wymaga wersji 2 lub nowszej, ponieważ
Get-Random
nie istniała w PowerShell v1 ...)Wyjaśnienie:
Zacznij od ustawienia
$a
szeregu dźwigni, biorąc zakres1..9
, a także ustaw$r
blok równy skryptowi, który wykonujemy później (opisany poniżej za pomocą$b
).Game Over
Sformułowanie zostanie ustawiony$g
na początku nieskończonej pętlifor(){...}
. Każdej iteracji ustawiamy nasze dane wyjściowe$o
i natychmiast je wyprowadzamy (dzięki(...)
enkapsulacji),-join
łącząc razem tablicę i zamieniając każdą0
z na-
. (0
Wyjaśniono to poniżej). Jeśli wynik jest równy 9 łączników, wyjścieYou win!
iexit
.Następnie ustawiamy nasze rzuty kostkami
$b
, wywołując zapisane$r
(przez&
) dodatkowe parametry.Get-Random
Polecenia z-Maximum
od6
(The-Maximum
implikuje) wytwarzającego liczbę całkowitą od 0 do 5 włącznie. Dodajemy1
do 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 jest7,8,9
najpierw sortowanie,$a
a następnie wzięcie ostatniego elementu i sprawdzenie, czy jest większy -niż-lub-równy7
. 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 albodie*0
albodie*1
. Następnie wyprowadzamy wynik rzutu kostką.Dalej jest,
Read-Host
na$l
ile dźwigni. Zauważ, że PowerShell automatycznie dodaje przestrzeń dwukropka:
poRead-Host
monicie, 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 razieexit
.Teraz wchodzimy w
while
pętlę. Każda iteracja tej pętli, odRead-Host
której my dźwigamy, przechowujemy ją$i
i 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$True
wtedy, gdy użytkownik nie odejmie poprawnie wszystkich liczb z rzutu kostką (w PowerShell, każda niezerowa liczba to Prawda). Drugi warunek sortuje się$a
i 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ść to0
(lub Falsey).Przykładowy przebieg:
źródło