Chi phí tài nguyên lưới điện


14

Chi phí tài nguyên lưới điện

Giới thiệu

Trong trò chơi bảng Power Grid , một phần không thể thiếu của trò chơi là hành động mua tài nguyên để cung cấp nhiên liệu cho các trạm điện của bạn. Có bốn loại tài nguyên được sử dụng trong trò chơi (năm, nếu bạn bao gồm năng lượng tái tạo, nhưng rõ ràng bạn không thể mua tài nguyên cho việc đó). Đó là Than, Dầu, Rác và Uranium. Thị trường tài nguyên trông như thế này:

Một minh họa về thị trường tài nguyên, được lấy từ sách quy tắc

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

Khi tài nguyên được mua, chúng được lấy từ bên trái của thị trường, nơi chúng rẻ nhất. Khi các tài nguyên mới được thêm vào thị trường, chúng được thêm vào từ bên phải. Có thể thấy, điều này tạo ra sự cân bằng cung và cầu - nếu nhiều tài nguyên của một loại cụ thể được mua hơn là được bổ sung mỗi vòng, giá của tài nguyên đó sẽ tăng lên. Tương tự, nếu nó ít hơn, chi phí sẽ giảm.

Than, Dầu và Rác đều tăng chi phí với cùng một tỷ lệ, trong khi Uranium quy mô nhanh hơn nhiều. Một đơn vị chi phí tài nguyên phi Uranium 8 - floor((<units available> - 1) / 3). Một đơn vị chi phí Uranium 13 - <units available>nếu có sẵn 5 đơn vị trở lên, và 18 - (2 * <units available>)nếu không.

Ví dụ, khi bắt đầu trò chơi, có tất cả 24 đơn vị Than có sẵn để mua. Nếu người chơi đầu tiên muốn mua 4 đơn vị Than, ba đơn vị đầu tiên sẽ có giá 1 đơn vị và người thứ 4 sẽ có giá 2, làm cho tổng chi phí 5. Điều này để lại 20 đơn vị. Nếu người chơi thứ hai cũng muốn mua 4 đơn vị Than, chi phí sẽ là (2 * 2 + 2 * 3) = 10.

Các thách thức

Thách thức của bạn là viết một chương trình hoặc chức năng tính toán chi phí mua một lượng nhất định của một tài nguyên cụ thể, giả sử rằng có một lượng nhất định của tài nguyên đó có trên thị trường.

Việc gửi của bạn phải chấp nhận, ở bất kỳ định dạng đầu vào hợp lý nào và theo bất kỳ thứ tự nào, các tham số sau:

  • Loại tài nguyên - được đảm bảo là một trong [C, O, G, U].
  • Lượng tài nguyên đó có mặt trên thị trường - được đảm bảo là một số nguyên không âm. Nếu loại tài nguyên không phải là U, nó sẽ không lớn hơn 24. Nếu loại tài nguyên là U, nó sẽ không lớn hơn 12.
  • Lượng tài nguyên mà người chơi muốn mua - được đảm bảo là số nguyên không âm nhỏ hơn hoặc bằng số tiền hiện có trên thị trường.

Đầu ra phải là chi phí của các tài nguyên được yêu cầu.

Quy tắc bổ sung

  • Các công thức được đưa ra chỉ nhằm mục đích minh họa, vui lòng sử dụng bất kỳ phương pháp tính toán chi phí nào bạn muốn.
  • Mã chữ cái cho các loại tài nguyên khác nhau (C, O, G, U) có thể được thay thế bằng các chữ tương đương viết thường của chúng. Bạn cũng có thể thay thế các chữ cái cho các số, dưới dạng C=0, O=1, G=2, U=3hoặc C=1, O=2, G=3, U=4.
  • Đây là , vì vậy bài nộp nhỏ nhất theo byte sẽ là người chiến thắng.
  • Nếu bài nộp của bạn yêu cầu đầu vào theo thứ tự hoặc định dạng khác với quy định trong phần trước, bạn nên cung cấp chi tiết.

