En una ronda del ejercicio de dilema del prisionero , dos jugadores deciden si cooperar o desertar para esa ronda. La puntuación para una ronda es:
- El jugador A y el jugador B cooperan: 1 punto por ambos
- El jugador A y el jugador B tienen ambos defectos: 2 puntos por ambos
- El jugador A coopera y el jugador B presenta defectos: 3 puntos por cooperar con el jugador A y 0 puntos por desertar del jugador B
Sin embargo, no debe preocuparse por la estrategia: su programa simplemente tabulará el puntaje de un juego. (En caso de que ya esté familiarizado con el dilema del prisionero, mis "puntos" aquí corresponden a "años en prisión").
Su desafío es tomar aportes que representen las elecciones de los jugadores en varias rondas y calcular sus puntajes totales respectivos. Un jugador envía las opciones en minúsculas c
y d
(para cooperar y desertar ), y el otro envía las opciones en mayúsculas C
y D
. Estas opciones se proporcionan a su programa como una cadena.
Normalmente, los jugadores en el dilema del prisionero presentan sus movimientos de forma simultánea e iterativa. En este desafío, sin embargo, los jugadores pueden haber presentado sus elecciones para varias rondas a la vez. Si el movimiento de un jugador está fuera de secuencia, el programa de puntuación lo recuerda y lo compara con el siguiente movimiento disponible del jugador contrario.
Aquí hay una cadena de entrada de muestra:
cDCddDDCcCc
Para mostrar las coincidencias que existen en esta entrada, llamaré las minúsculas y mayúsculas por separado, y las emparejaré:
cDCddDDCcCc
c dd c c => cddcc
DC DDC C => DCDDCC
Estos se combinarán en las rondas:
c vs D (3 pts for lowercase-player, 0 pts for uppercase-player)
d vs C (0 pts for lowercase-player, 3 pts for uppercase-player)
d vs D (2 pts for both)
c vs D (3 pts for lowercase-player, 0 pts for uppercase-player)
c vs C (1 pt for both)
Lo que produce la puntuación 9
(minúscula) a 6
(mayúscula), por lo que la salida debe ser 9,6
(o cualquier delimitador inequívoco).
Para expresarlo de otra manera, aquí está cada emparejamiento extraído en su propia fila:
cDCddDDCcCc
cD
Cd
dD
D c
C c
Hay uno sin igual C
, porque el jugador en mayúscula envió más movimientos que el jugador en minúscula. Eso es aceptable, y se ignora por completo para fines de puntuación.
Aquí están los requisitos:
Debe escribir un programa o función que acepte una cadena de la forma de expresión regular
/[cdCD]+/
, a través de algún mecanismo de entrada (STDIN, argumento de función, lectura del archivo, etc.). (Su programa puede opcionalmente aceptar entradas con una nueva línea final).Su programa o función debe generar o devolver los puntajes de los jugadores como una cadena. El formato de salida debe comenzar con el puntaje del jugador en minúscula, seguido del puntaje del jugador en mayúscula, separado por cualquier delimitador no vacío y no numérico de su elección. (Una nueva línea final es opcional).
Si un jugador tiene más movimientos que el otro, se ignoran los movimientos en exceso.
Si todos los movimientos en la entrada provienen exclusivamente de un jugador (es decir, no se han jugado rondas en absoluto), entonces la puntuación de cada jugador es
0
.La presentación más pequeña en bytes gana.
Casos de prueba
Input: cDCddDDCcCc
Output: 9,6 -- or any delimiter; I chose commas here
Input: cccDDD
Output: 9,0
Input: DDDDDDccc
Output: 9,0
Input: cDcDcD
Output: 9,0
Input: dcDDC
Output: 5,2
Input: CcdCDDcd
Output: 6,6
Input: Ddd
Output: 2,2
Input: ccccccccccc
Output: 0,0
(0,0)
o está[0,0]
bien para la salida?Respuestas:
Pyth, 23 bytes
Banco de pruebas
Explicación:
@Gz
: Letras minusculas-zG
: Letras mayúsculasC,
: Emparejar, truncar el resto.`
: Tome la representación de cadena de la lista de pares/L ... "cDDCdd
: Para cada letra"cDDCdd"
, cuente cuántas veces aparece en la cadena anterior repr.c2
: Corta la lista resultante por la mitad.sM
: Sume cada mitad.j
: Únete a las nuevas líneas e imprime.`debe usarse en lugar de s para que el caso en el que una de las partes nunca juegue funcione.
fuente
Haskell,
139134bytesEjemplo de uso:
f "cDCddDDCcCc"
->"9,6"
15 bytes solo para obtener el formato de salida correcto, es decir, convertir un par de números
(x,y)
en una cadena"x,y"
.Cómo funciona:
Editar: @Zgarb me ayudó a ahorrar 5 bytes. ¡Gracias!
fuente
LabVIEW, 77 Bytes
El código escanea desde los tokens y usa esas indicaciones para decidir dónde van los puntos.
Conteo va como este
fuente
Pitón 3, 110
Guardado 5 Bytes gracias a FryAmTheEggman.
Guardado 7 Bytes gracias a los apsillers.
Guardado 26 Bytes gracias a DSM.
Creo que finalmente todo se ha desarrollado.
Escanea a través de cada carácter en la entrada y lo ordena en función de mayúsculas o no. Luego hace algunas matemáticas elegantes que abusan de la conversión implícita de Python de bools a ints.
fuente
JavaScript (ES6),
124118 bytesDemo en vivo
(Ampliado ligeramente para facilitar la lectura).
Guardado 6 bytes gracias a user81655 .
fuente
Par , 49 bytes
Se usa un byte por carácter. Vea aquí .
Explicación
Salidas en el formulario
9 6
.fuente
CJam,
928381 bytesEsto terminó más tiempo de lo que pensé que sería ...
Pruébalo aquí.
Explicación (¿Me atrevo a explicar esto?: O):
fuente