Koszty zasobów sieci energetycznej

14

Koszty zasobów sieci energetycznej

Wprowadzenie

W grze planszowej Power Grid integralną częścią gry jest kupowanie zasobów do zasilania elektrowni. Istnieją cztery rodzaje zasobów używanych w grze (pięć, jeśli uwzględnisz energię odnawialną, ale oczywiście nie możesz do tego kupić surowców). Są to węgiel, ropa, śmieci i uran. Rynek zasobów wygląda następująco:

Ilustracja rynku zasobów, zaczerpnięta z instrukcji

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

Kiedy zasoby są kupowane, są pobierane z lewej strony rynku, gdzie są najtańsze. Gdy nowe zasoby są dodawane do rynku, są dodawane od prawej strony. Jak widać, powoduje to równowagę podaży i popytu - jeśli kupuje się więcej zasobów danego rodzaju niż jest uzupełnianych w każdej rundzie, cena tego surowca wzrośnie. Podobnie, jeśli jest mniejszy, koszt się zmniejszy.

Węgiel, ropa i śmieci zwiększają koszty w tym samym tempie, podczas gdy uran skaluje się znacznie szybciej. Jedna jednostka kosztu zasobów innych niż uran 8 - floor((<units available> - 1) / 3). Jedna jednostka uranu kosztuje, 13 - <units available>jeśli dostępnych jest 5 lub więcej jednostek, i 18 - (2 * <units available>)inaczej.

Na przykład na początku gry do kupienia są wszystkie 24 jednostki Węgla. Jeśli pierwszy gracz chciałby kupić 4 jednostki Węgla, pierwsze trzy jednostki kosztują 1, a czwarty kosztuje 2, co daje całkowity koszt 5. To pozostawia 20 jednostek. Jeśli drugi gracz chciałby również kupić 4 jednostki Węgla, koszt wyniósłby (2 * 2 + 2 * 3) = 10.

Wyzwanie

Twoim wyzwaniem jest napisanie programu lub funkcji, która oblicza koszt zakupu określonej ilości określonego zasobu, przy założeniu, że na rynku jest określona ilość tego zasobu.

Zgłoszenie powinno akceptować, w dowolnym rozsądnym formacie wejściowym i dowolnej kolejności, następujące parametry:

  • Typ zasobu - z pewnością jeden z [C, O, G, U].
  • Ilość tego zasobu obecnego na rynku - z pewnością nieujemną liczbą całkowitą. Jeśli typ zasobu nie jest U, nie będzie większy niż 24. Jeśli typ zasobu to U, nie będzie większy niż 12.
  • Ilość tego zasobu, którą gracz chciałby kupić - z pewnością nieujemną liczbą całkowitą, która jest mniejsza lub równa ilości już obecnej na rynku.

Wynik powinien być kosztem wymaganych zasobów.

Dodatkowe zasady

  • Podane formuły służą wyłącznie celom ilustracyjnym i zachęcamy do skorzystania z dowolnej metody obliczania żądanych kosztów.
  • Kody literowe dla różnych typów zasobów (C, O, G, U) można zastąpić ich małymi literami. Możesz także zastąpić litery cyframi, w formie C=0, O=1, G=2, U=3lub C=1, O=2, G=3, U=4.
  • To jest , więc zwycięzcą będzie najmniejsze przesłanie w bajtach.
  • Jeśli przesłanie wymaga wprowadzenia danych w innej kolejności lub formacie niż podano w poprzedniej sekcji, należy podać szczegółowe informacje.

Przypadki testowe

Format przypadku testowego:

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

Przypadki testowe:

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
źródło
Czy zakładamy, że dane wejściowe są legalne, czy też musimy zajmować się takimi sprawami f("O",1,5)?
Katenkyo,
@Katenkyo Nie, jak wyszczególniono w specyfikacji, gwarantuje się, że dane wejściowe są ważne. Błąd IMO podczas sprawdzania kodu golfa jest żmudny, więc zlikwidowałem go: o)
Sok
Idealnie, mogłem tego nie zauważyć w specyfikacji. Zrobię post dla mojego zgłoszenia :)
Katenkyo
Myślę, że w testowych przypadkach są pewne błędy. Sprawdziłem dwukrotnie i dostałem f(G, 11, 4) = 22i f(O, 10, 7) = 44.
PurkkaKoodari
@ Pietu1998 Masz absolutną rację, nie jestem pewien, jak to zrobiłem źle: \ edycja teraz
Sok

Odpowiedzi:

3

JavaScript (ES6), 71 59 bajtów

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

Trwa type, market_amounta buy_amountjako argumenty. typejest liczbą całkowitą od 0 do 3.

Próbny

PurkkaKoodari
źródło
4

Python 3, 71 69 bajtów

Dzięki @xnor za -2 bajty

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)

Funkcja, która pobiera dane wejściowe za pomocą argumentu typu zasobu o indeksie zerowym r, dostępnej kwoty ai kwoty do zakupu b, i zwraca koszt.

To sprawia, że korzystać z tego, że Truei Falsezrównać się 1i 0w Pythonie, pozwalając na korzystanie z wyrażeń logicznych do indeksu na listy.

Jak to działa

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

Wypróbuj na Ideone

TheBikingViking
źródło
1
Możesz zrobić max(18-2*a,13-a)zamiast [18-2*a,13-a][a>4].
xnor 13.07.16
3

Befunge, 142 bajty

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

Wypróbuj tutaj! Pobiera dane wejściowe jako 3 liczby całkowite, gdzie typ zasobu to 0,1,2,3. Dane wyjściowe to liczba całkowita.

Nie mam pojęcia, czy można lepiej grać w golfa. Nie ma zbyt wielu białych znaków, ale nowe linie prawdopodobnie bolą.


źródło
3

Python 2.7, 85 bajtów:

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

Na podstawie odpowiedzi R. Kapa, ​​ale możesz ogolić bajt do 85, usuwając dodatkowy / for podział podłogi. Ponieważ są to liczby całkowite, automatycznie jest sprowadzane do liczby całkowitej.

Strother
źródło
1
Witamy w PPCG!
FantaC
2

Python 2.7, 86 bajtów:

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

Pobiera dane wejściowe przez tablicę w formacie [resource type, units available, units to purchase]. Dane wyjściowe to liczba całkowita. Z czasem spróbuje grać w golfa.

Wypróbuj online! (Ideone)

R. Kap
źródło
2

Lua, 107 101 bajtów

Funkcja rekurencyjna, którą należy wywołać f(resource,stock,buy). zasób musi być liczbą z zakresu od 0 do 3. Dane wyjściowe są wykonywane za pomocą zwracanej wartości.

Dzięki LeakyNun za uratowanie mnie 6 bajtów: (25-y+(y-1)%3)/3jest krótszy niż 8-math.floor((y-1)/3)o 5 bajtów i pozwala mi zyskać jeszcze jeden bajt ze względu na jego położenie.

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

Nie golfił

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

Możesz przetestować ten kod online , wklejając poniższy fragment kodu .

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
źródło
@ Pietu1998 to Lua 5.3. Nie wiem o 5.2, ale w 5.3 nie narzeka na nie, gdy nie tworzą wartości szesnastkowych. na przykład 6andnie będzie działać, ponieważ 6ajest wartością szesnastkową, ale 6annie jest.
Katenkyo,
8-math.floor((y-1)/3)jest naprawdę(25-y+(y-1)%3)/3
Leaky Nun