Stromnetzressourcenkosten

14

Stromnetzressourcenkosten

Einführung

Im Brettspiel Power Grid ist es ein wesentlicher Bestandteil des Spiels, Ressourcen zu kaufen, um Kraftwerke zu tanken. Es gibt vier Arten von Ressourcen, die im Spiel verwendet werden (fünf, wenn Sie erneuerbare Energien einbeziehen, aber dafür können Sie offensichtlich keine Ressourcen kaufen). Dies sind Kohle, Öl, Müll und Uran. Der Ressourcenmarkt sieht folgendermaßen aus:

Ein Beispiel für den Rohstoffmarkt, entnommen aus dem Regelwerk

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

Wenn Rohstoffe gekauft werden, werden sie von der linken Seite des Marktes genommen, wo sie am billigsten sind. Wenn neue Ressourcen zum Markt hinzugefügt werden, werden sie von rechts hinzugefügt. Wie zu sehen ist, führt dies zu einem Gleichgewicht zwischen Angebot und Nachfrage. Wenn in jeder Runde mehr Ressourcen eines bestimmten Typs gekauft als nachgefüllt werden, steigt der Preis für diese Ressource. In ähnlicher Weise verringern sich die Kosten, wenn sie geringer sind.

Kohle, Öl und Müll verteuern sich gleichermaßen, während Uran viel schneller anwächst. Eine einzelne Einheit einer Nicht-Uran-Ressource kostet 8 - floor((<units available> - 1) / 3). Eine einzelne Einheit Uran kostet, 13 - <units available>wenn 5 oder mehr Einheiten verfügbar sind, und 18 - (2 * <units available>)ansonsten.

Zum Beispiel stehen zu Beginn des Spiels alle 24 Einheiten Kohle zum Kauf zur Verfügung. Wenn der erste Spieler 4 Einheiten Kohle kaufen möchte, kosten die ersten drei Einheiten jeweils 1 und die vierte 2, sodass die Gesamtkosten 5 betragen. Dadurch bleiben 20 Einheiten verfügbar. Wenn der zweite Spieler auch 4 Einheiten Kohle kaufen möchte, sind die Kosten (2 * 2 + 2 * 3) = 10.

Die Herausforderung

Ihre Herausforderung besteht darin, ein Programm oder eine Funktion zu schreiben, die die Kosten für den Kauf einer bestimmten Menge einer bestimmten Ressource berechnet, vorausgesetzt, dass eine bestimmte Menge dieser Ressource auf dem Markt vorhanden ist.

Ihre Einreichung sollte in jedem vernünftigen Eingabeformat und in beliebiger Reihenfolge die folgenden Parameter akzeptieren:

  • Der Ressourcentyp - garantiert einer von [C, O, G, U].
  • Die Menge dieser Ressource, die auf dem Markt vorhanden ist - garantiert eine nicht negative ganze Zahl. Wenn der Ressourcentyp nicht U ist, ist er nicht größer als 24. Wenn der Ressourcentyp U ist, ist er nicht größer als 12.
  • Die Menge dieser Ressource, die ein Spieler kaufen möchte - garantiert eine nicht negative ganze Zahl, die kleiner oder gleich der Menge ist, die bereits auf dem Markt vorhanden ist.

Die Ausgabe sollte die Kosten der angeforderten Ressourcen sein.

Zusätzliche Regeln

  • Die angegebenen Formeln dienen nur zur Veranschaulichung. Sie können jede Methode zur Berechnung der von Ihnen gewünschten Kosten verwenden.
  • Die Buchstabencodes für die verschiedenen Ressourcentypen (C, O, G, U) können durch ihre Kleinbuchstaben ersetzt werden. Sie können die Buchstaben auch durch Zahlen ersetzen, entweder in der Form C=0, O=1, G=2, U=3oder C=1, O=2, G=3, U=4.
  • Das ist , also gewinnt die kleinste Einsendung in Bytes.
  • Wenn für Ihre Übermittlung die Eingabe in einer anderen Reihenfolge oder einem anderen Format als im vorherigen Abschnitt angegeben erforderlich ist, sollten Sie Details angeben.

