Вдохновение для этого вызова должно быть смехотворно очевидно во время публикации.
Задание
Вы должны создать программу в стиле Shut the Box (не функция, а программа). Основы закрытой коробки:
Игроки пытаются закрыть ящик, повернув набор рычагов с метками 1-9. Они должны сделать это, щелкая рычаги. Последовательность событий каждого хода такова:
- Текущее положение рычагов показано.
- В новой игре положение рычагов должно отображаться как
123456789
. - В игре с закрытыми рычагами все закрытые рычаги отображаются как
-
. Например, в игре с закрытыми 1, 5 и 9 выводом будет-234-678-
.
- В новой игре положение рычагов должно отображаться как
- Ди (с) е (есть | являются) проката.
- Если все рычаги 7, 8 и 9 выключены, бросается только один шестигранный кубик. В противном случае бросаются 2 шестигранных кубика.
- Игроку предлагается выбрать, сколько рычагов он хочет щелкнуть.
- Если игрок выбирает число> 9 или <0, игра заканчивается.
- Если игрок выбирает уже закрытый рычаг, игра заканчивается.
- Игрок выбирает столько рычагов.
- Если сумма рычагов не равна значению брошенного ди (с) е, игра заканчивается.
- Если все рычаги закрыты, поздравляю, вы выиграли. В противном случае вернитесь к шагу 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!
Ответы:
Питон 3, 348
Сохранено 5 байтов благодаря Матиасу Эттингеру.
Сохранено 7 байтов благодаря DSM.
Ох, это долго. Я также ненавижу, что нет хорошего способа делать тестовые случаи.
источник
C
405403398392390387 байтUngolfed
Редактировать: D'Oh! Оставил неиспользованную переменную в моем ответе по гольфу. Я удалил его, но вставил не ту версию.
источник
PowerShell v2 +,
330322 байтаНовые строки для ясности:
(Требуется версия 2 или более поздняя, поскольку
Get-Random
в PowerShell v1 не было ...)Объяснение:
Начните с установки
$a
ряда рычагов, взяв диапазон1..9
, а также установите$r
равным блоку скрипта, который мы выполним позже (описано ниже с помощью$b
).Game Over
Формулировка получает значение$g
в начале бесконечного циклаfor(){...}
. На каждой итерации мы устанавливаем наш вывод$o
и немедленно выводим его (благодаря(...)
инкапсуляции),-join
объединяя массив и заменяя каждый0
на-
. (0
Объясняется ниже). Если результат равен 9 дефисам, выведитеYou win!
иexit
.Затем мы устанавливаем наши броски костей
$b
, вызывая хранимые$r
(через&
) некоторые дополнительные параметры.Get-Random
Команда с-Maximum
из6
(-Maximum
подразумеваются) будет производить целое число от 0 до 5 включительно. Мы добавляем1
к этому, чтобы получить шестигранный кубик, и добавляем его к другому случайному броску кубика, умноженному на(($a|sort)[8]-ge7)
который проверяется, является ли наибольшее значение, оставшееся на рычагах, одним из них7,8,9
, сначала сортируя,$a
а затем беря последний элемент и проверяя, больше ли он -то-или-равно7
. Мы используем неявные типажи , чтобы включить логическое значение в 0 (ложь) или 1 (True) для умножения, так что дополнительные «умирает» либоdie*0
илиdie*1
. Затем мы выводим результат броска кубика.Далее идет
Read-Host
в$l
течение скольких рычагов. Обратите внимание, что PowerShell автоматически добавляет двоеточие:
послеRead-Host
запроса, так что мы получаем его по крайней мере бесплатно. Затем мы проверяем, что количество рычагов, которые пользователь хочет перевернуть, составляет от 1 до 9, иначеexit
.Теперь мы входим в
while
петлю. Каждую итерацию этого цикла мыRead-Host
определяем, сохраняем в$i
и вычитаем это значение из$b
. Затем мы также вычитаем соответствующий рычаг в массиве и вычитаем, сколько дополнительных раз нужно запросить у пользователя.Последняя строка (исключая закрывающую скобку) проверяет две логические конструкции. Первое, просто
$b
, будет, только$True
если пользователь не вычел все числа из броска кубика (в PowerShell любое ненулевое число - это Истина). Другое условие сортирует$a
и принимает минимальное значение. Если мы вычли один и тот же рычаг дважды, то минимальное значение будет отрицательным (или Truthy), в противном случае минимальное значение будет0
(или Falsey).Пример выполнения:
источник