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