#format python

"""YootNoriSimulation
""" 
 
import random 
 
class YootNori: 
    pass 
 
class Mo(YootNori): 
    def getUpCount(self): 
        return 4 
    def getName(self): 
        return "MO" 
    def getPossibility(self): 
        return 1 
         
class Do(YootNori): 
    def getUpCount(self): 
        return 3 
    def getName(self): 
        return "DO" 
    def getPossibility(self): 
        return 4 
 
class Ge(YootNori): 
    def getUpCount(self): 
        return 2 
    def getName(self): 
        return "GE" 
    def getPossibility(self): 
        return 6 
 
class Gul(YootNori): 
    def getUpCount(self): 
        return 1 
    def getName(self): 
        return "GUL" 
    def getPossibility(self): 
        return 4 
 
class Yoot(YootNori): 
    def getUpCount(self): 
        return 0 
    def getName(self): 
        return "YOOT" 
    def getPossibility(self): 
        return 1 
 
mapOfUpCount = {4:Mo, 3:Do, 2:Ge, 1:Gul, 0:Yoot} 
mapOfYootName = {'MO':Mo, 'DO':Do, 'GE':Ge, 'GUL':Gul, 'YOOT':Yoot} 
 
class DoingYootNori: 
    def __init__(self, aProbabilityUp): 
        self.probUp = aProbabilityUp 
    def throwOneYoot(self): 
        rand = random.random() 
        if rand > self.probUp: 
            return 0 
        else : return 1 
 
    def throwFourYoot(self): 
        yootlist = [] 
        for i in range(4): 
            yootlist.append(self.throwOneYoot()) 
        return yootlist 
 
    def judgeYoot(self, aYootList): 
        upcount = aYootList.count(1) 
        return mapOfUpCount[upcount]().getName() 
 
    def throw(self): 
        yootlist = self.throwFourYoot() 
        return self.judgeYoot(yootlist) 
 
    def getProbability(self, judge): 
        theYoot = mapOfYootName[judge]() 
        upProb = self.probUp 
        downProb = 1-upProb 
        upCount = theYoot.getUpCount() 
        downCount = 4-upCount 
 
        if upCount == 0: 
            theProb = downProb**downCount 
        elif downCount == 0: 
            theProb = upProb**upCount 
        else: 
            theProb = (downProb**downCount) * (upProb**upCount) 
        return theProb * theYoot.getPossibility() 
 
    def __repr__(self): 
        aString = '' 
        for aYoot in mapOfYootName.keys(): 
            aString += ( aYoot + "'s probability is " 
                         + str(self.getProbability(aYoot)) + '\n') 
        return aString 
 
def returnMoAndGe(aProb): 
    thisGame = DoingYootNori(aProb) 
    probMo = thisGame.getProbability('MO') 
    probGe = thisGame.getProbability('GE') 
    return probMo, probGe 
 
def statEqualMoAndGe(aOneProb, aStep): 
    probMo, probGe = returnMoAndGe(aOneProb) 
    probDiff = probGe - probMo 
    if probDiff < 0: 
        return aOneProb 
    else: 
        newProb = aOneProb + aStep 
        return statEqualMoAndGe(newProb, aStep) 
 
if __name__ == '__main__': 
    myGame = DoingYootNori(0.71) 
    theYoot = myGame.throw() 
    print "You throw ", theYoot, '\n' 
    print myGame 
    print "The probability that equal Mo and Do is ", 
    print statEqualMoAndGe(0.5, 0.001)