전력망 자원 비용


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 개를 사고 자한다면, 처음 3 개는 각각 1 개, 4 개는 2 개가되므로 총 비용은 5가됩니다. 두 번째 플레이어가 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 오류 검사는 지루하므로 처리하지 않았습니다. : o)
Sok

완벽, 사양에서 그것을 놓쳤을 수도 있습니다. Gonna는 내 제출을 위해 게시물을 작성합니다 :)
Katenkyo

테스트 사례에 약간의 오류가 있다고 생각합니다. 나는 이중 확인하고 가지고 f(G, 11, 4) = 22f(O, 10, 7) = 44.
PurkkaKoodari

@ Pietu1998 당신은 내가 옳고 그름을 어떻게 알았는지 확실하지 않습니다 : \ edit now
Sok

답변:


3

자바 스크립트 (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_amountbuy_amount인수로. type0과 3 사이의 정수입니다.

데모


4

파이썬 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목록에 인덱스 부울 식의 사용을 허용, 파이썬.

작동 원리

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

펀칭, 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*\- ^

여기 사용해보십시오! 자원 유형이 0,1,2,3 인 3 개의 정수로 입력을받습니다. 출력은 정수입니다.

이것이 더 나은 골프가 될 수 있을지 모르겠다. 공백이 많지 않지만 줄 바꿈이 아마 상처를 입을 수 있습니다.


3

파이썬 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

파이썬 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) . resource는 0에서 3 사이의 숫자 여야합니다. 출력은 리턴 된 값을 통해 수행됩니다.

6 바이트를 절약 해 주셔서 감사합니다 LeakyNun : 5 바이트 (25-y+(y-1)%3)/3보다 짧으며 8-math.floor((y-1)/3)배치로 인해 하나 이상의 바이트를 얻을 수 있습니다.

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 그것은 루아 5.3입니다. 5.2에 대해서는 모르지만 5.3에서는 16 진수 값을 형성하지 않을 때 이에 대해 불평하지 않습니다. 예를 들어 16 진수 값 6and이므로 작동하지 않지만 작동 하지 않습니다. 6a6an
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.