Custos de recursos da rede elétrica

14

Custos de recursos da rede elétrica

Introdução

No jogo de tabuleiro Power Grid , parte integrante do jogo é o ato de comprar recursos para alimentar suas centrais elétricas. Existem quatro tipos de recursos usados ​​no jogo (cinco, se você incluir energia renovável, mas obviamente não poderá comprar recursos para isso). São carvão, óleo, lixo e urânio. O mercado de recursos fica assim:

Uma ilustração do mercado de recursos, extraída do livro de regras

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

Quando os recursos são comprados, eles são retirados da esquerda do mercado, onde são mais baratos. Quando novos recursos são adicionados ao mercado, eles são adicionados à direita. Como pode ser visto, isso produz um equilíbrio de oferta e demanda - se mais recursos de um tipo específico estiverem sendo comprados do que reabastecidos a cada rodada, o preço desse recurso aumentará. Da mesma forma, se for menor, o custo será reduzido.

Carvão, petróleo e lixo aumentam de custo na mesma proporção, enquanto o urânio aumenta muito mais rapidamente. Uma única unidade de um recurso que não seja de urânio custa 8 - floor((<units available> - 1) / 3). Uma única unidade de urânio custa 13 - <units available>se houver 5 ou mais unidades disponíveis, 18 - (2 * <units available>)caso contrário.

Por exemplo, no início do jogo, existem todas as 24 unidades de carvão disponíveis para compra. Se o primeiro jogador gostaria de comprar 4 unidades de carvão, as três primeiras unidades custariam 1 cada e a quarta custaria 2, tornando o custo total 5. Isso deixa 20 unidades disponíveis. Se o segundo jogador também quiser comprar 4 unidades de carvão, o custo será (2 * 2 + 2 * 3) = 10.

O desafio

Seu desafio é escrever um programa ou função que calcule o custo da compra de uma determinada quantidade de um recurso específico, assumindo que exista uma quantidade específica desse recurso presente no mercado.

Seu envio deve aceitar, em qualquer formato de entrada razoável e em qualquer ordem, os seguintes parâmetros:

  • O tipo de recurso - garantido como um de [C, O, G, U].
  • A quantidade desse recurso que está presente no mercado - garantida como um número inteiro não negativo. Se o tipo de recurso não for U, não será maior que 24. Se o tipo de recurso for U, não será maior que 12.
  • A quantidade desse recurso que um jogador gostaria de comprar - garantida como um número inteiro não negativo que é menor ou igual à quantidade já presente no mercado.

A saída deve ser o custo dos recursos solicitados.

Regras adicionais

  • As fórmulas fornecidas são apenas para fins ilustrativos; sinta-se à vontade para usar qualquer método de cálculo dos custos que desejar.
  • Os códigos de letras para os diferentes tipos de recursos (C, O, G, U) podem ser substituídos por seus equivalentes em minúsculas. Você também pode substituir as letras por números, no formato C=0, O=1, G=2, U=3ou C=1, O=2, G=3, U=4.
  • Isso é , então o menor envio em bytes será o vencedor.
  • Se o seu envio exigir a entrada em um pedido ou formato diferente do especificado na seção anterior, você deverá fornecer detalhes.

Casos de teste

Formato do caso de teste:

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

Casos de teste:

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
fonte
Assumimos que as entradas são legais ou de que precisamos lidar com coisas assim f("O",1,5)?
Katenkyo
@Katenkyo Não, conforme detalhado nas especificações, as entradas são garantidas como válidas. IMO verificação de erros no golfe código é tedioso assim que eu fiz afastado com ele: o)
Sok
Perfeito, pode ter perdido isso nas especificações. Vou fazer o post para a minha submissão :) #
23416
Eu acho que existem alguns erros nos casos de teste. Eu verifiquei duas vezes e consegui f(G, 11, 4) = 22e f(O, 10, 7) = 44.
PurkkaKoodari
@ Pietu1998 Você está absolutamente certo, não sei como eu tenho que errado: \ editar agora
Sok

Respostas:

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_amounte buy_amountcomo argumentos. typeé um número inteiro entre 0 e 3.

Demo

PurkkaKoodari
fonte
4

Python 3, 71 69 bytes

Graças 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)

Uma função que recebe entrada via argumento do tipo de recurso indexado a zero r, a quantidade disponível ae a quantidade a comprar be retorna o custo.

Isso faz uso do fato de que Truee Falseigual a 1e 0em Python, permitindo o uso de expressões booleanas para indexar em listas.

Como 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

Experimente no Ideone

TheBikingViking
fonte
1
Você pode fazer max(18-2*a,13-a)no lugar de [18-2*a,13-a][a>4].
Xnor
3

Anterior, 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*\- ^

Experimente aqui! Recebe entrada como 3 números inteiros, onde o tipo de recurso é 0,1,2,3. A saída é um número inteiro.

Não faço ideia se isso pode ser melhorado. Não há muito espaço em branco, mas as novas linhas provavelmente doem.


fonte
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

Com base na resposta de R. Kap, mas você pode reduzir um byte até 85 removendo a divisão extra / de piso. Como todos esses números são inteiros, é automaticamente convertido para um número inteiro.

Strother
fonte
1
Bem-vindo ao PPCG!
FantaC 17/0118
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

Recebe entrada por uma matriz no formato [resource type, units available, units to purchase]. A saída é um número inteiro. Tentará jogar mais golfe com o tempo.

Experimente Online! (Ideona)

R. Kap
fonte
2

Lua, 107 101 Bytes

Função recursiva que precisa ser chamada com f(resource,stock,buy). O recurso deve ser um número entre 0 e 3. A saída é feita através do valor retornado.

Obrigado LeakyNun por me salvar 6 bytes: (25-y+(y-1)%3)/3é menor que 8-math.floor((y-1)/3)5 bytes e me permite ganhar mais um byte devido à sua localização.

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

Ungolfed

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

Você pode testar esse código online copiando e colando o seguinte trecho.

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
fonte
@ Pietu1998 é Lua 5.3. Não conheço o 5.2, mas no 5.3 ele não se queixará disso quando não estiver formando valores hexadecimais. por exemplo, 6andnão funcionará porque 6aé um valor hexadecimal, mas 6annão é.
precisa
8-math.floor((y-1)/3)é realmente(25-y+(y-1)%3)/3
Leaky Nun