Güç Şebekesi Kaynak Maliyetleri


14

Güç Şebekesi Kaynak Maliyetleri

Giriş

Masa oyunu Power Grid'de , oyunun ayrılmaz bir parçası, güç istasyonlarınızı beslemek için kaynak satın alma eylemidir. Oyunda kullanılan dört tür kaynak vardır (beşi, yenilenebilir enerji eklerseniz, ancak açıkçası bunun için kaynak satın alamazsınız). Bunlar Kömür, Petrol, Çöp ve Uranyum. Kaynak pazarı şöyle görünür:

Kural kitabından alınan kaynak pazarının bir örneği

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

Kaynaklar satın alındığında, en ucuz oldukları pazarın solundan alınır. Piyasaya yeni kaynaklar eklendiğinde, bunlar sağdan eklenir. Görülebileceği gibi, bu bir arz ve talep dengesi üretir - her turda yenilenenden daha fazla kaynak satın alınırsa, o kaynağın fiyatı artacaktır. Benzer şekilde, eğer daha azsa, maliyet azalacaktır.

Kömür, Petrol ve Çöp maliyetleri aynı oranda artarken Uranyum çok daha hızlı ölçekleniyor. Uranyum dışı kaynak maliyetlerinin tek bir birimi 8 - floor((<units available> - 1) / 3). 13 - <units available>5 veya daha fazla birim varsa tek bir Uranyum birimi maliyeti , 18 - (2 * <units available>)aksi takdirde.

Örneğin, oyunun başında 24 adet Kömür satın alınabilir. İlk oyuncu 4 adet Kömür satın almak isterse, ilk üç birim her birine 1, dördüncüsü 2'ye mal olur, bu da toplam maliyeti 5 yapar. İkinci oyuncu da 4 adet Kömür satın almak isterse, maliyet (2 * 2 + 2 * 3) = 10 olacaktır.

Meydan okuma

Sorun, pazarda mevcut olan belirli bir kaynağın var olduğunu varsayarak, belirli bir kaynağın belirli bir miktarını satın alma maliyetini hesaplayan bir program veya işlev yazmaktır.

Gönderiniz makul herhangi bir girdi biçiminde ve herhangi bir sırada aşağıdaki parametreleri kabul etmelidir:

  • Kaynak türü - [C, O, G, U] 'dan biri olması garanti edilir.
  • Piyasada bulunan bu kaynağın miktarı - negatif olmayan bir tamsayı olarak garanti edilir. Kaynak türü U değilse, 24'ten büyük olmaz. Kaynak türü U ise, 12'den büyük olmaz.
  • Bir oyuncunun satın almak istediği kaynağın miktarı - piyasada mevcut olan miktardan daha az veya ona eşit olan negatif olmayan bir tamsayı olması garanti edilir.

Çıktı, istenen kaynakların maliyeti olmalıdır.

Ek Kurallar

  • Verilen formüller sadece açıklama amaçlıdır, istediğiniz maliyetleri hesaplamak için herhangi bir yöntemi kullanmaktan çekinmeyin.
  • Farklı kaynak türleri (C, O, G, U) için harf kodları küçük harf eşdeğerleriyle değiştirilebilir. Ayrıca, sayıların harflerini formda C=0, O=1, G=2, U=3veya biçiminde değiştirebilirsiniz C=1, O=2, G=3, U=4.
  • Bu , bu nedenle bayttaki en küçük gönderim kazanan olacaktır.
  • Gönderiniz, girişi önceki bölümde belirtilenden farklı bir düzen veya biçimde gerektiriyorsa, ayrıntıları belirtmeniz gerekir.

Test senaryoları

Test örneği formatı:

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

Test senaryoları:

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

Girdilerin yasal olduğunu varsayıyor muyuz, yoksa şöyle bir şeyle başa çıkmak zorundayız f("O",1,5)?
Katenkyo

@Katenkyo Hayır, spesifikasyonda detaylandırıldığı gibi, girdilerin geçerli olduğu garanti edilmektedir. Kod golf IMO hata kontrol sıkıcı olduğunu, bu yüzden onunla bitirdim: o)
Sok

Mükemmel, özledim özledim olabilir. Gönderim için gönderi yapacağım :)
Katenkyo

Test durumlarında bazı hatalar olduğunu düşünüyorum. Ben çift kontrol ve var f(G, 11, 4) = 22ve f(O, 10, 7) = 44.
PurkkaKoodari

@ Pietu1998 Kesinlikle haklısın, nasıl yanlış yaptığımı bilmiyorum: \ editing now
Sok

Yanıtlar:


3

Javascript (ES6), 71 59 bayt

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

Alır type, market_amountve buy_amountbağımsız değişkenleri olarak. type0 ile 3 arasında bir tam sayıdır.

gösteri


4

Python 3, 71 69 bayt

-2 bytes için @xnor'a teşekkürler

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)

Sıfır indeksli kaynak türü r, kullanılabilir amiktar ve satın balınacak tutar argümanı yoluyla girdi alan ve maliyeti döndüren bir işlev .

Bu markaları gerçeğinin kullandığını Trueve Falsedenk 1ve 0listeler halinde endekse Boole ifadeleri kullanımına izin veren, Python.

Nasıl çalışır

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 üzerinde deneyin


1
Sen yapabilirsin max(18-2*a,13-a)yerine [18-2*a,13-a][a>4].
xnor

3

Befunge, 142 bayt

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

Burada deneyin! Girdiyi kaynak tamsayısı 0,1,2,3 olan 3 tamsayı olarak alır. Çıktı bir tamsayıdır.

Bu daha iyi golf olabilir eğer hiçbir fikrim yok. O kadar boşluk yok, ama yeni satırlar muhtemelen acıyor.


3

Python 2.7, 85 bayt:

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'ın cevabına dayanarak, ekstra / kat bölümünü kaldırarak bir baytı 85'e kadar azaltabilirsiniz. Bunların tümü tamsayı olduğu için otomatik olarak bir tam sayıya yerleştirilir.


1
PPCG'ye Hoşgeldiniz!
FantaC

2

Python 2.7, 86 bayt:

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

Girdi biçiminde bir dizi tarafından alır [resource type, units available, units to purchase]. Çıktı bir tamsayıdır. Zaman içinde daha fazla golf yapmaya çalışacağız.

Çevrimiçi Deneyin! (Ideone)


2

Lua, 107 101 Bayt

Çağrılması gereken özyinelemeli işlev f(resource,stock,buy). kaynağın 0 ile 3 arasında bir sayı olması gerekir. Çıktı döndürülen değer üzerinden yapılır.

Beni 6 bayt kurtardığın için teşekkürler LeakyNun: 5 bayttan (25-y+(y-1)%3)/3daha kısa 8-math.floor((y-1)/3)ve yerleşimi nedeniyle bir bayt daha kazanmama izin ver.

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

Aşağıdaki kod parçasını kopyalayıp yapıştırarak bu kodu çevrimiçi olarak test edebilirsiniz .

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'yi bilmiyorum, ancak 5.3'te onaltılık değerler oluşturmadıklarında bunlar hakkında şikayet etmeyecek. örneğin, onaltılık bir değer olduğu için 6andçalışmaz 6a, ancak 6ançalışmaz.
Katenkyo

8-math.floor((y-1)/3)gerçekten(25-y+(y-1)%3)/3
Leaky Nun
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.