Simulador de competição pedra-papel-tesoura

9

Você decidiu organizar um campeonato de pedra-papel-tesoura para descobrir quem é o melhor. Você não quer deixar a sorte decidir o vencedor, para que todos tenham que lhe dar sua tática por escrito antes da competição. Você também gosta de coisas simples, para que uma jogada de um competidor (mostrando pedra, papel ou tesoura) tenha que ser baseada apenas no turno anterior (RvR, RvP, RvS, PvR, PvP, PvS, SvR, SvP ou SvS). No primeiro turno, um jogador tem que mostrar um sinal fixo.

Você decidiu escrever um programa (ou função) para simular o campeonato.

Detalhes da competição

  • Haverá pelo menos 2 participantes.
  • Todo jogador joga exatamente uma partida com todos os outros.
  • Uma partida dura 7 rodadas.
  • Em cada rodada, o vencedor ganha 2 pontos, o perdedor não recebe nenhum. Em caso de empate, ambos os jogadores marcam 1 ponto.
  • A pontuação de um jogador em uma partida é a soma dos seus pontos ao longo dos turnos da partida.
  • A pontuação final de um jogador no campeonato é a soma de seus pontos em todas as partidas.

Detalhes da entrada:

  • seu programa ou função recebe N10 caracteres de comprimento, cada um deles corresponde à estratégia de um jogador. Todos os caracteres são (minúsculos) r pou ssignificam que, numa determinada situação, o jogador mostrará papel de pedra ou tesoura.
  • A primeira letra codifica o primeiro turno (em todas as partidas desse competidor). O segundo mostra o que acontece se a última rodada foi rock vs rock. Os próximos são RvP, RvS, PvR, PvP, PvS, SvR, SvP e SvS, onde a primeira letra é o sinal do jogador e a segunda é o oponente. Por exemplo, rrpsrpsrpssignifica que o jogador começa com rock e depois copia o último movimento do oponente.
  • Você pode inserir a lista de cadeias como uma lista / matriz ou dados semelhantes do seu idioma ou como uma cadeia. Neste último caso, algum tipo de caractere separador é obrigatório.

Detalhes da saída:

  • Seu programa ou função deve produzir as pontuações finais de cada jogador na mesma ordem em que a entrada foi fornecida.
  • As pontuações devem ser separadas por espaços ou novas linhas. É permitido espaço à direita ou nova linha.

Exemplos:

Entrada: ['rrpsrpsrps', 'rpppsprrpr']

Saída: 5 9(as voltas são rvr rvp pvs svp pvr rvp pvs)

Entrada: ['rrpsrpsrps', 'rpppsprrpr', 'ssssssssss']

Saída: 13 17 12(as correspondências são 5-9(1º vs 2º), 8-6(1º vs 3º) e 8-6(2º vs 3º))

Isso é código-golfe, portanto a entrada mais curta vence.

randomra
fonte
Inspirado por Numberphile? ;-)
Jakube
O segundo exemplo está correto? Eu acho que o primeiro perde contra o terceiro com 6-8e o segundo perde contra o terceiro com 6-8.
Jakube 30/01
@Jakube Exemplo de entrada corrigido. THX.
randomra 30/01

Respostas:

2

Python 2: 201 188 caracteres

def f(Q):c=lambda m:'rps'.index(m);l=len(Q);r=[0]*l;i=0;exec'p,q=i/l,i%l;m,n=c(Q[p][0]),c(Q[q][0]);exec"r[p]+=(p!=q)*(m+1-n)%3;m,n=c(Q[p][m*3+n+1]),c(Q[q][n*3+m+1]);"*7;i+=1;'*l*l;return r

A lógica do programa: converter as letras para o número ( r=0, p=1, s=2). mé o número da primeira, no número da segunda pessoa. Como o jogo é cíclico, (m-n)%3já determina o resultado. E, claro, posso mudar o resultado em um f=(m+1-n)%3. Agora f=0, o segundo jogador qvence, o f=1empate e o f=2primeiro jogador pvence. Também já é a pontuação do jogador 1. Portanto, eu só preciso adicionar todos os valores (p!=q)*(m+1-n)%3para cada jogador.

Teste com print f(['rrpsrpsrps', 'rpppsprrpr', 'ssssssssss'])

Jakube
fonte