Biaya Sumber Daya Jaringan Listrik

14

Biaya Sumber Daya Jaringan Listrik

pengantar

Dalam permainan papan Power Grid , bagian integral dari permainan adalah tindakan membeli sumber daya untuk mengisi bahan bakar pembangkit listrik Anda. Ada empat jenis sumber daya yang digunakan dalam permainan (lima, jika Anda memasukkan energi terbarukan, tetapi jelas Anda tidak bisa membeli sumber daya untuk itu). Ini adalah Batubara, Minyak, Sampah, dan Uranium. Pasar sumber daya terlihat seperti ini:

Ilustrasi pasar sumber daya, diambil dari buku peraturan

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

Ketika sumber daya dibeli, mereka diambil dari kiri pasar, di mana mereka termurah. Ketika sumber daya baru ditambahkan ke pasar, mereka ditambahkan dari kanan. Seperti yang dapat dilihat, ini menghasilkan keseimbangan penawaran dan permintaan - jika lebih banyak sumber daya dari jenis tertentu dibeli daripada yang diisi ulang setiap putaran, harga sumber daya itu akan naik. Demikian pula, jika kurang, biayanya akan berkurang.

Batubara, Minyak, dan Sampah semuanya mengalami kenaikan pada tingkat yang sama, sementara skala Uranium jauh lebih cepat. Satu unit biaya sumber daya non-Uranium 8 - floor((<units available> - 1) / 3). Satu unit biaya Uranium 13 - <units available>jika ada 5 atau lebih unit yang tersedia, dan 18 - (2 * <units available>)sebaliknya.

Misalnya, pada awal permainan ada semua 24 unit Batubara tersedia untuk dibeli. Jika pemain pertama ingin membeli 4 unit Batubara, tiga unit pertama akan dikenakan biaya masing-masing 1, dan 4 unit akan biaya 2, sehingga total biaya 5. Ini membuat 20 unit tersedia. Jika pemain kedua juga ingin membeli 4 unit Batubara, biayanya adalah (2 * 2 + 2 * 3) = 10.

Tantangan

Tantangan Anda adalah menulis program atau fungsi yang menghitung biaya untuk membeli sejumlah tertentu sumber daya tertentu, dengan asumsi bahwa ada jumlah tertentu dari sumber daya yang ada di pasar.

Kiriman Anda harus menerima, dalam format input apa pun yang masuk akal dan dalam urutan apa pun, parameter berikut:

  • Jenis sumber daya - dijamin menjadi salah satu dari [C, O, G, U].
  • Jumlah sumber daya yang ada di pasar - dijamin sebagai bilangan bulat non-negatif. Jika jenis sumber daya bukan U, maka tidak akan lebih besar dari 24. Jika jenis sumber daya adalah U, maka tidak akan lebih besar dari 12.
  • Jumlah sumber daya yang ingin dibeli pemain - dijamin bilangan bulat non-negatif yang kurang dari atau sama dengan jumlah yang sudah ada di pasar.

Keluaran harus berupa biaya sumber daya yang diminta.

Aturan tambahan

  • Formula yang diberikan hanya untuk tujuan ilustrasi, jangan ragu untuk menggunakan metode apa pun dalam menghitung biaya yang Anda suka.
  • Kode huruf untuk berbagai jenis sumber daya (C, O, G, U) dapat diganti dengan setara dengan huruf kecil. Anda juga dapat mengganti huruf untuk angka, baik dalam bentuk C=0, O=1, G=2, U=3atau C=1, O=2, G=3, U=4.
  • Ini adalah , jadi pengiriman terkecil dalam byte akan menjadi pemenangnya.
  • Jika kiriman Anda memerlukan input dalam urutan atau format yang berbeda dari yang ditentukan di bagian sebelumnya, Anda harus memberikan perincian.

Uji kasus

Format kasus uji:

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

