El juego de mesa Terra Mystica tiene algunas mecánicas muy interesantes para uno de los principales recursos, el poder. En lugar de obtener y gastar unidades de poder de un banco, cada jugador comienza el juego con exactamente 12 unidades de poder que se distribuyen en tres "cuencos", que están etiquetados como I, II y III. Ganar y gastar poder simplemente cambia el poder entre estos cuencos:
- Para gastar una unidad de poder, muévala del tazón III al tazón I (siempre que tenga una unidad en el tazón III).
- Cuando ganes una unidad de poder, si hay una unidad en el tazón I, muévela al tazón II. Si no hay unidades en el recipiente I, pero hay una unidad en el recipiente II, muévala al recipiente III. Si todas las unidades ya están en el recipiente III, no pasa nada.
- Cuando gana o gasta varias unidades a la vez, se procesan una unidad a la vez.
Aquí hay un ejemplo. Digamos, un jugador comienza con la siguiente distribución de poder (dada en orden I | II | III
):
5 | 7 | 0
Su poder cambia de la siguiente manera si ganan y gastan poder varias veces:
5 | 7 | 0
Gain 3 ==> 2 | 10 | 0
Gain 6 ==> 0 | 8 | 4 (move 2 power from I to II,
then the remaining 4 from II to III)
Gain 7 ==> 0 | 1 | 11
Spend 4 ==> 4 | 1 | 7
Gain 1 ==> 3 | 2 | 7
Spend 7 ==> 10 | 2 | 0
Gain 12 ==> 0 | 10 | 2 (move 10 power from I to II,
then the remaining 2 from II to III)
Gain 12 ==> 0 | 0 | 12 (the two excess units go to waste)
Su tarea es calcular el resultado de uno de esos eventos de ganancia o gasto.
El reto
Te dan cuatro enteros como entrada. Los tres primeros, I
, II
, III
, representan la cantidad de energía en cada uno de los tres tazones. No serán negativos y sumarán 12. El cuarto número, P
es la cantidad de poder ganado o gastado, y estará en el rango inclusivo [-III, 24]
(por lo que puede suponer que el jugador nunca intentará gastar más poder). de lo que pueden actualmente, pero podrían estar ganando más poder del que necesitan para mover todo el poder al bol III).
Puede tomar estos números en cualquier orden consistente, como argumentos separados, como una lista de enteros o como una cadena que contiene estos enteros. También se puede tomar P
como un argumento, como I
, II
, III
como un argumento lista separada.
Usted debe de salida tres enteros I'
, II'
, III'
que representan la cantidad de energía en cada plato después de P
unidades se adquirieron o se gastan, siguiendo las reglas explicadas anteriormente.
Puede escribir un programa o una función y utilizar cualquiera de nuestros métodos estándar para recibir entradas y proporcionar salidas.
Puede usar cualquier lenguaje de programación , pero tenga en cuenta que estas lagunas están prohibidas por defecto.
Este es el código de golf , por lo que gana la respuesta válida más corta, medida en bytes .
Casos de prueba
I II III P => I' II' III'
5 7 0 3 => 2 10 0
2 10 0 6 => 0 8 4
0 8 4 7 => 0 1 11
0 1 11 -4 => 4 1 7
4 1 7 0 => 4 1 7
4 1 7 1 => 3 2 7
3 2 7 -7 => 10 2 0
10 2 0 12 => 0 10 2
0 10 2 12 => 0 0 12
fuente
Respuestas:
Mathematica, 52 bytes
Esta es una función sin nombre que toma una lista
{I, II, III, P}
como entrada y devuelve una lista{I', II', III'}
.Una solución de forma cerrada. Realmente no se siente óptimo todavía ...
fuente
{##,12-+##}&[#-#4~Min~#,Max[#2+#-Abs[#4~Max~0-#],0]]&
es un byte más largo. Aunque me gusta12-+##
.C,
9794 bytesEn forma no golfista:
fuente
Python 2, 104 bytes
Pruébalo en línea
Sin golf:
fuente
Haskell, 58 bytes
El valor intermedio
m
denota la cantidad de energía que va desde (o hacia, si es negativo) el primer tazón,z
denota la cantidad de energía en el tercer tazón después de la acción. Una optimización de un byte de último minuto cambió la antigua expresión para el segundo tazón de12-a+m-z
usar la identidada+b+c=12
.El tipo de resultado natural es un triple para los tazones, por lo que la entrada también toma los tazones como un triple y el cambio de potencia como un segundo argumento. Esto permite manejar todos los casos de prueba con una aplicación de
scanl
:fuente
Röda ,
10094 bytesSin golf:
fuente
++
y--
?JavaScript,
6159 bytesPruébalo en línea!
fuente
GNU sed , 66 bytes
Incluye +1 para
-r
Utiliza unario (ver este consenso ).
Pruébalo en línea!
fuente
Retina ,
46413938 bytesGracias a Martin Ender por múltiples sugerencias útiles!
Toma entrada en unario. La primera línea contiene las cantidades de energía en los tres cuencos, separados por comas, la segunda línea la cantidad de energía para ciclar.
Banco de pruebas : toma todas las entradas en una sola línea y convierte de decimal a unario y viceversa para mayor comodidad de uso.
Explicación
Caso positivo: eliminamos repetidamente el inicio
1
de la segunda línea, y movemos un1
del primer tazón no vacío al siguiente, siempre que esta operación sea posible (es decir, el número de potencia para el ciclo no es cero y no todos el poder está en el tercer tazón). Els
modificador significasingle-line
, lo.
que permite coincidir también con la nueva línea.Caso negativo: hecho todo en un solo paso, moviendo la cantidad de energía indicada por la última entrada desde el tercer al primer tazón. Esto también eliminará la línea que contiene la cantidad negativa de potencia para moverse.
Mantenga (grep) solo líneas que contengan una coma. Esto eliminará los eventuales restos de la primera línea.
fuente
Python 2, 91 bytes
Basado en esta respuesta
Pruébalo en línea
Sin golf:
fuente
Lote, 87 bytes
Use las siguientes fórmulas:
Como Batch no tiene un operador menor que, calculo
i = min(-i, 0)
usandoi*=i>>5
.fuente
Perl 6 , 99 bytes
Sea
a
,b
yc
sea el número de fichas iniciales en los tazones I, II y III, respectivamente. Luego, para el caso de poder adicional, se crea una lista que contienea
copias del triplete(-1, 1, 0)
, seguidas dea + b
copias del triplete(0, -1, 1)
, seguidas de infinitas copias de0
. Los primerosd
elementos de esta lista, qued
son la cantidad de energía que se agrega, se agregan en forma de elementos a la distribución de energía inicial.Para restar potencia (negativo
d
), se utiliza una forma cerrada simple:(a - d, b, c + d)
.fuente
tinylisp , 134 bytes
Define una función
f
que toma cuatro argumentos, los tres tazones (x y z
) y la cantidad de energía que se transmite (p
), y devuelve una lista de los tres tazones después de la transacción. Aquí hay una versión correctamente espaciada con todos los casos de prueba: ¡ Pruébelo en línea!fuente