En esta entrada se nos pidio que hicieramos un código adaptativo para la compresión de datos y lo que se me ocurrio fue lo siguiente:
1-El texto se manda en partes, esos datos que se envían son en una cierta cantidad.
2- Los datos que entran se le busca un patron que se repita en esa misma cadena y se guardan en un diccionario.
3-Cuando la siguiente parte del mensaje va entrando lo que hace es buscar nuevos patrones además de adaptar los anteriores haciendolos mas grandes.
4- Cada patrón tendra su código binario
5- Se busca en las cadenas ese patron y se sustituye por su código binario.
Me quede solo en sacar lo que son los patrones, su valor en binario
El código es el siguiente:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import random | |
patrones={} | |
posiciones={} | |
#cad='' | |
#i='' | |
#posiciones.setdefault(i,[]) | |
contador=0 | |
def reader(msj): | |
msj=open(msj,'r') | |
text=msj.read()[:-1] | |
msj.close() | |
text=text.replace(' ','3') | |
print text | |
print len(text) | |
longitud=(len(text)) | |
return text,longitud | |
def receptor(cadena,cad): | |
global contador | |
global patrones | |
print 'cadena final',cad | |
c=0 | |
for i in cadena: | |
print 'posiciones',posiciones | |
if i not in posiciones: | |
print 'letra',i | |
print 'contador',contador | |
posiciones.setdefault(i,[]) | |
posiciones[i].append(contador) | |
else: | |
print 'letra',i | |
print 'contador',contador | |
x=1 | |
patron=[] | |
for m in posiciones[i]: | |
print 'm=', m | |
while True: | |
raw_input() | |
print 'Compara' | |
print 'cadena1=',cad[m:(m+x)],'cadena2=',cad[contador:(contador+x)] | |
if (cad[m:(m+x)] == cad[contador:(contador+x)]): | |
print 'Es igual agrega a diccionario' | |
patron.append(cad[contador:contador+x]) | |
print 'patron',patron | |
x +=1 | |
else: | |
print 'NO es igual sale del while' | |
break | |
posiciones[i].append(contador) | |
if str(patron[-1]) not in patrones: | |
patrones[str(patron[-1])]=0 | |
codificar(str(patron[-1]),contador) | |
print 'posiciones',posiciones | |
contador +=1 | |
c +=1 | |
raw_input() | |
print posiciones | |
def codificar(patron,contador): | |
b = bin(contador)[2:] | |
patrones[patron]=str(b) | |
return | |
def emisor(msj,num): | |
print 'num',num | |
n=0 | |
sub='' | |
cad='' | |
while True: | |
sub=msj[n:n+num] | |
if n+num>len(msj): | |
num =len(msj)-(n) | |
cad +=sub | |
receptor(sub,cad) | |
print '--------------------------------------------------------' | |
if len(msj)==n: | |
break | |
n +=num | |
print n | |
print 'patrones',patrones | |
def main(): | |
txt='texto.txt' | |
msj,longitud=reader(txt) | |
div=random.randint(3,6) | |
num=int(longitud/div) | |
emisor(msj,num) | |
main() |
Capturas
Y aquí nos muestra ya su valor en binario
La explicación de lo que se hace queda muy vaga -> 2 pts por el reporte. Por el avance parcial de código, 3 pts.
ResponderEliminarNP en tarea de códigos bloque.
ResponderEliminar