Trata-se do problema inverso do problema 2.22. Temos então a cadeia codificada de maneira que na primeira metade estão os caracteres das posições pares na cadeia original, e na segunda metade estão os caracteres das posições ímpares da cadeia original. Então tudo se resume a descobrir o meio da cadeia separar em duas partes e depois fazer a fusão de modo que a ordem par/ímpar seja preservada. Só que ... onde é o meio da cadeia? Se o número de caracteres for par não há problema. Mas se for ímpar? Bom ,neste caso na cadeia original os pares são mais um do que os ímpares. Com base nisso, chegamos à solução:
def descodifica_a(cad):
"""
Descodifica uma cadeia codificada pelo método da separação em pares e
impares.
"""
cadeia = ''
par = (len(cad) % 2) == 0 # número par ou ímpar de caracteres?
if par:
meio = len(cad) / 2
inf = cad[:meio]
sup = cad[meio:]
for i in range(len(sup)):
cadeia = cadeia + inf[i] + sup[i] # fusão
else:
meio = (len(cad) / 2) + 1
inf = cad[:meio]
sup = cad[meio:]
for i in range(len(sup)):
cadeia = cadeia + inf[i] + sup[i]
cadeia = cadeia + inf[-1]
return cadeia
Et voilá! Dúvidas?
another way :
ResponderEliminardef dencripta():
msg=raw_input("introduza uma msg para descodificar: ")
idpares=''
idimpares=''
msgdesc=''
for i in range(len(msg)/2):
idpares = idpares + msg[i]
for x in range(len(msg)/2,len(msg)):
idimpares =idimpares + msg[x]
for z in range(len(idpares)):
msgdesc=msgdesc+idpares[z]+idimpares[z]
return msgdesc
by mymind and HUgoC
à primeira vista tem dois problemas: (1) se a cadeia for de comprimento ímpar perde-se um elemento; (2) usa três ciclos, não sendo por isso muito eficiente ( a operação de fatiamento resolve isso...).
ResponderEliminar