Dentro Dungeons & Dragons , quase tudo é decidido rolando um dado. Normalmente, se a rolagem for maior ou igual a um valor especificado, sua tentativa de fazer o que você deseja fazer será bem-sucedida e falhará de outra forma. Geralmente, um dado de 20 lados (também conhecido como d20) é usado para rolar.
Outras vezes, o sistema de desafio de habilidades é usado. É semelhante ao sistema simples descrito acima, mas o sucesso é determinado pelo fato de o (s) jogador (es) ter sucesso ou não um indivíduo rola um certo número de vezes antes de falhar um certo número de vezes. Por exemplo, o (s) jogador (es) pode estar tentando abrir várias fechaduras em uma porta com um número limitado de fechaduras. Os rolos individuais bem-sucedidos representam a escolha bem-sucedida de um dos bloqueios, e os rolos individuais com falha representam a quebra de um palpite. O sucesso geral significaria selecionar com êxito todos os bloqueios antes de quebrar todos os bloqueios.
Além disso, certos rolos podem ser críticos. Em um d20, rolar 1 é uma falha crítica, resultando na falha imediata de todo o desafio (no exemplo acima, os jogadores podem alertar acidentalmente um guarda). Rolar 20 é um sucesso crítico, resultando no sucesso imediato de todo o desafio (no exemplo acima, o (s) jogador (es) pode encontrar um conjunto de chaves para os bloqueios, eliminando a necessidade de buscá-los). No caso de um teste crítico, o desafio termina imediatamente e o resultado é decidido, independentemente do número anterior de sucessos e falhas.
Nesse desafio, você terá uma dificuldade, o número de sucessos necessários e o número de falhas nas quais o desafio falhou. Você deve simular um jogador que tenta o desafio e gerar o resultado.
Entrada
3 números inteiros, representando o valor que deve ser atendido ou excedido para ter sucesso em um teste individual, o número de sucessos necessários para ter sucesso no desafio e o número de falhas nas quais o desafio falhou. A ordem e o formato das entradas não importa, desde que você especifique qual ordem será usada. A dificuldade será entre 1 e 20, inclusive, e o número de sucessos e falhas será entre 1 e 100, inclusive.
Resultado
Os resultados de cada um dos rolos d20 (números inteiros, em ordem) e o resultado geral do desafio (um valor de verdade / falsey). O formato não importa, desde que os resultados individuais estejam em ordem, o resultado geral ocorre antes ou depois de todos os rolos individuais (você não pode exibir o resultado geral no meio dos rolos, por exemplo) e você especifica qual formato de saída você usa e o usa de forma consistente.
Exemplos (os valores entre parênteses são explicativos e não precisam ser incluídos):
Entrada:
12 5 3 (difficulty successes failures)
Resultado:
15 (success, 1-0)
10 (failure, 1-1)
5 (failure, 1-2)
16 (success, 2-2)
12 (success, 3-2)
15 (success, 4-2)
19 (success, 5-2)
True (overall success)
Entrada:
15 2 3 (difficulty failures successes)
Resultado:
0 (overall failure)
15 (success, 1-0)
12 (failure, 1-1)
13 (failure, 1-2)
Entrada:
5 5 10 (successes failures difficulty)
Resultado:
11 (success, 1-0)
5 (failure, 1-1)
20 (critical success)
1 (overall success)
Entrada:
3 10 3 (failures difficulty successes)
Resultado:
12 (success, 1-0)
11 (success, 2-0)
1 (critical failure)
False (overall failure)
Regras
- Isso é código-golfe , então o código mais curto em bytes ganha
- Você deve escolher aleatoriamente um valor inteiro entre 1 e 20 (inclusive) para cada rolo. Cada valor deve ter uma probabilidade igual de ser escolhido (ou o mais próximo possível da igual).
the number of successes and failures will both be between 1 and 100, inclusive.
Então, sim, existe a possibilidade de uma única falha resultar na falha de todo o desafio.Respostas:
JavaScript,
83787675 bytesEsse código recursivamente conta sucessos e falhas à medida que ocorrem. Quando sucessos (
s
) ou falhas (f
) são contados0
, terminamos com otrue
valor!s
quandos
é0
ou com o valor falso def
quandof
é0
.A saída é da forma de expressão regular
/^(-\d{1,2})+(0|true)$/
(ou, mais estritamente/^(-[1-9]|-1[0-9]|-20)+(0|true)$/
). Ou seja, a entrada possui um hífen inicial, depois os valores do rolo delineados por hífens e, finalmente, o resultado final (0
outrue
), que não é delineado do rolo final. No entanto, essa ainda é uma gramática inequívoca porque o resultado útil e a rolagem final sempre podem ser distinguidos: o último caractere da saída (um0
oue
) é sempre indicativo do resultado, e uma final0
é sempre lida separadamente do (s) número (s) do rolo final.Resultados de amostra para
F(11,3,4)
:Explicação:
Esse código funciona rolando um d20 negativo e (ab) usando os sinais negativos como delimitadores.
As expressões número-menos-booleano funcionam porque
true
efalse
são convertidas para1
e0
em um contexto numérico. Nesse caso,d>-r
será1
se o teste for uma falha e0
se foi um sucesso.fonte
Python, 134 bytes
Obrigado Pietu1998 pelos bytes salvos
Muito simples, provavelmente pode ser jogado um pouco mais, mas precisávamos de algo para começar. Experimente online .
fonte
from random import*
e solterandom.
, use emrandint(1,20)
vez derandrange(20)+1
, substituaand
por*
. Você também pode colocar o resultado final no início da saída, economizando espaço.Python 2,
123121 bytes(Esta resposta combina espaços e tabulações , portanto, o primeiro nível de recuo é um espaço único, enquanto o segundo é uma única guia.)
A função
f
aceita os seguintes argumentos:a
, o limite para um dado individual contar como um sucesso,b
, o número de sucessos necessários para o sucesso geral,c
, o número de falhas necessárias para a falha geral.Em cada rolo de dado,
b
ouc
é diminuído (mas não ambos). Desde que ambos sejam positivos, ele volta a repetir, exceto no caso de falha crítica ou sucesso crítico.Assumindo que não haja sucessos ou falhas críticas, quando o loop termina um
b
ouc
será zero, mas não ambos. Nesse caso, a função retorna o valor atual dec
, que é zero (Falsey) se esgotarmos todas as nossas falhas e positivo (Truthy) se tivermos sucesso.Como bônus, a saída mostra quantas falhas você teve, o que é bom caso haja (digamos) mais bloqueios para escolher mais tarde. (A menos que seja finalizado com uma falha ou êxito crítico, nesse caso a saída será um booleano em vez de um int.)
fonte
Pip , 39 bytes
Alguém disse que queria ver uma solução em um idioma de golfe.
Tenho certeza de que isso não usa nenhum recurso de idioma mais recente que a pergunta. Recebe entrada como argumentos da linha de comando nesta ordem: dificuldade, sucessos necessários, falhas necessárias. Saídas 0 para falha geral ou diferente de zero para êxito geral.Experimente online!
A abordagem é uma estratégia bastante direta, com um ou dois truques retirados de outras soluções. Aqui está uma versão com comentários, espaço em branco e alguma saída extra:
fonte
Ruby 2.2, 75 bytes
Solução iterativa básica. Exemplo de execução:
Pode saída:
Você pode vê-lo em execução no IDEONE aqui .
fonte
VBA 180 bytes
Saída de exemplo
O último dígito da saída será um
0
paraFalse
ou um1
paraTrue
. Cada rolo é separado por uma nova linha. Isso usa o VBA incorporado no RNG,rnd()
conhecido por não ser tão aleatório , mas isso deve atender aos requisitos da melhor maneira possível.fonte
SpecBAS - 165 bytes
A entrada deve ser inserida em ordem de dificuldade, sucessos, falhas.
A nova versão do SpecBAS agora permite "?" em vez de
PRINT
e remove a necessidadeLET
de atribuições de variáveis, portanto, essa foi uma boa maneira de testá-las.Como as matrizes são baseadas em 1 por padrão, a linha 6 retorna 0/1 se a rolagem superar a dificuldade e adiciona 1 para atualizar o índice correto.
fonte
Perl 6 ,
10199 bytesInput é um array mutável que contém dificuldades, sucessos, falhas
A saída é uma lista de dois elementos, o primeiro elemento é uma lista dos valores acumulados, o segundo elemento é o número de falhas restantes.
Uso:
fonte