Kasus uji:

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
sumber
Apakah kita menganggap inputnya legal, atau kita harus menangani hal-hal seperti f("O",1,5)?
Katenkyo
@Katenkyo Tidak, sebagaimana dirinci dalam spesifikasi, input dijamin valid. Kesalahan IMO dalam memeriksa kode golf itu membosankan, jadi saya sudah menyelesaikannya: o)
Sok
Sempurna, mungkin telah melewatkan itu dalam spesifikasi. Akan melakukan posting untuk kiriman saya :)
Katenkyo
Saya pikir ada beberapa kesalahan dalam test case. Saya dua kali diperiksa dan mendapat f(G, 11, 4) = 22danf(O, 10, 7) = 44 .
PurkkaKoodari
@ Pietu1998 Anda memang benar, tidak yakin bagaimana saya salah melakukannya: \ mengedit sekarang
Sok

Jawaban:

3

Javascript (ES6), 71 59 byte

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

Mengambil type, market_amountdan buy_amountsebagai argumen. typeadalah bilangan bulat antara 0 dan 3.

Demo

PurkkaKoodari
sumber
4

Python 3, 71 69 byte

Berkat @xnor untuk -2 byte

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)

Fungsi yang mengambil input melalui argumen dari tipe sumber daya yang diindeks nol r , jumlah yang tersedia adan jumlah yang akan dibeli b, dan mengembalikan biaya.

Ini memanfaatkan fakta bahwa TruedanFalse menyamakan ke 1dan 0dengan Python, memungkinkan penggunaan ekspresi Boolean untuk diindeks ke dalam daftar.

Bagaimana itu bekerja

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

Cobalah di Ideone

TheBikingViking
sumber
1
Anda dapat melakukannya max(18-2*a,13-a)di tempat [18-2*a,13-a][a>4].
xnor
3

Befunge, 142 byte

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

Coba di sini!Mengambil input sebagai 3 bilangan bulat, di mana jenis sumber daya adalah 0,1,2,3. Output adalah bilangan bulat.

Tidak tahu apakah ini bisa bermain golf lebih baik. Tidak ada banyak ruang putih, tetapi baris baru mungkin sakit.


sumber
3

Python 2.7, 85 byte:

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

Berdasarkan jawaban R. Kap, tetapi Anda dapat mencukur byte hingga 85 dengan menghapus divisi ekstra / untuk lantai. Karena ini semua bilangan bulat, maka secara otomatis lantai menjadi bilangan bulat.

Strother
sumber
1
Selamat datang di PPCG!
FantaC
2

Python 2.7, 86 byte:

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

Mengambil input oleh array dalam format [resource type, units available, units to purchase]. Output adalah bilangan bulat. Akan mencoba bermain golf lebih lama.

Cobalah secara Online! (Ideone)

R. Kap
sumber
2

Lua, 107 101 Bytes

Fungsi rekursif yang harus dipanggil dengan f(resource,stock,buy). sumber daya harus berupa angka antara 0 dan 3. Output dilakukan melalui nilai yang dikembalikan.

Terima kasih LeakyNun karena telah menyelamatkan saya 6 byte: (25-y+(y-1)%3)/3lebih pendek dari 8-math.floor((y-1)/3)5 byte dan memungkinkan saya untuk mendapatkan satu byte lagi karena penempatannya.

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

Tidak disatukan

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

Anda dapat menguji kode ini secara online dengan menyalin-menempelkan cuplikan berikut.

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
sumber
@ Pietu1998 ini Lua 5.3. Saya tidak tahu tentang 5.2, tetapi dalam 5.3 tidak akan mengeluh tentang ini ketika mereka tidak membentuk nilai heksadesimal. misalnya, 6andtidak akan berfungsi karena 6amerupakan nilai hex, tetapi 6antidak.
Katenkyo
8-math.floor((y-1)/3)benar(25-y+(y-1)%3)/3
Leaky Nun