A inspiração para esse desafio deve ser ridiculamente óbvia no momento da postagem.
A tarefa
Você deve criar um programa no estilo Shut the Box (não função, programa). Os princípios básicos de fechar a caixa são:
Os jogadores tentam fechar a caixa girando um conjunto de alavancas identificadas como 1-9. Eles devem fazê-lo girando as alavancas. A sequência de eventos de cada turno é a seguinte:
- A posição atual das alavancas é mostrada.
- Em um novo jogo, a posição das alavancas deve ser exibida como
123456789
. - Em um jogo com alavancas fechadas, todas as alavancas fechadas são exibidas como
-
. Por exemplo, em um jogo com 1, 5 e 9 fechados, a saída seria-234-678-
.
- Em um novo jogo, a posição das alavancas deve ser exibida como
- Os di (c) e (são | são) rolados.
- Se as alavancas 7, 8 e 9 estiverem todas desligadas, apenas um dado de seis faces será lançado. Caso contrário, 2 dados de seis faces são lançados.
- O jogador é solicitado a escolher quantas alavancas deseja virar.
- Se o jogador escolher um número> 9 ou <0, o jogo termina.
- Se o jogador escolher uma alavanca já fechada, o jogo termina.
- O jogador seleciona muitas alavancas.
- Se a soma das alavancas não for igual ao valor dos di (c) e lançados, o jogo termina.
- Se todas as alavancas estiverem fechadas, parabéns, você venceu. Caso contrário, volte para a etapa 1.
Regras para o Programa
- Em cada turno, você deve exibir as posições atuais das alavancas.
- Você deve gerar o valor do rolo com a frase
You rolled:
(observe o espaço). - Você deve solicitar (e aguardar) o número de alavancas para alternar com a frase
How many levers to flip:
(observe o espaço). - Você deve solicitar (e aguardar) quantas alavancas o jogador especificar com a frase
Which lever to flip:
(observe o espaço). - Você deve virar as alavancas especificadas.
- Se a qualquer momento o jogo terminar, você deverá produzir
Game Over
. - Se o jogador terminar um turno sem alavancas abertas, você deverá
You win!
Jogos de exemplo
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!
Respostas:
Python 3, 348
Economizou 5 bytes graças a Mathias Ettinger.
Economizou 7 bytes graças ao DSM.
Ooof, este é longo. Eu também odeio que não haja uma boa maneira de fazer casos de teste.
fonte
C,
405403398392390387 bytesUngolfed
Editar: D'oh! Deixou uma variável não utilizada na minha resposta. Eu o removi, mas colei a versão errada.
fonte
PowerShell v2 +,
330322 bytesNovas linhas para maior clareza:
(Requer a versão 2 ou posterior, pois
Get-Random
não existia no PowerShell v1 ...)Explicação:
Comece definindo o
$a
raio das alavancas, tomando o intervalo1..9
e também defina$r
igual a um bloco de script que executaremos mais tarde (descrito abaixo com$b
). AGame Over
redação é definida$g
no início de um loop infinitofor(){...}
. A cada iteração, configuramos nossa saída$o
e imediatamente a produzimos (graças ao(...)
encapsulamento)-join
reunindo a matriz e substituindo cada0
uma por a-
. (O0
explicado abaixo). Se a saída for igual a 9 hífens, a saídaYou win!
eexit
.Em seguida, configuramos nossos lançamentos de dados
$b
chamando o armazenado$r
(via&
) com alguns parâmetros adicionais. OGet-Random
comando com um-Maximum
de6
(o-Maximum
está implícito) produzirá um número inteiro de 0 a 5, inclusive. Adicionamos1
a isso para obter um dado de seis lados, e adicionamos isso a outro teste aleatório de dados multiplicado pelo(($a|sort)[8]-ge7)
qual verifica se o valor mais alto deixado nas alavancas é o7,8,9
primeiro, classificando$a
e depois pegando o último elemento e verificando se é maior -do-ou-igual-a7
. Usamos a conversão de texto implícita para transformar o valor booleano em 0 (False) ou 1 (True) para a multiplicação, de modo que o "dado" adicional sejadie*0
oudie*1
. Em seguida, produzimos o resultado do rolo de matriz.Em seguida é a
Read-Host
em$l
por quantos alavancas. Observe que o PowerShell adiciona automaticamente o espaço de dois pontos:
após umRead-Host
prompt, por isso obtemos isso de graça pelo menos. Em seguida, verificamos se o número de alavancas que o usuário deseja acionar está entre 1 e 9, caso contrárioexit
.Agora entramos em um
while
loop. A cada iteração desse loop, podemosRead-Host
alavancar, armazenar$i
e subtrair esse valor$b
. Também subtraímos a alavanca correspondente na matriz e subtraímos quantas vezes adicionais para consultar o usuário.A última linha (exceto a chave de fechamento) testa duas construções booleanas. A primeira, apenas
$b
, será apenas$True
se o usuário não subtrair adequadamente todos os números do rolo de matriz (no PowerShell, qualquer número diferente de zero é Truthy). A outra condição classifica$a
e assume o valor mínimo. Se subtrairmos a mesma alavanca duas vezes, o valor mínimo será negativo (ou Verdade), caso contrário, o valor mínimo será0
(ou Falsey).Exemplo de execução:
fonte