Simulador de competición piedra-papel-tijera

9

Decidiste organizar un campeonato de piedra, papel o tijera para descubrir quién es el mejor. No debes dejar que la suerte decida el ganador, por lo que todos tienen que darte su táctica por escrito antes de la competencia. También le gustan las cosas simples, por lo que el movimiento de un competidor (que muestra piedra, papel o tijera) debe basarse solo en el turno anterior (RvR, RvP, RvS, PvR, PvP, PvS, SvR, SvP o SvS). En el primer turno, un jugador tiene que mostrar un signo fijo.

Decidiste escribir un programa (o función) para simular el campeonato.

Detalles de la competencia.

  • Habrá al menos 2 concursantes.
  • Cada jugador juega exactamente un partido con todos los demás.
  • Un partido dura 7 rondas.
  • En cada ronda, el ganador obtiene 2 puntos y el perdedor ninguno. En caso de empate, ambos jugadores obtienen 1 punto.
  • La puntuación de un jugador en un partido es la suma de sus puntos en los turnos del partido.
  • La puntuación final de un jugador en el campeonato es la suma de sus puntos en todos los partidos.

Detalles de la entrada:

  • tu programa o función recibe N10 cadenas largas de caracteres, cada una de ellas corresponde a la estrategia de un jugador. Todos los personajes son (minúsculas) r po ssignifican que en la situación dada el jugador mostrará papel de piedra o tijeras.
  • La primera letra codifica el primer turno (en cada partido para ese competidor). El segundo muestra lo que sucede si la última ronda fue rock vs rock. Los siguientes son RvP, RvS, PvR, PvP, PvS, SvR, SvP y SvS donde la primera letra es el signo del jugador y la segunda es el oponente. Por ejemplo, rrpsrpsrpssignifica que el jugador comienza con piedra y luego copia el último movimiento del oponente.
  • Puede ingresar la lista de cadenas como una lista / matriz o datos similares de su idioma o como una cadena. En este último caso, es imprescindible algún tipo de carácter separador.

Detalles de la salida:

  • Su programa o función debe generar los puntajes finales de cada jugador en el mismo orden en que se proporcionó la entrada.
  • Las puntuaciones deben estar separadas por espacios o líneas nuevas. Se permite espacio final o nueva línea.

Ejemplos:

Entrada: ['rrpsrpsrps', 'rpppsprrpr']

Salida: 5 9(los turnos son rvr rvp pvs svp pvr rvp pvs)

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

Salida: 13 17 12(los partidos son 5-9(1 ° vs 2 °), 8-6(1 ° vs 3 °) y 8-6(2 ° vs 3 °))

Este es el código de golf, por lo que gana la entrada más corta.

randomra
fuente
¿Inspirado en Numberphile? ;-)
Jakube
¿Es correcto el segundo ejemplo? Creo que el primero pierde contra el tercero con 6-8y el segundo pierde contra el tercero con 6-8.
Jakube
@Jakube Entrada de ejemplo corregida. Gracias.
randomra

Respuestas:

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

La lógica del programa: puedo convertir las letras a número ( r=0, p=1, s=2). mes el número de la primera, nel número de la segunda persona. Debido a que el juego es cíclico, (m-n)%3ya determina el resultado. Y, por supuesto, puedo cambiar el resultado por uno f=(m+1-n)%3. Ahora f=0significa que el segundo jugador qgana, f=1significa un empate y el f=2primer jugador pgana. También es el puntaje para el jugador 1. Por lo tanto, solo necesito agregar todos los valores (p!=q)*(m+1-n)%3para cada jugador.

Pruébalo con print f(['rrpsrpsrps', 'rpppsprrpr', 'ssssssssss'])

Jakube
fuente