Costos de recursos de la red eléctrica

14

Costos de recursos de la red eléctrica

Introducción

En el juego de mesa Power Grid , una parte integral del juego es el acto de comprar recursos para alimentar tus estaciones de energía. Hay cuatro tipos de recursos utilizados en el juego (cinco, si incluye energía renovable, pero obviamente no puede comprar recursos para eso). Estos son carbón, aceite, basura y uranio. El mercado de recursos se ve así:

Una ilustración del mercado de recursos, tomada del libro de reglas

1---- | 2---- | 3---- | 4---- | 5---- | 6---- | 7---- | 8---- | 10  | 12
CCC   | CCC   | CCC   | CCC   | CCC   | CCC   | CCC   | CCC   |  U  |  U
OOO U | OOO U | OOO U | OOO U | OOO U | OOO U | OOO U | OOO U | 14  | 16
GGG   | GGG   | GGG   | GGG   | GGG   | GGG   | GGG   | GGG   |  U  |  U

Cuando se compran recursos, se toman de la izquierda del mercado, donde son más baratos. Cuando se agregan nuevos recursos al mercado, se agregan desde la derecha. Como puede verse, esto produce un equilibrio entre la oferta y la demanda: si se compran más recursos de un tipo particular de los que se reponen en cada ronda, el precio de ese recurso aumentará. Del mismo modo, si es menor, el costo se reducirá.

El carbón, el petróleo y la basura aumentan su costo a la misma velocidad, mientras que el uranio aumenta mucho más rápido. Una sola unidad de un recurso que no sea de uranio cuesta 8 - floor((<units available> - 1) / 3). Una sola unidad de uranio cuesta 13 - <units available>si hay 5 o más unidades disponibles, y de lo 18 - (2 * <units available>)contrario.

Por ejemplo, al comienzo del juego hay 24 unidades de carbón disponibles para comprar. Si el primer jugador quisiera comprar 4 unidades de Carbón, las primeras tres unidades costarían 1 cada una, y la cuarta costaría 2, lo que hace que el costo total sea 5. Esto deja 20 unidades disponibles. Si el segundo jugador también quisiera comprar 4 unidades de Carbón, el costo sería (2 * 2 + 2 * 3) = 10.

El reto

Su desafío es escribir un programa o función que calcule el costo de comprar una cantidad determinada de un recurso en particular, suponiendo que haya una cantidad determinada de ese recurso presente en el mercado.

Su envío debe aceptar, en cualquier formato de entrada razonable y en cualquier orden, los siguientes parámetros:

  • El tipo de recurso: garantizado como uno de [C, O, G, U].
  • La cantidad de ese recurso que está presente en el mercado, garantizada como un número entero no negativo. Si el tipo de recurso no es U, no será mayor que 24. Si el tipo de recurso es U, no será mayor que 12.
  • La cantidad de ese recurso que un jugador le gustaría comprar, garantizado como un número entero no negativo que es menor o igual a la cantidad ya presente en el mercado.

El resultado debe ser el costo de los recursos solicitados.

Reglas Adicionales

  • Las fórmulas proporcionadas son solo para fines ilustrativos, no dude en utilizar cualquier método para calcular los costos que desee.
  • Los códigos de letras para los diferentes tipos de recursos (C, O, G, U) pueden reemplazarse por sus equivalentes en minúsculas. También puede reemplazar las letras por números, ya sea en el formulario C=0, O=1, G=2, U=3o C=1, O=2, G=3, U=4.
  • Este es el , por lo que el envío más pequeño en bytes será el ganador.
  • Si su envío requiere la entrada en un orden o formato diferente al especificado en la sección anterior, debe proporcionar detalles.

Casos de prueba

Formato de caso de prueba:

resource type, amount in market, amount to buy
> result

Casos de prueba:

C, 24, 4
> 5

C, 20, 4
> 10

O, 3, 3
> 24

U, 1, 1
> 16

C, 1, 1
> 8

G, 0, 0
> 0

O, 10, 7
> 44

U, 12, 4
> 10

G, 11, 4
> 22
Sok
fuente
¿Asumimos que las entradas son legales o tenemos que manejar cosas como f("O",1,5)?
Katenkyo
@Katenkyo No, como se detalla en la especificación, se garantiza que las entradas serán válidas. La comprobación de errores de la OMI en el código de golf es tediosa, así que lo eliminé: o)
Sok
Perfecto, podría haberse perdido eso en las especificaciones. Voy a hacer la publicación para mi presentación :)
Katenkyo
Creo que hay algunos errores en los casos de prueba. Revisé dos veces y obtuve f(G, 11, 4) = 22y f(O, 10, 7) = 44.
PurkkaKoodari
@ Pietu1998 Tienes toda la razón, no estoy seguro de cómo me equivoqué: \ edit now
Sok

Respuestas:

3

Javascript (ES6), 71 59 bytes

