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:
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=3
lubC=1, O=2, G=3, U=4
. - To jest golf golfowy , 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
f("O",1,5)
?f(G, 11, 4) = 22
if(O, 10, 7) = 44
.Odpowiedzi:
JavaScript (ES6),
7159 bajtówTrwa
type
,market_amount
abuy_amount
jako argumenty.type
jest liczbą całkowitą od 0 do 3.Próbny
Pokaż fragment kodu
źródło
Python 3,
7169 bajtówDzięki @xnor za -2 bajty
Funkcja, która pobiera dane wejściowe za pomocą argumentu typu zasobu o indeksie zerowym
r
, dostępnej kwotya
i kwoty do zakupub
, i zwraca koszt.To sprawia, że korzystać z tego, że
True
iFalse
zrównać się1
i0
w Pythonie, pozwalając na korzystanie z wyrażeń logicznych do indeksu na listy.Jak to działa
Wypróbuj na Ideone
źródło
max(18-2*a,13-a)
zamiast[18-2*a,13-a][a>4]
.Befunge, 142 bajty
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
Python 2.7, 85 bajtów:
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.
źródło
Python 2.7, 86 bajtów:
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ódło
Lua,
107101 bajtówFunkcja 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)/3
jest 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.Nie golfił
Możesz przetestować ten kod online , wklejając poniższy fragment kodu .
źródło
6and
nie będzie działać, ponieważ6a
jest wartością szesnastkową, ale6an
nie jest.8-math.floor((y-1)/3)
jest naprawdę(25-y+(y-1)%3)/3