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:
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=3
ouC=1, O=2, G=3, U=4
. - Isso é código-golfe , 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
f("O",1,5)
?f(G, 11, 4) = 22
ef(O, 10, 7) = 44
.Respostas:
Javascript (ES6),
7159 bytesToma
type
,market_amount
ebuy_amount
como argumentos.type
é um número inteiro entre 0 e 3.Demo
Mostrar snippet de código
fonte
Python 3,
7169 bytesGraças a @xnor por -2 bytes
Uma função que recebe entrada via argumento do tipo de recurso indexado a zero
r
, a quantidade disponívela
e a quantidade a comprarb
e retorna o custo.Isso faz uso do fato de que
True
eFalse
igual a1
e0
em Python, permitindo o uso de expressões booleanas para indexar em listas.Como funciona
Experimente no Ideone
fonte
max(18-2*a,13-a)
no lugar de[18-2*a,13-a][a>4]
.Anterior, 142 bytes
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
Python 2.7, 85 bytes:
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.
fonte
Python 2.7, 86 bytes:
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)
fonte
Lua,
107101 BytesFunçã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 que8-math.floor((y-1)/3)
5 bytes e me permite ganhar mais um byte devido à sua localização.Ungolfed
Você pode testar esse código online copiando e colando o seguinte trecho.
fonte
6and
não funcionará porque6a
é um valor hexadecimal, mas6an
não é.8-math.floor((y-1)/3)
é realmente(25-y+(y-1)%3)/3