Recursos-LCC

Um arquivo de todo material que consegui reunir, pertinente ao curso de LCC da UM.

View on GitHub

LA2 | Treino 3 | Robot


"""
Implemente uma função que determina qual a probabilidade de um robot regressar 
ao ponto de partido num determinado número de passos. Sempre que o robot dá um 
passo tem uma determinada probabilidade de seguir para cima ('U'), baixo ('D'), 
esquerda ('L') ou direita ('R'). A função recebe o número de passos que o 
robot vai dar e um dicionário com probabilidades de se movimentar em cada uma
das direcções (as chaves são os caracteres indicados entre parêntesis).
O resultado deve ser devolvido com a precisao de 2 casas decimais.
"""


def aux(pa, pb, pos, dic):
    if pa == 0:
        return pos == (0,0)
    
    if (pa-1,(pos[0],pos[1]+1)) not in dic:
        dic[(pa-1,(pos[0],pos[1]+1))] = aux(pa-1, pb, (pos[0],pos[1]+1), dic)
    u = pb['U']*dic[(pa-1,(pos[0],pos[1]+1))]
    
    if (pa-1,(pos[0],pos[1]-1)) not in dic:
        dic[(pa-1,(pos[0],pos[1]-1))] = aux(pa-1, pb, (pos[0],pos[1]-1), dic)
    d = pb['D']*dic[(pa-1,(pos[0],pos[1]-1))]
    
    if (pa-1,(pos[0]+1,pos[1])) not in dic:
        dic[(pa-1,(pos[0]+1,pos[1]))] = aux(pa-1, pb, (pos[0]+1,pos[1]), dic)
    r = pb['R']*dic[(pa-1,(pos[0]+1,pos[1]))]
    
    if (pa-1,(pos[0]-1,pos[1])) not in dic:
        dic[(pa-1,(pos[0]-1,pos[1]))] = aux(pa-1, pb, (pos[0]-1,pos[1]), dic)
    l = pb['L']*dic[(pa-1,(pos[0]-1,pos[1]))]

    return u+d+r+l
    
    

def probabilidade(passos,probs):
    if passos %2 != 0:
        return 0.0
    
    return round(aux(passos, probs, (0,0), {}),2)


Testes

# 1
passos = 2
probs = {'U':0.25,'D':0.25,'L':0.25,'R':0.25}
> Resultado = 0.25

# 2
capacidade = 6
probs = {'U':0.17,'D':0.33,'L':0.29,'R':0.21}
> Resultado = 0.08

retroceder