ต้นทุนทรัพยากรพลังงานกริด


14

ต้นทุนทรัพยากรพลังงานกริด

บทนำ

ในเกมกระดานPower Gridส่วนหนึ่งของเกมคือการซื้อทรัพยากรเพื่อเติมเชื้อเพลิงให้กับสถานีพลังงานของคุณ มีสี่ประเภทของทรัพยากรที่ใช้ในเกม (ห้าถ้าคุณรวมพลังงานหมุนเวียน แต่แน่นอนคุณไม่สามารถซื้อทรัพยากรสำหรับที่) เหล่านี้คือถ่านหินน้ำมันขยะและยูเรเนียม ตลาดทรัพยากรมีลักษณะดังนี้:

ภาพประกอบของตลาดทรัพยากรซึ่งนำมาจากกฎ

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 หน่วยต่อคนและอันดับที่ 4 จะมีค่าใช้จ่าย 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=3C=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 ในการตีกอล์ฟเป็นเรื่องที่น่าเบื่อดังนั้นฉันจึงได้ทำไปแล้ว: o)
Sok

สมบูรณ์แบบอาจพลาดในสเปค ฉันจะโพสต์เพื่อส่งผลงานของฉัน :)
Katenkyo

ฉันคิดว่ามีข้อผิดพลาดบางอย่างในกรณีทดสอบ ฉันสองครั้งการตรวจสอบและได้และf(G, 11, 4) = 22 f(O, 10, 7) = 44
PurkkaKoodari

@ Pietu1998 คุณพูดถูกจริงๆไม่แน่ใจว่าฉันผิด: \ edit ตอนนี้
Sok

คำตอบ:


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)

ใช้เวลาtype, market_amountและbuy_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และส่งคืนต้นทุน

สิ่งนี้ใช้ประโยชน์จากความจริงที่ว่าTrueและFalseถือเอา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 เอาท์พุทเป็นจำนวนเต็ม

ไม่มีความคิดถ้าสิ่งนี้สามารถ golfed ใด ๆ ที่ดีกว่า มีช่องว่างไม่มากนัก แต่ขึ้นบรรทัดใหม่อาจเจ็บ


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]โดยจะเข้าอาร์เรย์ในรูปแบบ เอาท์พุทเป็นจำนวนเต็ม จะพยายามเล่นกอล์ฟมากขึ้นเมื่อเวลาผ่านไป

ลองออนไลน์! (Ideone)


2

Lua, 107 101 Bytes

f(resource,stock,buy)ฟังก์ชั่นซ้ำว่าจะต้องมีการเรียกว่ามี ทรัพยากรต้องเป็นตัวเลขระหว่าง 0 ถึง 3 เอาต์พุตจะกระทำผ่านค่าที่ส่งคืน

ขอบคุณ LeakyNun ที่ช่วยฉัน 6 ไบต์: (25-y+(y-1)%3)/3สั้นกว่า8-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

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

คุณสามารถทดสอบรหัสนี้ทางออนไลน์โดยคัดลอกตัวอย่างข้อมูลต่อไปนี้

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

8-math.floor((y-1)/3)จริงๆแล้ว(25-y+(y-1)%3)/3
Leaky Nun
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.