Seiten

  • Startseite
  • Impressum
  • Inhalt
  • MINT
  • Sprache
  • Soziales
  • Geist
  • Kunst
  • Gemischtes
  • Gedichte

Sonntag, 19. April 2015

Bohnanza: Wert einer Bohne #2


Deutsch

Nach­dem ich schon ein­mal über­legt hat­te, wie man am bes­ten den Wert ei­ne Boh­ne während ei­nes Spie­les be­stimmt, bin ich nun zu ei­ner (zu­min­dest mich) zu­frie­den­stel­len­den Lösung ge­kom­men. Und zwar ge­be ich den Wert ei­ner Boh­ne in Punk­ten an. (Man könn­te auch Pro­zent neh­men, da sich die Punk­te stets zwi­schen 0 und 1 be­we­gen, aber das fände ich ir­reführend, da es sich nicht wirk­lich um ein Verhält­nis han­delt. Nichts­de­sto­trotz wer­de ich das Pro­z­ent­zei­chen ver­wen­den, um die Punk­te an­zu­ge­ben.) Die For­mel zur Be­rech­nung vor­weg:
W(t)=N(T(A(t)))/A(t)
bzw.
W(p)=N(T(A(p)))/A(p),
wo­bei t bzw. p für den ak­tu­el­len Zeit­punkt bzw. die ver­stri­che­ne Zeit in % steht. A(p)=⌈A*(1-p)⌉ ist dann die An­zahl der zu die­sem Zeit­punkt im Spie­le be­find­li­chen Boh­nen. Natürlich müss­te man die Boh­nen mitzählen (ei­ne Strich­lis­te böte sich an), dann wäre das Er­geb­nis ge­nau­er, aber das macht ja nie­mand ... Al­so ge­hen wir von ei­ner Gleich­ver­tei­lung aus.
T(N) gibt uns die An­zahl von Ta­lern, die man beim Ern­ten von N Boh­nen (der be­trach­te­ten Sor­te) erhält; N(T) lie­fert die An­zahl von Boh­nen, die man für T Ta­ler benötigt. Der Wert ei­ner Boh­nen­sor­te ist folg­lich der Quo­ti­ent aus der An­zahl der für die ma­xi­mal zu be­kom­men­den Ta­ler benötig­ten Boh­nen und der ak­tu­el­len Ge­samt­zahl der Boh­nen. Ei­ne Boh­nen­sor­te ist so­mit im­mer dann am wert­volls­ten (bei 100 Punk­ten), wenn sich im Spiel ge­nau so vie­le Boh­nen be­fin­den, dass man ei­ne Bohno­me­ter­stu­fe voll­be­kommt. Bspw. sind Feu­er­boh­nen bei den An­zah­len 3, 6, 8 und 9 (Feu­er­boh­nen­bohno­me­ter) am wert­volls­ten, an­sons­ten min­der wert und un­ter 3 gänz­lich wert­los.
Nun noch ein Bei­spiel. Was ist der Wert von Blau­en Boh­nen nach 75% der Spiel­zeit (da wohl nie­mand hell­se­hen kann, muss man die­se Zeit abschätzen und/oder sich an dem Ver­pa­ckungs­auf­druck ori­en­tie­ren)?
V(75%)=N(T(A(75%)))/A(75%)=N(T(5))/5=N(1)/5=4/5=80%
Der Wert von Blau­en Boh­nen liegt al­so bei 80 Punk­ten. Das heißt aber nicht, dass er nicht wie­der stei­gen kann. Neh­men wir an, dass je­mand vier oder fünf Blaue Boh­nen an­baut und abern­tet und dafür 1 Ta­ler be­kommt (al­so ei­ne Blaue Boh­ne aus dem Spiel nimmt), dann liegt der Wert von Blau­en Boh­nen wie­der bei 100 Punk­ten. In­tui­tiv klingt das auch rich­tig so, denn nun ist je­de ein­zel­ne Boh­ne wich­tig, um den ma­xi­ma­len Ge­winn aus die­ser Sor­te her­aus­schla­gen zu können.
Zu gu­ter Letzt ha­be ich – wie könn­te es an­ders sein? – ein Py­thon-Skript ge­schrie­ben, wel­ches den Wer­te­ver­lauf ei­ner Boh­nen­sor­te gra­phisch dar­stellt:
import math
import sys
# size of the diagramme: x = size, y = size/2
# (do not change!)
size = 50
# functions for labeling the scales
def yscale(i):
    ysc = str(abs(100/(size/2)*i-100))
    while len(ysc) < 3:
        ysc = " " + ysc
    return ysc + "-"