Testfälle

Testfallformat:

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

Testfälle:

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
quelle
Gehen wir davon aus, dass die Eingaben legal sind, oder müssen wir mit Dingen wie umgehen f("O",1,5)?
Katenkyo
@Katenkyo Nein, wie in der Spezifikation angegeben, sind die Eingaben garantiert gültig. IMO Fehler in Code Golf zu überprüfen ist langwierig, so habe ich es beseitigt: o)
Sok
Perfekt, hätte in den technischen Daten fehlen können.
Werde
Ich denke, es gibt einige Fehler in den Testfällen. Ich habe doppelt nachgesehen und bekam f(G, 11, 4) = 22und f(O, 10, 7) = 44.
PurkkaKoodari
@ Pietu1998 Du hast absolut recht, nicht sicher, wie ich das falsch verstanden habe: \ editing now
Sok

Antworten:

3

Javascript (ES6), 71-59 Bytes

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

Nimmt type, market_amountund buy_amountals Argumente. typeist eine ganze Zahl zwischen 0 und 3.

Demo

PurkkaKoodari
quelle
4

Python 3, 71 69 Bytes

Vielen Dank an @xnor für -2 Bytes

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)

Eine Funktion, die Eingaben über Argumente des Ressourcentyps "Null" r, des verfügbaren Betrags aund des zu kaufenden Betrags akzeptiert bund die Kosten zurückgibt.

Dies nutzt die Tatsache, dass Trueund Falsegleichbedeutend mit 1und 0in Python ist, und ermöglicht die Verwendung von Booleschen Ausdrücken, um Listen zu indizieren.

Wie es funktioniert

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

Probieren Sie es auf Ideone

TheBikingViking
quelle
1
Sie können max(18-2*a,13-a)anstelle von tun [18-2*a,13-a][a>4].
Xnor
3

Befunge, 142 Bytes

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

Probieren Sie es hier aus! Nimmt Eingaben als 3 Ganzzahlen an, wobei der Ressourcentyp 0,1,2,3 ist. Die Ausgabe ist eine Ganzzahl.

Keine Ahnung, ob dies besser golfen werden kann. Es gibt nicht so viel Leerzeichen, aber die Zeilenumbrüche schmerzen wahrscheinlich.


quelle
3

Python 2.7, 85 Bytes:

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

Basierend auf der Antwort von R. Kap, aber Sie können ein Byte auf 85 reduzieren, indem Sie die Unterteilung extra / for floor entfernen. Da dies alles ganze Zahlen sind, wird automatisch eine ganze Zahl angegeben.

Strother
quelle
1
Willkommen bei PPCG!
FantaC
2

Python 2.7, 86 Bytes:

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

Übernimmt die Eingabe eines Arrays im Format [resource type, units available, units to purchase]. Die Ausgabe ist eine Ganzzahl. Wird versuchen, im Laufe der Zeit mehr Golf zu spielen.

Probieren Sie es online! (Ideone)

R. Kap
quelle
2

Lua, 107 101 Bytes

Rekursive Funktion, mit der aufgerufen werden muss f(resource,stock,buy). resource muss eine Zahl zwischen 0 und 3 sein. Die Ausgabe erfolgt über den zurückgegebenen Wert.

Vielen Dank an LeakyNun, dass er mir 6 Bytes gespart hat: (25-y+(y-1)%3)/3ist kürzer als 8-math.floor((y-1)/3)5 Bytes und erlaubt mir, aufgrund seiner Platzierung ein weiteres Byte zu gewinnen.

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

Sie können diesen Code online testen, indem Sie das folgende Snippet kopieren und einfügen .

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
quelle
@ Pietu1998 es ist Lua 5.3. Ich kenne 5.2 nicht, aber in 5.3 wird es sich nicht über diese beschweren, wenn sie keine hexadezimalen Werte bilden. Funktioniert beispielsweise 6andnicht, da 6aes sich um einen Hex-Wert handelt, dies jedoch 6annicht.
Katenkyo
8-math.floor((y-1)/3)ist wirklich(25-y+(y-1)%3)/3
Leaky Nun