Dadas duas listas de jogadas de dados para uma batalha em Risco, seu programa ou função deve gerar quantas tropas cada jogador perde.
fundo
Você não precisa ler isso, pois é apenas um pano de fundo. Vá para o subtítulo "Tarefa" para continuar inabalável.
No jogo de risco , um jogador pode atacar outro jogador (na verdade, isso é necessário para vencer). O resultado de uma batalha é determinado pelo lançamento de dados. Toda batalha ocorre como uma sucessão de sub-batalhas nas quais cada jogador pode perder até 2
suas peças do exército.
Em uma sub-batalha, o defensor e o atacante jogam vários dados cujo número pode variar de acordo com circunstâncias irrelevantes para esse desafio. O dado de maior valor do atacante é comparado ao dado de maior valor do defensor. Se o dado do atacante for maior que o dado do defensor, o defensor perde uma peça. Caso contrário, o atacante perde uma peça.
Então, se ambos os jogadores tiverem pelo menos dois dados, o segundo valor mais alto dos dois jogadores será comparado. Novamente, se o dado do atacante for maior que o dado do defensor, o defensor perde uma peça. Caso contrário, o atacante perde uma peça.
(O defensor vence o empate. Se o defensor e o atacante rolarem a 4
, o atacante perderá uma peça.)
Nesta sub-batalha do artigo da Wikipedia, os dados do atacante são vermelhos e os dados do defensor são brancos. O maior dos dados do atacante é 4
e o maior dos dados do defensor 3
. Como o atacante estava mais alto, o defensor perde uma peça. Os segundos mais altos são 3
para o atacante e 2
para o defensor. Como o atacante voltou a subir, o defensor perde outra peça. Assim, nesta sub-batalha, o atacante não perde peças e o defensor perde 2
peças.
Observe que as terceiras partes mais altas não são comparadas. Isso ocorre porque o defensor não tem mais do que dois dados em uma única sub-batalha, portanto, não há terceiros terceiros maiores para comparar.
Tarefa
Dadas as jogadas de dados não ordenadas (inteiros no intervalo de 1 a 6, inclusive), tanto do atacante quanto do defensor de uma sub-batalha de Risco, em qualquer forma conveniente, produza o número de peças do exército que cada jogador perde. A saída pode estar em qualquer forma conveniente, desde que tenha saídas diferentes para indicar as cinco possibilidades. Você deve indicar quais são essas diferentes saídas em sua pergunta.
A saída é determinada da seguinte forma: Comece com def=0
e atk=0
. Se o maior valor da lista de jogadas de dados do atacante for maior que o maior valor da lista de jogadas de dados do defensor, então aumente def
. Caso contrário, incremente atk
.
Se as duas listas de jogadas de dados tiverem pelo menos comprimento 2
, então: se o segundo maior valor da lista de jogadas de dados do atacante for maior que o segundo maior valor da lista, aumente def
e, de outra forma, aumente atk
.
Por fim, o programa ou função deve gerar um identificador exclusivo para cada uma das 5 possibilidades de saída a seguir:
╔═══╦═══╗
║atk║def║
╠═══╬═══╣
║ 1 ║ 0 ║
║ 0 ║ 1 ║
║ 2 ║ 0 ║
║ 1 ║ 1 ║
║ 0 ║ 2 ║
╚═══╩═══╝
Exemplo
Defensor: [3, 2]
Atacante: [2, 4, 1]
Máximo de defensor 3
e máximo de atacante 4
. 4>3
, então o def=1
segundo do defensor é 2
e o segundo do atacante é 2
. Not(2>2)
então atk=1
. A saída poderia ser então [1,1]
.
Casos de teste
Defender
Attacker
Output (as [def,atk])
-----
[1]
[1]
[0,1]
-----
[6,6]
[1,1,1]
[0,2]
-----
[1,2]
[5,2,3]
[2,0]
-----
[5]
[3,4]
[0,1]
-----
[4]
[4,5]
[1,0]
-----
[1,3]
[1,2,3]
[1,1]
-----
[4]
[4,5,6]
[1,0]
-----
[4,5]
[6,2]
[1,1]
-----
[5]
[6,1,3]
[1,0]
-----
[5,5]
[4,4,1]
[0,2]
-----
[2,5]
[2,2]
[0,2]
-----
[6,6]
[4,4,3]
[0,2]
-----
[2,1]
[4,3]
[2,0]
-----
[4]
[1,5]
[1,0]
-----
[1]
[5,2]
[1,0]
-----
[6,2]
[4]
[0,1]
-----
[4,2]
[2,5,5]
[2,0]
-----
[2]
[6,6,2]
[1,0]
-----
[6]
[2,6]
[0,1]
-----
[3,1]
[1]
[0,1]
-----
[6,2]
[3,5,2]
[1,1]
-----
[4,2]
[1,1]
[0,2]
-----
[4,3]
[5,4,1]
[2,0]
-----
[5,6]
[1,2]
[0,2]
-----
[3,2]
[4,4]
[2,0]
-----
[2]
[6,3,4]
[1,0]
-----
[1,4]
[6,2,4]
[2,0]
-----
[4,2]
[2,5,4]
[2,0]
-----
[5]
[6,2,1]
[1,0]
-----
[3]
[2,5,4]
[1,0]
-----
[5,4]
[2]
[0,1]
-----
[6,3]
[2,6,5]
[1,1]
-----
[3,1]
[4]
[1,0]
-----
[4]
[6,6,5]
[1,0]
-----
[6,3]
[4,2]
[0,2]
-----
[1,6]
[5,4]
[1,1]
-----
[3,6]
[4,4]
[1,1]
-----
[5,4]
[5,1,1]
[0,2]
-----
[6,3]
[5,4]
[1,1]
-----
[2,6]
[1,2]
[0,2]
-----
[4,2]
[3,5,5]
[2,0]
-----
[1]
[1,2,1]
[1,0]
-----
[4,5]
[1,6]
[1,1]
-----
[1]
[3,5,1]
[1,0]
-----
[6,2]
[6,2]
[0,2]
Implementação de amostra
Python 2 ou 3
def risk(atk_rolls,def_rolls):
# set the rolls in descending order, e.g. [5,3,2]
atk_rolls = sorted(atk_rolls,reverse = True)
def_rolls = sorted(def_rolls,reverse = True)
# minimum length.
minlen = min(len(atk_rolls),len(def_rolls))
atk_lost = 0
def_lost = 0
# compare the highest-valued rolls
if atk_rolls[0]>def_rolls[0]:
def_lost += 1
else:
atk_lost += 1
if minlen == 2:
# compare the second-highest-valued rolls
if atk_rolls[1] > def_rolls[1]:
def_lost += 1
else:
atk_lost += 1
return [def_lost, atk_lost]
Especificações
- A entrada pode ser tomada como qualquer forma que codifique claramente apenas as jogadas do defensor e as jogadas do atacante.
- A saída pode estar em qualquer forma que forneça uma saída exclusiva para cada uma das cinco possibilidades listadas acima.
- Rolos do defensor são uma lista de
1
ou2
inteiros no conjunto[1,2,3,4,5,6]
. Rolos do atacante são uma lista de1
para3
inteiros no conjunto[1,2,3,4,5,6]
. - Como se trata de código-golfe , o código mais curto em cada idioma vence! Você não deixar respostas em línguas golfe desanimá-lo de respostas postar em outras línguas.
fonte
Respostas:
Portões NAND, 237
Criado com o Logisim
As entradas são binárias sem sinal de 3 bits, inseridas à esquerda. As saídas (2 bits) estão à direita.
É muito grande para caber na tela e o Logisim não pode ampliar, portanto a imagem é em preto e branco. Desculpe :(
Funciona para todos os casos de teste.
Provavelmente, há uma maneira melhor de fazer isso usando algum circuito de memória, permitindo que grandes seções sejam reutilizadas.
fonte
Geléia ,
1211 bytesUm link monádico que faz uma lista de
Defender, Attacker
jogadas (cada uma como listas), retornando um número inteiro entre-2
e2
inclusive (perdas do defensor - perdas do atacante):Experimente online! ou consulte um conjunto de testes (que mapeia os resultados para o formato OP).
Quão?
fonte
Retina , 82 bytes
Experimente online! A primeira linha de entrada é o dado do atacante, a segunda é o dado do defensor. Retornos (em linhas separadas)
AA
,AD
,DD
,A
ouD
como apropriado.fonte
Python 2 ,
8375 bytesExperimente online!
Saída é perdas do defensor - perdas do atacante
fonte
MATL , 23 bytes
Experimente online!
Não sei por que os defensores têm mais dados do que os atacantes, mas talvez eu não seja tão versado em risco. O programa principal é justo
>t~,sD
, todos os outros bytes existem para permitir diferentes comprimentos de entrada, com um pouco de classificação. A entrada é atacante seguida pelo defensor, a saída é perda do atacante seguida por perdas do defensor.fonte
JavaScript (SpiderMonkey) ,
978378 bytesExperimente online!
-4 bytes e correções graças a @ovs e @Craig Ayre
-1 byte graças a @Shaggy
fonte
d=>a=>{for(u=v=0;d.sort()>[]&a.sort()>[];)a.pop()>d.pop()?u++:v++;return[u,v]}
Casca , 10 bytes
Experimente online!
Introduza como duas listas separadas de rolos, produza como no op.
Explicação
¤z>Ö>
classifica cada lista em ordem decrescente e, em seguida, compacta-os comparando os elementos correspondentes (e truncando a lista mais longa).M#eI¬
cria uma lista de 2 elementos (e
) com contagens (#
) de valores verdadeiros (através da identidadeI
) e valores falsificados (através da negação lógica¬
)fonte
Perl 5 , 66 + 1 (-a) = 67 bytes
Experimente online!
Entrada:
Duas linhas. A primeira linha é defensora (jogador 1), a segunda é atacante (jogador 2). Rolos individuais separados por espaços.
Resultado:
Indica mudança efetiva na força do defensor contra o atacante.
fonte
Gelatina , 30 bytes
Experimente online!
Veeeeeeeery ungolfed! > _ <
Emite valores exatamente como nos casos de teste.
fonte
R , 46 bytes
Experimente online!
Tudo isso faz três tipos e uma comparação ... além de extrair os dois primeiros elementos no meio.
A entrada é dois vetores de rolos de dados.
Saída codificada da seguinte forma:
Funciona porque a extração em R não recicla seu argumento, mas preenche o resultado com
NA
o comprimento solicitado.fonte