sexta-feira, 18 de outubro de 2013

Teste 1 - TP9

Pergunta 1 O espaço dos objectos é o local da memória onde estão guardados os objectos. Em particular, os atributos valor e tipo. O espaço dos nomes é o local da memória onde estão armazenados os nomes que foram associados a objectos através de uma atribuição explícita (caso da instrução de atribuição =) ou implícita (caso de uma definição (def) ou da importação de um módulo (import). Visualmente temos a seguinte situação para cada um dos três casos referidos.
Pergunta 2 Olhando para a cara o que vemos? Que é composta a partir de quadrados e rectângulos coloridos. E os quadrados são um caso particular de rectângulos. Então só precisamos de uma função auxiliar.
def rect_cor(posx,posy,lado1,lado2,cor):
    # Atributos
    turtle.penup()
    turtle.goto(posx,posy)
    turtle.pendown()
    turtle.fillcolor(cor)
    turtle.begin_fill()
    for i in range(4):
        if i%2 == 0:
            turtle.forward(lado1)
        else:
            turtle.forward(lado2)
        turtle.left(90)
    turtle.end_fill()
    turtle.hideturtle()
Com esta implementação podemos colocar o rectângulo em qualquer posição e com qualquer cor!

A partir do momento em que temos esta possibilidade o resto é apenas calcular as posições e definir a cor de cada rectângulo ou quadrado. Numa solução simples, e mais não era pedido, podemos assumir que a cara fica sempre na mesma posição, no caso da nossa implementação no ponto (0,0). Notar que este ponto corresponde ao canto inferior esquerdo da cara.
def cara():
    # cabeça
    rect_cor(0,0,120,120,'white')
    # olhos
    rect_cor(30,85,20,20,'blue')
    rect_cor(70,85,20,20,'blue')
    # nariz
    rect_cor(55,30,10,35,'red')
    # boca
    rect_cor(50,15,20,10,'yellow')
    # orelhas
    rect_cor(-10,60,10,30,'red')
    rect_cor(120,60,10,30,'red')
Pergunta 3 Pedem-nos para comparar duas cadeias de caracteres posição a posição e determinar em quantas os respectivos caracteres são diferentes. Chama-se a isto a Distância de Hamming. Vamos esquecer para já o problema de tamanhos diferentes e assumimos que têm o mesmo comprimento. Uma solução simples é percorrer as duas cadeias por posição e comparar.
def hamming_basico(cadeia_1, cadeia_2):
    """Calcula a distância de Hamming de duas cadeias."""
    distancia = 0
    for i in range(tamanho_menor):
        if cadeia_1[i] != cadeia_2[i]:
            distancia = distancia + 1
    return distancia   
Ter feito isto já valia bastante. Agora o problema do tamanho. Por definição os caracteres em excesso da cadeia maior são diferentes dos da outra (que não existem!). Logo só temos que somar a dirença. Por outro lado temos que ter o cuidado de percorrer as duas cadeias um número de vezes igual ao tamanho da de menor comprimento. Logo, usando apenas funções mencionadas nas aulas:
def hamming(cadeia_1, cadeia_2):
    """Calcula a distância de Hamming de duas cadeias."""
    tamanho_menor = min(len(cadeia_1), len(cadeia_2))
    distancia = 0
    for i in range(tamanho_menor):
        if cadeia_1[i] != cadeia_2[i]:
            distancia = distancia + 1
    tamanho_maior = max(len(cadeia_1), len(cadeia_2))
    distancia = distancia + (tamanho_maior - tamanho_menor)
    return distancia
Em alternativa podíamos ainda fazer:
def hamming_b(cadeia_1, cadeia_2):
    """Calcula a distância de Hamming de duas cadeias."""
    tamanho_menor = min(len(cadeia_1), len(cadeia_2))
    distancia = 0
    for i in range(tamanho_menor):
        if cadeia_1[i] != cadeia_2[i]:
            distancia = distancia + 1
    distancia = distancia + abs(len(cadeia_1)- len(cadeia_2))
    return distancia
A função abs dá-nos o módulo do número dado como argumento: abs(-5) e abs(5) são ambos iguais a 5. Este exemplo e a sua solução ilustram o poder das abstracção que permite a escrita de programas modulares e ainda a técnica de encontrar primeiro uma solução para um problema mais simples e depois completar a solução.

Sem comentários:

Enviar um comentário