Các trường hợp thử nghiệm

Định dạng trường hợp thử nghiệm:

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

Các trường hợp thử nghiệm:

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

Chúng ta có cho rằng các yếu tố đầu vào là hợp pháp, hoặc chúng ta phải xử lý những việc như thế f("O",1,5)nào?
Katenkyo

@Katenkyo Không, như chi tiết trong thông số kỹ thuật, các đầu vào được đảm bảo là hợp lệ. Kiểm tra lỗi IMO trong mã golf là tẻ nhạt vì vậy tôi đã loại bỏ nó: o)
Sok

Hoàn hảo, có thể đã bỏ lỡ điều đó trong thông số kỹ thuật. Gonna làm bài cho bài đăng của tôi :)
Katenkyo 12/07/2016

Tôi nghĩ rằng có một số lỗi trong các trường hợp thử nghiệm. Tôi đã kiểm tra lại và nhận f(G, 11, 4) = 22f(O, 10, 7) = 44.
PurkkaKoodari

@ Pietu1998 Bạn hoàn toàn đúng, không chắc là tôi đã sai như thế nào: \ chỉnh sửa ngay bây giờ
Sok

Câu trả lời:


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)

Mất type, market_amountbuy_amountnhư là đối số. typelà một số nguyên nằm trong khoảng từ 0 đến 3.

Bản giới thiệu


4

Python 3, 71 69 byte

Cảm ơn @xnor cho -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)

Một hàm lấy đầu vào thông qua đối số của loại tài nguyên được lập chỉ mục bằng không r, số lượng có sẵn avà số tiền cần mua bvà trả về chi phí.

Điều này sử dụng thực tế TrueFalsetương đương 10trong Python, cho phép sử dụng các biểu thức Boolean để lập chỉ mục vào danh sách.

Làm thế nào nó hoạt động

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

Hãy thử nó trên Ideone


1
Bạn có thể làm max(18-2*a,13-a)ở chỗ [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*\- ^

Hãy thử nó ở đây! Lấy đầu vào là 3 số nguyên, trong đó loại tài nguyên là 0,1,2,3. Đầu ra là một số nguyên.

Không có ý tưởng nếu điều này có thể được chơi golf tốt hơn. Không có nhiều khoảng trắng, nhưng các dòng mới có thể bị tổn thương.


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

Dựa trên câu trả lời của R. Kap, nhưng bạn có thể cạo một byte xuống 85 bằng cách loại bỏ phần thừa / cho phần sàn. Bởi vì đây là tất cả các số nguyên, nó tự động thả xuống một số nguyên.


1
Chào mừng đến với 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

Đưa đầu vào bởi một mảng trong định dạng [resource type, units available, units to purchase]. Đầu ra là một số nguyên. Sẽ cố gắng để chơi golf nhiều hơn theo thời gian.

Dùng thử trực tuyến! (Ý)


2

Lua, 107 101 byte

Hàm đệ quy phải được gọi với f(resource,stock,buy). tài nguyên phải là một số từ 0 đến 3. Đầu ra được thực hiện thông qua giá trị được trả về.

Cảm ơn LeakyNun vì đã tiết kiệm cho tôi 6 byte: (25-y+(y-1)%3)/3ngắn hơn 8-math.floor((y-1)/3)5 byte và cho phép tôi có thêm một byte do vị trí của nó.

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

Ung dung

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

Bạn có thể kiểm tra mã này trực tuyến bằng cách sao chép đoạn mã sau.

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 là Lua 5.3. Tôi không biết về 5.2, nhưng trong 5.3 sẽ không phàn nàn về những điều này khi chúng không hình thành các giá trị thập lục phân. chẳng hạn, 6andsẽ không hoạt động vì 6alà giá trị hex, nhưng 6ankhông.
Katenkyo

8-math.floor((y-1)/3)thực sự(25-y+(y-1)%3)/3
Leaky Nun
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.