O problema: Duas palavra dizem-se deslocadas de n posições se se puder obter os caracteres de uma deslocando cada caracter da outra n posições no alfabeto. Por exemplo, HAL e IBM são palavras deslocadas com uma distância de 1. Escreva um programa que determina se duas palavras são deslocadas ou não de n.
A solução. Definimos o alfabeto e depois procuramos as posições no alfabeto dos caracteres presentes nas duas palavras. É preciso que todas as diferenças tenham o mesmo valor, igual a n.
def deslocadas(pal_1, pal_2,n): """ pal_1 é pal_2 quand se deslocam todos os caracteres de n posições? Exemplo: IBM,HAL e n = 1. """ alfabeto ='abcdefghijklmnopqrstuvwxyz' for i in range(len(pal_1)): indice_1 = alfabeto.find(pal_1[i]) indice_2 = alfabeto.find(pal_2[i]) if (indice_1 - indice_2) != n: return False return TrueNotar que a ordem porque efectuamos a comparação dos índices é relevante. Se n for positivo a primeira palavra deve estar à esquerda da segunda, se for negativo é o contrário. Se quisermos não nos preocupar com a ordem e usar sempre valores positivos de n só temos que acrescentar:
def desloc(p_1,p_2,n): return (deslocadas(p_1, p_2,n) or deslocadas(p_2, p_1,n)P3
O problema: Suponha que tem duas imagens a preto e branco e pretende saber se uma delas, a mais pequena,ocorre na imagem maior. Escreva um programa que resolve esta questão.
A solução. O problema desdobra-se em dois sub-problemas: saber se a operação é possível e, no caso afirmativo, calcular a ocorrência do canto superior esquerdo. Para simplificar a questão criámos um pequeno programa auxiliar que determina se duas imagens são iguais ou não.
def ocorre(img_1, img_2): # possivel n_linhas_1 = len(img_1) n_colunas_1 = len(img_1[0]) n_linhas_2 = len(img_2) n_colunas_2 = len(img_2[0]) possivel = (n_linhas_1 <= n_linhas_2) and (n_colunas_1 <= n_colunas_2) # verifica for l in range(n_linhas_2 - n_linhas_1 + 1): for c in range(n_colunas_2 - n_colunas_1 + 1): # verifica se imagem 1 ocorre a partir da posição (l,c) if igual(img_1,img_2,l,c): return (l,c) return (-1,-1) def igual(img_1,img_2,l,c): for i in range(len(img_1)): for j in range(len(img_1[0])): if img_1[i][j] != img_2[l+i][c+j]: return False return True
Sem comentários:
Enviar um comentário