f=(t,m,b)=>b&&(t>2?m>4?13-m:18-m*2:9+~(~-m/3))+f(t,m-1,b-1)

Toma type, market_amounty buy_amountcomo argumentos. typees un entero entre 0 y 3.

Manifestación

PurkkaKoodari
fuente
4

Python 3, 71 69 bytes

Gracias a @xnor por -2 bytes

f=lambda r,a,b:b and[8-int(~-a/3),max(18-2*a,13-a)][r>2]+f(r,a-1,b-1)

Una función que toma información a través del argumento del tipo de recurso indexado a cero r, la cantidad disponible ay la cantidad a comprar b, y devuelve el costo.

Esto hace uso del hecho de que Truee Falseiguala 1y 0en Python, permitiendo el uso de expresiones booleanas para indexar en listas.

Cómo funciona

f=lambda r,a,b           Function with input resource type r, amount available a and amount
                         to buy b
b and...                 Base case: return 0 if b=0
[8-int(~-a/3),...][r>2]  If not uranium, yield the unit cost 8-floor((a-1)/3)...
max(18-2*a,13-a)         ..else yield the current uranium unit cost
...f(r,a-1,b-1)          Decrement a and b, then pass to function
...+...                  Add the cost of each unit to give the total cost
:...                     Return the above

Pruébalo en Ideone

TheBikingViking
fuente
1
Puedes hacerlo max(18-2*a,13-a)en lugar de [18-2*a,13-a][a>4].
xnor
3

Befunge, 142 bytes

&2`#v_&&>:!#v_\:1-3/8\-v
v:&&<   ^-1\ -1p15+g15 <
v>#<v       <
! v5<
# 1:
>^g-
| 81
\ 4\
: *-
4 -1
` .p
# @^15+g15<
>:49+\-   ^
|
>:2*92*\- ^

Pruébalo aquí! Toma la entrada como 3 enteros, donde el tipo de recurso es 0,1,2,3. La salida es un entero.

No tengo idea si esto se puede jugar mejor. No hay mucho espacio en blanco, pero las nuevas líneas probablemente duelen.


fuente
3

Python 2.7, 85 bytes:

F,G,H=input();B=0;exec"B+=[[18-(2*G),13-G][G>5],8-((G-1)/3)][F!='U'];G-=1;"*H;print B

Según la respuesta de R. Kap, pero puede reducir un byte a 85 eliminando la división extra / para piso. Debido a que todos estos son números enteros, se reduce automáticamente a un número entero.

Strother
fuente
1
Bienvenido a PPCG!
FantaC
2

Python 2.7, 86 bytes:

F,G,H=input();B=0;exec"B+=[[18-(2*G),13-G][G>5],8-((G-1)//3)][F!='U'];G-=1;"*H;print B

Toma información de una matriz en el formato [resource type, units available, units to purchase]. La salida es un entero. Intentará jugar más al golf con el tiempo.

¡Pruébelo en línea! (Ideona)

R. Kap
fuente
2

Lua, 107 101 Bytes

Función recursiva a la que hay que llamar f(resource,stock,buy). El recurso debe ser un número entre 0 y 3. La salida se realiza a través del valor devuelto.

Gracias LeakyNun por salvarme 6 bytes: (25-y+(y-1)%3)/3es más corto que 8-math.floor((y-1)/3)5 bytes y me permite obtener un byte más debido a su ubicación.

function f(x,y,z)return z<1 and 0or(x<3 and(25-y+(y-1)%3)/3or(y<5 and 18-y*2or 13-y))+f(x,y-1,z-1)end

Sin golf

function f(x,y,z)                      -- define a function f with 3 parameters
  return z<1                           -- if we don't buy anything else
           and 0                       --   return 0
         or(                           -- else
           x<3                         --   if we're not buying Uranium
             and (25-y+(y-1)%3)/3      --     return 8-floor((stock-1)/3)                       
           or(y<5                      --   elseif there's less than 5 Uranium left
                and 18-y*2             --     return 18-stock*2
              or 13-y))                --   else return 13-stock
         +f(x,y-1,z-1)                 -- if we bought this iteration
                                       -- add f(resource,stock-1,toBuy-1) 
                                       -- to the returned value
end

Puede probar este código en línea copiando y pegando el siguiente fragmento.

function f(x,y,z)return z<1 and 0or(x<3 and(25-y+(y-1)%3)/3or(y<5 and 18-y*2or 13-y))+f(x,y-1,z-1)end
print(f(1,24,4))
print(f(2,20,4))
print(f(0,10,7))
print(f(3,1,1))
print(f(3,12,4))
Katenkyo
fuente
@ Pietu1998 es Lua 5.3. No sé acerca de 5.2, pero en 5.3 no se quejará de estos cuando no estén formando valores hexadecimales. por ejemplo, 6andno funcionará porque 6aes un valor hexadecimal, pero 6anno lo es.
Katenkyo
8-math.floor((y-1)/3)es realmente(25-y+(y-1)%3)/3
Leaky Nun