from collections import OrderedDict
from typing import Dict, Union
from axelrod.IIIllIlIIIIII import Action, actions_to_str
from axelrod.player import Player
IlllIllIlIl = Union[int, float]
lIlllIll, lllllIIIIlIl = Action.C, Action.D
class lIIlllllIlIIll(Player):
    IllIIIIllIlIlllIlI = "strategy"
    lIlllIIlIIIlIIIIlI = {
        "memory_depth": float("inf"),  
        "stochastic": True,
        "long_run_time": False,
        "inspects_source": False,
        "manipulates_source": False,
        "manipulates_state": False,
    }
    llIIIlIIlIlIllll = 0.9
    llIllllIlllllllIIIIl = 0.9
    llIIIIlllIIll = 0.1
    IlIIlIlllIlIIlIllII = 12
    def __init__(lIIllIlllIIlIII) -> None:
        super().__init__()
        lIIllIlllIIlIII.lIlllIIlIIIlIIIIlI["stochastic"] = True
        lIIllIlllIIlIII.lIlllIlllllllIl = None  
        lIIllIlllIIlIII.IIIIIlIlII = None  
        lIIllIlllIIlIII.IIIllIlIllIIll = 0
        lIIllIlllIIlIII.lIIlIIlIll = OrderedDict({"": OrderedDict(zip([lIlllIll, lllllIIIIlIl], [0, 0]))})
        lIIllIlllIIlIII.lIlIIIIIllIIllIIllIl = OrderedDict({"": 0})
        lIIllIlllIIlIII.IIIllIIIIIlIIlllllI = ""
    def IllIlIIlIIIII(lIIllIlllIIlIII):
        (llIlIlIlIlIllIllI, IIIIllIlIllllIIl, IIIlllIlIlllllllI, lIlIIlIIllIIlI) = lIIllIlllIIlIII.match_attributes["game"].RPST()
        lIIllIlllIIlIII.IlIlIlllIlIllIllIlI = {lIlllIll: {lIlllIll: llIlIlIlIlIllIllI, lllllIIIIlIl: IIIlllIlIlllllllI}, lllllIIIIlIl: {lIlllIll: lIlIIlIIllIIlI, lllllIIIIlIl: IIIIllIlIllllIIl}}
    def lIIIIlIIIlllIlllII(lIIllIlllIIlIII, lIllIIlllI: Player) -> Action:
        if len(lIIllIlllIIlIII.history) == 0:
            lIIllIlllIIlIII.lIlllIlllllllIl = lIIllIlllIIlIII._random.random_choice()
            lIIllIlllIIlIII.IIIIIlIlII = lIIllIlllIIlIII.lIlllIlllllllIl
        IlIlIlllllI = lIIllIlllIIlIII.lIlIllIllIIIIIlllIIl(lIllIIlllI)
        IIIllIlIlIllllll = lIIllIlllIIlIII.lIllIIIIlIllIIIl(lIllIIlllI)
        if IlIlIlllllI not in lIIllIlllIIlIII.lIIlIIlIll:
            lIIllIlllIIlIII.lIIlIIlIll[IlIlIlllllI] = OrderedDict(zip([lIlllIll, lllllIIIIlIl], [0, 0]))
            lIIllIlllIIlIII.lIlIIIIIllIIllIIllIl[IlIlIlllllI] = 0
        lIIllIlllIIlIII.lIlIlllIlIlI(
            lIIllIlllIIlIII.IIIllIIIIIlIIlllllI, IlIlIlllllI, lIIllIlllIIlIII.lIlllIlllllllIl, IIIllIlIlIllllll
        )
        IIIllIlIIIIII = lIIllIlllIIlIII.IIlIIlIl(IlIlIlllllI)
        lIIllIlllIIlIII.IIIllIIIIIlIIlllllI = IlIlIlllllI
        lIIllIlllIIlIII.lIlllIlllllllIl = IIIllIlIIIIII
        return IIIllIlIIIIII
    def IIlIIlIl(lIIllIlllIIlIII, IlIlIlllllI: str) -> Action:
        IlIIlIlIIllIIl = lIIllIlllIIlIII._random.random()
        llllIllIIIIllIIIlIlI = 1.0 - lIIllIlllIIlIII.llIIIIlllIIll
        if IlIIlIlIIllIIl < llllIllIIIIllIIIlIlI:
            return max(lIIllIlllIIlIII.lIIlIIlIll[IlIlIlllllI], key=lambda x: lIIllIlllIIlIII.lIIlIIlIll[IlIlIlllllI][x])
        return lIIllIlllIIlIII._random.random_choice()
    def lIlIllIllIIIIIlllIIl(lIIllIlllIIlIII, lIllIIlllI: Player) -> str:
        lIIIlllIIIIl = "{:.1f}".format(lIllIIlllI.cooperations)
        IIlllIllII = actions_to_str(lIllIIlllI.history[-lIIllIlllIIlIII.IlIIlIlllIlIIlIllII :])
        return IIlllIllII + lIIIlllIIIIl
    def lIlIlllIlIlI(
        lIIllIlllIIlIII, IIIllIIIIIlIIlllllI: str, IlIlIlllllI: str, IIIllIlIIIIII: Action, IIIllIlIlIllllll
    ):
        lIIllIlllIIlIII.lIIlIIlIll[IIIllIIIIIlIIlllllI][IIIllIlIIIIII] = (1.0 - lIIllIlllIIlIII.llIIIlIIlIlIllll) * lIIllIlllIIlIII.lIIlIIlIll[
            IIIllIIIIIlIIlllllI
        ][IIIllIlIIIIII] + lIIllIlllIIlIII.llIIIlIIlIlIllll * (
            IIIllIlIlIllllll + lIIllIlllIIlIII.llIllllIlllllllIIIIl * lIIllIlllIIlIII.lIlIIIIIllIIllIIllIl[IlIlIlllllI]
        )
        lIIllIlllIIlIII.lIlIIIIIllIIllIIllIl[IIIllIIIIIlIIlllllI] = max(lIIllIlllIIlIII.lIIlIIlIll[IIIllIIIIIlIIlllllI].values())
    def lIllIIIIlIllIIIl(
        lIIllIlllIIlIII, lIllIIlllI: Player
    ) -> Dict[Action, Dict[Action, IlllIllIlIl]]:
        if len(lIllIIlllI.history) == 0:
            IlIllIlIIlIlIIll = lIIllIlllIIlIII._random.random_choice()
        else:
            IlIllIlIIlIlIIll = lIllIIlllI.history[-1]
        return lIIllIlllIIlIII.IlIlIlllIlIllIllIlI[lIIllIlllIIlIII.lIlllIlllllllIl][IlIllIlIIlIlIIll]
class lIlIIIIIIIl(lIIlllllIlIIll):
    IllIIIIllIlIlllIlI = "strategy"
    llIIIlIIlIlIllll = 0.1
    llIllllIlllllllIIIIl = 0.9