電力グリッドのリソースコスト


14

電力グリッドのリソースコスト

前書き

ボードゲームPower Gridでは、ゲームの不可欠な部分は、発電所に燃料を供給するためにリソースを購入する行為です。ゲームで使用されるリソースには4つのタイプがあります(再生可能エネルギーを含めると5つですが、明らかにそのためのリソースを購入することはできません)。これらは、石炭、石油、ごみ、およびウランです。リソース市場は次のようになります。

ルールブックから取られた資源市場の実例

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ユニットの石炭を購入したい場合、最初の3ユニットのコストはそれぞれ1で、4番目のユニットのコストは2で、合計コストは5です。これにより、20ユニットが使用可能になります。2番目のプレイヤーも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いいえ、仕様に詳述されているように、入力は有効であることが保証されています。私はそれを離れてやったので、IMOコードゴルフエラーチェックするのは面倒です:O)
ソック

完璧で、スペックでは見逃していたかもしれません。私の提出のための投稿をするつもりです:)
Katenkyo

テストケースにはいくつかのエラーがあると思います。私はダブルチェックしてましたf(G, 11, 4) = 22f(O, 10, 7) = 44
PurkkaKoodari

@ Pietu1998あなたは絶対に正しいです、私がどうやって間違ったのか分かりません:\編集中
ソク

回答:


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_amountそしてbuy_amount引数として。type0〜3の整数です。

デモ


4

Python 3、71 69バイト

-2バイトの@xnorに感謝

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の同一視1し、0リスト内のインデックスにブール式の使用を許可する、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の答えに基づきますが、余分な/を除算してフロア分割することで1バイトを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

Lua、107 101バイト

で呼び出す必要のある再帰関数f(resource,stock,buy)。リソースは0〜3の数値である必要があります。出力は戻り値を介して行われます。

6バイト節約してくれたLeakyNunに感謝します。5バイト(25-y+(y-1)%3)/3より短く8-math.floor((y-1)/3)、配置のためにもう1バイト増やすことができます。

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では、これらが16進値を形成していない場合にこれらについて文句を言うことはありません。たとえば、16進数値である6andため機能しません6aが、機能し6anません。
かてんきょう

8-math.floor((y-1)/3)は本当に(25-y+(y-1)%3)/3
リーキー修道女
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.