Recursos-LCC

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

View on GitHub

LA2 | Torneio Extra - 2020/2021


"""
Dada uma calculadora que apenas tem disponível um conjunto fixo de operações e 
cujo valor inicial é zero, implemente uma função que determina qual o número 
mínimo de operações necessárias para atingir um determinado resultado. 
Assuma que tal é sempre possível. 
As operações disponíveis são representadas por uma sequência de strings, 
onde cada string pode ser um dos caracteres '+', '-', '*' ou '/' 
seguido de um número inteiro positivo (o segundo operando) 
ou um único digito, que representa a operação de acrescentar um digito ao 
número actualmente na calculadora. 
Por exemplo, a string "/3" representa a operação de divisão inteira por 3 e 
a string "4" a operação de acrescentar o digito 4 ao número actualmente 
na calculadora (por exemplo, se o número actual é 3 ficará com o número 34).
"""


################################
# Grafos - 90%
################################

def calculadora(ops,res):
    queue = [(0,0)] #res, operaçoes
    vis = [0]

    for r, op in queue:
        if r == res:
            return op

        for string in ops:
            if string[0].isdigit():
                novoNum = int(str(r) + string)
                if novoNum not in vis:
                    queue.append((novoNum, op+1))
                    vis.append(novoNum)
                continue
                
            operacao = string[0]
            num = int(string[1:])

            if operacao == '+':
                novoNum = r+num
            elif operacao == '-' and r > 0:
                novoNum = r-num
            elif operacao == '*' and r > 0:
                novoNum = r*num
            elif operacao == '/':
                novoNum = r//num

            if novoNum == res:
                return op+1

            if novoNum not in vis:
                queue.append((novoNum, op+1))
                vis.append(novoNum)

    return 0



################################
# Brute Force - 100%
################################

def search(ops, res, k, n, i):
    if k == i:
        return res == n
        
    for what in ops:
        cI = n
        if '+' in what:
            what = what.split('+')
            cI += int(what[1])
        elif '-' in what:
            what = what.split('-')
            cI -= int(what[1])
        elif '/' in what:
            what = what.split('/')
            cI //= int(what[1])
        elif '*' in what:
            what = what.split('*')
            cI *= int(what[1])
        else:
            cI = int(str(cI) + str(what))
        if search(ops, res, k, cI, i+1):
            return True

    return False


def calculadora(ops,res):
    print(ops, res)
    k = 0
    while True:
        if search(ops,res,k, 0, 0):
            return k
        k+=1
    return -1


Testes

# 1
ops = ["+1","+2","*3"]
res = 9
> Resultado = 3

# 2
ops = ["+6","-2","*4"]
res = 64
> Resultado = 4

retroceder