def xscale(j):
    xsc = "     "
    for j in range(size+1):
        if j % 5 == 0:
            xsc += "|"
        else:
            xsc += " "
    xsc += "\n     "
    for j in range(size+1):
        if j % 5 == 0:
            xs = str(100/size*j)
            while len(xs) < 5:
                xs += " "
            xsc += xs
    return xsc
# function for making the values visible in the diagramme
def conv(arr, iv):
    for i in range(len(arr)):
        s = 0
        while (arr[i]+s) % iv != 0:
            if s < 0:
                s = -s
            else:
                s = -(s+1)
        arr[i] = arr[i]+s
    return arr
# the time values
t = range(100+1)
# detecting the bean type to show
try:
    bean = sys.argv[1]
except Exception:
    bean = ""
if bean == "coffee":
    a = 24
    bm = {4:1, 7:2, 10:3, 12:4}
elif bean == "wax":
    a = 22
    bm = {4:1, 7:2, 9:3, 11:4}
elif bean == "blue":
    a = 20
    bm = {4:1, 6:2, 8:3, 10:4}
elif bean == "chili":
    a = 18
    bm = {3:1, 6:2, 8:3, 9:4}
elif bean == "stink":
    a = 16
    bm = {3:1, 5:2, 7:3, 8:4}
elif bean == "green":
    a = 14
    bm = {3:1, 5:2, 6:3, 7:4}
elif bean == "soy":
    a = 12
    bm = {2:1, 4:2, 6:3, 7:4}
elif bean == "black-eyed":
    a = 10
    bm = {2:1, 4:2, 5:3, 6:4}
elif bean == "red":
    a = 8
    bm = {2:1, 3:2, 4:3, 5:4}
elif bean == "garden":
    a = 6
    bm = {2:2, 3:3}
elif bean == "cocoa":
    a = 4
    bm = {2:2, 3:3, 4:4}
else:
    try:
        bean = bean.split(":")
        a = int(bean[0])
        bean = bean[1].split(",")
        bm = {}
        for b in bean:
            b = b.split("/")
            bm.update({int(b[0]) : int(b[1])})
    except Exception:
        print "Unaccepted parameter!"
        exit()
# the number of beans depending on the time
at = []
for k in t:
    at.append(math.ceil(a*(100-k)/100))
# the beans' values
v = []
for k in at:
    n = k
    while (not n in bm) and n > 0:
        n -= 1
    try:
        v.append(round(n/k*100))
    except ZeroDivisionError:
        v.append(0)
# setting x and y as time and value
x = conv(t, 100/size)
y = conv(v, 100/(size/2))
# getting diagramme points
def f(i,j):
    for n in range(len(x)):
        if x[n] == (100/size*j) and y[n] == abs(100/(size/2)*i-100):
            return "+"
    return " "
# drawing the diagramme
out = "\n    value in points\n\n    ^\n"
for i in range(size/2+2):
    if i < size/2+1:
        out += yscale(i) + "|"
    else:
        out += "     "
    for j in range(size+1):
        if i == size/2+1:
            out += "-"
            if j == size:
                out += ">\ttime in %"
        else:
            out += f(i,j)
    out += "\n"
out += xscale(None)
print out
Beim Auf­ru­fen des Skrip­tes in der Kom­man­do­zei­le muss ent­we­der der (eng­li­sche) Na­me der Boh­ne mit­ge­ge­ben wer­den oder der Bohno­me­ter. Für Blaue Boh­nen al­so blue oder 20:4/1,6/2,8/3,10/4.
> python bean.py blue

    value in points

    ^
100-|                       +++  +++  +++  +++
 96-|
 92-|                    +++
 88-|                         +++
 84-|                  +++         +++
 80-|                                   +++
 76-|               +++
 72-|             +++
 68-|          +++
 64-|        +++
 60-|     +++
 56-|   +++
 52-|+++
 48-|+
 44-|
 40-|
 36-|
 32-|
 28-|
 24-|
 20-|
 16-|
 12-|
  8-|
  4-|
  0-|                                        +++++++++++
     --------------------------------------------------->       time in %
     |    |    |    |    |    |    |    |    |    |    |
     0    10   20   30   40   50   60   70   80   90   100

> 
Ty­pisch für den Wer­te­ver­lauf der meis­ten Boh­nen­sor­ten ist, dass er erst bis 100 Punk­te an­steigt, bis die höchs­te Bohno­me­ter­zahl er­reicht ist. Dann geht es im Zick­zack zwi­schen 100 und we­ni­ger Punk­ten hin und her. Und schließlich fällt er nach der nied­rigs­ten Bohno­me­ter­zahl auf 0 Punk­te.

Keine Kommentare:

Kommentar veröffentlichen