电网资源成本


14

电网资源成本

介绍

在棋盘游戏《电力网格》中,游戏不可或缺的一部分是购买资源为发电厂加油的行为。游戏中使用了四种资源(五种,如果您包括可再生能源,但是显然您不能为此购买资源)。这些是煤炭,石油,垃圾和铀。资源市场如下所示:

资源市场插图,摘自规则手册

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

购买资源时,它们是从最便宜的市场左侧获取的。当新资源添加到市场时,它们是从右侧添加的。可以看出,这产生了供需平衡-如果购买的特定类型资源多于每轮补充资源,则该资源的价格将上涨。同样,如果价格更低,成本将会降低。

煤炭,石油和垃圾的成本增长速度相同,而铀的增长速度更快。单个单位的非铀资源成本8 - floor((<units available> - 1) / 3)13 - <units available>如果有5个或更多单位可用,则一个铀单位成本,18 - (2 * <units available>)否则。

例如,在游戏开始时,有24种单位的煤炭可供购买。如果第一个玩家想购买4个单位的煤炭,则前三个单位每个要花费1,而第四个单位要花费2,因此总费用为5。这样就剩下20个单位了。如果第二个玩家也想购买4单位的煤炭,则成本为(2 * 2 + 2 * 3)= 10。

挑战

您面临的挑战是编写一个程序或函数,以假定在市场上存在一定数量的特定资源的情况下,计算购买特定数量特定资源的成本。

您的提交应以任何合理的输入格式和顺序接受以下参数:

  • 资源类型-保证为[C,O,G,U]中的一种。
  • 市场上存在的资源数量-保证为非负整数。如果资源类型不是U,则不会大于24。如果资源类型是U,则不会大于12。
  • 玩家想购买的资源数量-保证是一个非负整数,小于或等于市场上已经存在的数量。

输出应该是所请求资源的成本。

附加规则

  • 给出的公式仅用于说明目的,请随时使用任何您喜欢的成本计算方法。
  • 不同资源类型(C,O,G,U)的字母代码可以用它们的小写等效项代替。您也可以替换字母数字,无论是在形式C=0, O=1, G=2, U=3还是C=1, O=2, G=3, U=4
  • 这是,因此最小的提交字节数将是获胜者。
  • 如果您提交的内容要求输入的顺序或格式与上一节中指定的格式不同,则应提供详细信息。

测试用例

测试用例格式:

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

测试用例:

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)
Katenkyo

@Katenkyo不,如规范中所详述,保证输入有效。IMO代码高尔夫检查中的错误非常繁琐,因此我已将其
删除

太好了,可能在规格中错过了。要做我提交的帖子:)
Katenkyo,2016年

我认为测试案例中存在一些错误。我双重检查,得到了f(G, 11, 4) = 22f(O, 10, 7) = 44
PurkkaKoodari'7

@ Pietu1998你是绝对正确的,我不知道如何得到了错误:\现在编辑

Answers:


3

Javascript(ES6),71 59字节

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

注意到typemarket_amountbuy_amount作为参数。type是0到3之间的整数。

演示版


4

Python 3,71 69字节

感谢@xnor -2个字节

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)

该函数通过零索引资源类型r,可a用量和购买量的参数接受输入b,并返回成本。

这使得使用的事实,TrueFalse等同于10在Python中,允许使用布尔表达式来索引列表。

怎么运行的

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

在Ideone上尝试


1
您可以max(18-2*a,13-a)代替[18-2*a,13-a][a>4]
xnor

3

Befunge,142个字节

&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*\- ^

在这里尝试!将输入作为3个整数,资源类型为0、1、2、3。输出是整数。

不知道这是否可以打得更好。没有太多空格,但是换行符可能会受到伤害。


3

Python 2.7,85个字节:

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

根据R. Kap的回答,但是您可以通过删除多余的/进行地板分割来将字节减少到85。因为这些都是整数,所以它会自动下限为整数。


1
欢迎来到PPCG!
FantaC

2

Python 2.7,86个字节:

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

接受格式为数组的输入 [resource type, units available, units to purchase]。输出是整数。随着时间的流逝,它将尝试更多的高尔夫运动。

在线试用!(爱迪生)


2

卢阿 107101字节

必须使用调用的递归函数f(resource,stock,buy)。资源必须是0到3之间的数字。通过返回的值完成输出。

感谢LeakyNun为我节省了6个字节:(25-y+(y-1)%3)/38-math.floor((y-1)/3)5个字节短,并且由于其位置而让我再获得一个字节。

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

不打高尔夫球

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

您可以通过复制粘贴以下代码段来在线测试此代码。

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))

@ Pietu1998是Lua 5.3。我不知道5.2,但是在5.3中,当它们不形成十六进制值时,它不会抱怨它们。例如,6and由于6a是十六进制值而不会起作用,但6an不是。
Katenkyo,2016年

8-math.floor((y-1)/3)确实是(25-y+(y-1)%3)/3
Leaky Nun
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.