def mensajes_cifrados(): tabla = crear_tabla(10) tabla_aux = crear_tabla(10) def desifrar(dato): dic = {'#?&': '0','abc': '1','def':'2','ghi':'3','jkl':'4','mnñ':'5','opq':'6','rst':'7','uvw':'8','xyz':'9'} cadena = '' for i in range (0, len(dato), 3): cadena += dic[dato[i:i+3]] return chr(int(cadena)) def cifrar(dato): valor = str(ord(dato)) valor_cirado = ['#?&','abc','def','ghi','jkl','mnñ','opq','rst','uvw','xyz'] cadena = '' for num in valor: numInt = int(num) cadena += valor_cirado[numInt] cadena += "%" return cadena a = 'El hombre adecuado en el sitio equivocad0 puede cambiar el rumbo del mundo. Despierte, Sr. Freeman. Despierte y mire a su alrededor.' a_cifrado = '' print('Mensaje a cifrar:') print(a) print() # cifrando for letra in a: valor = buscar_ta(tabla, hash_diccionario, Palabra(letra, ''), 'palabra') cifrado = '' if valor is None: cifrado = cifrar(letra) palabra = Palabra(letra, cifrado) agregar_ta(tabla, hash_diccionario, palabra, 'palabra') else: cifrado = valor.info.significado a_cifrado += cifrado print('Mensaje cifrado:') print(a_cifrado) print() lista = a_cifrado.split('%') lista.pop() # desifrando msj = '' for letras in lista: valor = buscar_ta(tabla_aux, bernstein_palabra, Palabra(letras, ''), 'palabra') decifrado = '' if valor is None: decifrado = desifrar(letras) palabra = Palabra(letras, decifrado) agregar_ta(tabla_aux, bernstein_palabra, palabra, 'palabra') else: decifrado = valor.info.significado msj += decifrado print('Mensaje decifrado') print(msj)
def DVader(): legion = ['FL', ' TF', 'TK', 'CT', 'FN', 'FO'] tablaL = crear_tabla(10) tablaC = crear_tabla(1500) for i in range(1500): legion = choice(legion) cod = randint(1000, 5000) st = Stormtroopers(legion, cod) agregar_ta(tablaL, bernstein_st, st, 'legión') agregar_ta(tablaC, hash_division_st, st, 'código') print('Sormtroopers ordenados por legion: ') barrido_ta(tablaL) print('Stormtroopers ordenados por código: ') barrido_ta(tablaC) pos = hash_division(537, tablaC) if tablaC[pos]: print('Stormtrooper designados para una misión de exploración') barrido_lista(tablaC[pos]) print() pos = hash_division(781, tablaC) if tablaC[pos]: print('Stormrooper designados para una misión de asalto') barrido_lista(tablaC[pos]) print() posl = bernstein('FN', tablaL) if tablaL[posl]: print('Stormroopers de la Legión FN') barrido_lista(tablaL[posl]) print() posl = bernstein('CT', tablaL) if tablaL[posl]: print('Stormtroopers de la Legión CT') barrido_lista(tablaL[posl])
def personajes_sw(): tabla = crear_tabla(20) personajes = ['Darth Vader', 'Luke Skywalker', 'Chewbacca', 'Yoda', 'R2D2', 'Jabba el Hutt', 'Obi-Wan Keobi', 'Han Solo', 'C3PO', 'Leia Organa', 'Rey', 'Poe Dameron', 'Finn', 'Lando Calrissian', 'Jabba el Hutt', 'Boba Fett', 'Jawa', 'Darth Maul', 'Anakin Skywalker', 'Bobba Fett', 'Jar Jar Binks', 'Darth Sidious', 'Kylo Ren', 'Obi-Wan Kenobi', 'Greddo', 'Wilhuff Tarkin', 'Owen Lars', 'Breha Organa'] pos = 0 for i in range(0, len(personajes)): nom = personajes[pos] dato_sw = Personaje(nom) agregar_tc(tabla, bernstein_star_wars, dato_sw) pos += 1 print('Tabla de personajes de Star Wars con', len(tabla), 'posiciones') barrido_tc(tabla) # porcentaje de personajes cargados porc_tabla = (cantidad_tc(tabla)*100)/len(tabla) print('Porcentaje usado de la tabla', porc_tabla) print() if porc_tabla > 75: print('El factor de carga de la tabla supero el 75%. Haciendo rehashing...') nueva_tabla = crear_tabla(len(tabla)*2) for dato in tabla: if dato is not None: agregar_tc(nueva_tabla, bernstein_star_wars, dato) print('Nueva tabla con', len(nueva_tabla), 'posiciones') barrido_tc(nueva_tabla) porc_nueva_tabla = (cantidad_tc(nueva_tabla)*100)/len(nueva_tabla) print('Porcentaje usado de la nueva tabla', porc_nueva_tabla) else: print('El porcentaje de la tabla es menor a 75%')
def guia_telefono(): tabla = crear_tabla(20) guiatel = Guia_Tel(randint(400000, 499999), 'Juan Fernando', 'Quintero', 'Bogota 543') agregar_ta(tabla, hash_division_guiatel, guiatel, 'numero') guiatel = Guia_Tel(randint(400000, 499999), 'Marcelo', 'Gallardo', 'Figueroa Alcorta 57') agregar_ta(tabla, hash_division_guiatel, guiatel, 'numero') guiatel = Guia_Tel(randint(400000, 499999), 'Gonzalo', 'Martínez', 'Madrid 912') agregar_ta(tabla, hash_division_guiatel, guiatel, 'numero') guiatel = Guia_Tel(randint(400000, 499999), 'Rodolfo', 'D´Onofrio', 'Dubai 2142') agregar_ta(tabla, hash_division_guiatel, guiatel, 'numero') print('NUMERO DE TELEFONO | NOMBRE | APELLIDO | DIRECCION') barrido_ta(tabla)
def administrar_contactos(): tabla = crear_tabla(30) crear_contacto = Contacto('Victoria', 'Gimenez', '*****@*****.**') agregar_tc(tabla, hash_division_contacto, crear_contacto) crear_contacto = Contacto('Sofia', 'Hidalgo', '*****@*****.**') agregar_tc(tabla, hash_division_contacto, crear_contacto) crear_contacto = Contacto('Rocio', 'Suarez', '*****@*****.**') agregar_tc(tabla, hash_division_contacto, crear_contacto) crear_contacto = Contacto('Carlos', 'Vives', '*****@*****.**') agregar_tc(tabla, hash_division_contacto, crear_contacto) print('NOMBRE | APELLIDO | CORREO ELECTRÓNICO') barrido_tc(tabla)
def imperio_galactico(): tabla_legion = crear_tabla(10) tabla_codigos = crear_tabla(1000) legiones = ['FL', 'TF', 'TK', 'CT', 'FN', 'FO'] # a for i in range(2000): legion = choice(legiones) codigo = randint(1000, 9999) trooper = Stormtroopers(legion, codigo) agregar_ta(tabla_legion, bernstein_troopers, trooper, 'legion') agregar_ta(tabla_codigos, hash_division_troopers, trooper, 'codigo') # b print('Troopers ordenados por legion') barrido_ta(tabla_legion) print() print('Troopers ordenados por código') barrido_ta(tabla_codigos) print() # c posc = hash_division(537, tabla_codigos) if tabla_codigos[posc]: print('Trooper designados para una misión de exploración') barrido_lista(tabla_codigos[posc]) print() posc = hash_division(781, tabla_codigos) if tabla_codigos[posc]: print('Trooper designados para una misión de asalto') barrido_lista(tabla_codigos[posc]) print() # d posl = bernstein('FN', tabla_legion) if tabla_legion[posl]: print('Troopers de la Legión FN') barrido_lista(tabla_legion[posl]) print() posl = bernstein('CT', tabla_legion) if tabla_legion[posl]: print('Troopers de la Legión CT') barrido_lista(tabla_legion[posl])
def contactos_personas(): tabla = crear_tabla(20) datos = Contacto('Gordon', 'Freeman', '*****@*****.**') agregar_tc(tabla, bernstein_contactos, datos) datos = Contacto('Barney', 'Calhoun', '*****@*****.**') agregar_tc(tabla, bernstein_contactos, datos) datos = Contacto('Alyx', 'Vance', '*****@*****.**') agregar_tc(tabla, bernstein_contactos, datos) datos = Contacto('Eli', 'Vance', '*****@*****.**') agregar_tc(tabla, bernstein_contactos, datos) datos = Contacto('Isaac', 'Kleiner', '*****@*****.**') agregar_tc(tabla, bernstein_contactos, datos) print('NOMBRE | APELLIDO | CORREO ELECTRÓNICO') barrido_tc(tabla)
def tabla_pokemon(): tabla = crear_tabla(50) nombres = ['Bulbasaur', 'Charmander', 'Squirtle', 'Pikachu', 'Spearow', 'Dugtrio', 'Primeape', 'Terrakion', 'Tyrantrum', 'Golbat'] tipos = ['Planta', 'Fuego', 'Agua', 'Eléctrico', 'Volador', 'Tierra', 'Lucha', 'Roca', 'Dragón', 'Veneno'] pos = 0 for i in range(len(nombres)): nom = nombres[pos] tip = tipos[pos] pokemon = Pokemon(randint(1, 999), nom, tip, randint(1, 50)) agregar_tc(tabla, bernstein_pokemones, pokemon) pos += 1 print('NUMERO | NOMBRE | TIPO | NIVEL') barrido_tc(tabla)
def guia_telefono(): tabla = crear_tabla(20) guiatel = Guia_Tel(randint(400000, 499999), 'Genaro', 'Arijon', 'Parana 234') agregar_ta(tabla, hash_division_guiatel, guiatel, 'numero') guiatel = Guia_Tel(randint(400000, 499999), 'Federico', 'Gonzalez', 'Rpublica de Libano') agregar_ta(tabla, hash_division_guiatel, guiatel, 'numero') guiatel = Guia_Tel(randint(400000, 499999), 'Nahuel', 'Mani', 'Barrio 150') agregar_ta(tabla, hash_division_guiatel, guiatel, 'numero') guiatel = Guia_Tel(randint(400000, 499999), 'Pedro', 'Fister', '9 de julio 42') agregar_ta(tabla, hash_division_guiatel, guiatel, 'numero') print('NUMERO DE TELEFONO | NOMBRE | APELLIDO | DIRECCION') barrido_ta(tabla)
def sw(): tabla = crear_tabla(20) personajes = [ 'Darth Vader', 'Luke Skywalker', 'Chewbacca', 'Yoda', 'R2D2', 'Obi-Wan Keobi', 'Han Solo', 'C3PO', 'Rey', 'Finn', 'Leia Organa', 'Jabba el Hutt', 'Jawa', 'Darth Maul', 'Bobba Fett', 'Jar Jar Binks', 'Darth Sidious', 'Kylo Ren', 'Obi-Wan Kenobi', 'Greddo' ] pos = 0 for i in range(0, len(personajes)): nombre = personajes[pos] dato = Personaje(nombre) agregar_tc(tabla, bernstein_star_wars, dato) pos += 1 print('Tabla de personajes de Star Wars tiene ', len(tabla), ' posiciones') barrido_tc(tabla) porcentaje = (cantidad_tc(tabla) * 100) / len( tabla) # porcentaje de personajes ingresados en la tabla print('El porcentaje usado de la tabla es de: ', porcentaje) print() if porcentaje > 75: print('La carga ha superado el 75%. REHASHING:') tabla_duplicada = crear_tabla(len(tabla) * 2) for dato in tabla: if dato is not None: agregar_tc(tabla_duplicada, bernstein_star_wars, dato) print('La nueva tabla tine :', len(tabla_duplicada), 'posiciones') barrido_tc(tabla_duplicada) porcentaje_tabla_duplicada = (cantidad_tc(tabla_duplicada) * 100) / len(tabla_duplicada) print('Porcentaje usado en la tabla duplicada ', porcentaje_tabla_duplicada)
def catedras_universidad(): tabla = crear_tabla(25) modalidad = ['Anual', 'Cuatrimestral'] profe = ['Ing. Rodríguez', 'Prof. Gómez', 'Lic. García', 'Dr. Nuñez'] catedra = Catedras(randint(1, 1000), 'Algorimtos y Estr. de Datos', choice(modalidad), randint(4, 8), choice(profe)) agregar_tc(tabla, hash_division_catedra, catedra) catedra = Catedras(randint(1, 1000), 'Base de Datos', choice(modalidad), randint(4, 8), choice(profe)) agregar_tc(tabla, hash_division_catedra, catedra) catedra = Catedras(randint(1, 1000), 'Prog. Orientada a Objetos', choice(modalidad), randint(4, 8), choice(profe)) agregar_tc(tabla, hash_division_catedra, catedra) catedra = Catedras(randint(1, 1000), 'Diseño UX/UI', choice(modalidad), randint(4, 8), choice(profe)) agregar_tc(tabla, hash_division_catedra, catedra) catedra = Catedras(randint(1, 1000), 'Analisis Matemático', choice(modalidad), randint(4, 8), choice(profe)) agregar_tc(tabla, hash_division_catedra, catedra) print('CODIGO | CATEDRA | MODALIDAD | CANT. HORAS | DOCENTE') barrido_tc(tabla)
def carrera_u(): tabla = crear_tabla(50) cargar_catedra = Catedra('Matematica Disccreta', 'Anual', '120 horas', 'Marisa Romero', 100) agregar_tc(tabla, hash_division_catedra, cargar_catedra) cargar_catedra = Catedra('Calcuo', 'Anuela', ' 130 horas', 'Silvina y Susana', 108) agregar_tc(tabla, hash_division_catedra, cargar_catedra) cargar_catedra = Catedra('Algebra', 'Anual', '145 horas', 'Eugenia y Jesica', 109) agregar_tc(tabla, hash_division_catedra, cargar_catedra) cargar_catedra = Catedra('Ecuaciones diferenciales y calculo', 'Cuatrimestral :C', '50', 'Julio, Silvina', 106) agregar_tc(tabla, hash_division_catedra, cargar_catedra) print( ' Nombre de la catedra - Modalidad - Horas - Docente - Codigo ' ) barrido_tc(tabla)
def tabla_pokemon(): tabla = crear_tabla(1000) nombres = [ 'Groudon', 'Mew', 'Dialga', 'Palkia', 'Giratina', 'Darkrai', 'Kyogre', 'Xerneas', ' Manaphy', 'Phione', 'El trio del lago', 'Kyogre Primigenio', 'Kyurem', 'Reshiram', 'Zekrom' ] tipo = [ 'Tierra', 'Psiquico', 'Acero/Dragón', 'Agua/Dragon', 'Fantasma/Dragon', 'Siniestro', 'Agua', 'Hada', 'Agua', 'Agua', 'Psiquico', 'Agua', 'Dragón/Hielo', 'Dragón/Fuego', 'Dragón/Eléctrico' ] posicion = 0 for i in range(len(nombres)): nom = nombres[posicion] tip = tipo[posicion] pokemon = Pokemon(randint(1, 500), nom, tip, randint(1, 60)) agregar_tc(tabla, bernstein_pokemones, pokemon) posicion += 1 print('Numero | Nombre | Tipo | Nivel') barrido_tc(tabla)
def diccionario(): tabla = crear_tabla(26) # a palabra = Palabra('Hola', 'Es un saludo') agregar_ta(tabla, hash_diccionario, palabra, 'palabra') palabra = Palabra('Hielo', 'Agua congelada') agregar_ta(tabla, hash_diccionario, palabra, 'palabra') palabra = Palabra('Arbol', 'Parte de la naturaleza') agregar_ta(tabla, hash_diccionario, palabra, 'palabra') print(tabla) barrido_ta(tabla) print() # b pos = buscar_ta(tabla, hash_diccionario, Palabra('Hola', ''), 'palabra') if(pos is not None): print('Palabra', pos.info.palabra, 'significado', pos.info.significado) print() # c print('Elemento eliminado:', quitar_ta(tabla, hash_diccionario, Palabra('Hielo', ''), 'palabra')) barrido_ta(tabla)
'''1. Desarrollar un algoritmo que permita implementar una tabla hash para representar un diccionario que permita resolver las siguientes actividades:''' # EJ 1 class Palabra(): def __init__(self, palabra, significado): self.palabra = palabra self.significado = significado def __str__(self): return self.palabra + ', ' + self.significado #a. agregar una palabra y su significado al diccionario tabla = crear_tabla(28) def diccionario(tabla): palabra = Palabra('danzar', 'Bailar al ritmo de una música') agregar_ta(tabla, hash_diccionario, palabra, 'palabra') palabra = Palabra('ballena', 'Animal mamífero marino') agregar_ta(tabla, hash_diccionario, palabra, 'palabra') palabra = Palabra('madriguera', 'Cueva donde viven y se esconden algunos animales') agregar_ta(tabla, hash_diccionario, palabra, 'palabra') palabra = Palabra('felicidad', 'Sentimiento de alegría o satisfacción') agregar_ta(tabla, hash_diccionario, palabra, 'palabra') barrido_ta(tabla) #b. determinar si una palabra existe y mostrar su significado
def agencia(): pass def hash_cadenas(string): hash = 5381 for caracter in string: hash = ((hash << 5) + hash) + ord(caracter) return hash & 0xFFFFFFFF def calculo_comp(caracter): if ord(caracter) <= 78: return 79 + ord(caracter) - 32 else: return 32 + ord(caracter) - 79 def cod(carac): caracteres = '' car_ascii = ord(carac) car_ascii *= 37 compl = calculo_comp(carac) car_ascii = str(car_ascii) for dig in car_ascii: digito = int(digito) num = pow(digito, 2) + compl carac = chr(int(num)) caracteres += carac caracteres += chr(compl) return caracteres def codifica_segm(segmento): num_4_dig = '' pri_chr = segmento[:4] ult_chr = segmento[4] compl = ord(ult_chr) for elemento in pri_chr: elemento = ord(elemento) - compl elemento = int(sqrt(elemento)) elemento = str(elemento) num_4_dig += elemento num_4_dig = int(num_4_dig) chr_ascii = int(num_4_dig / 37) car = chr(chr_ascii) return car def decod(mensaje): oracion = '' i = 0 while i < len(mensaje): segmento = mensaje[i:i + 5] indice = hash_cadenas(segmento) % len(tabla) if (tabla[indice] is None): car = codifica_segm(segmento) tabla[indice] = car else: car = tabla[indice] oracion += car i += 5 return oracion tabla = crear_tabla(240)
def sms_cifrados(): tabla = crear_tabla(10) tabla_aux = crear_tabla(10) def desifrar_sms(dato): dic = { '#?&': '0', 'abc': '1', 'def': '2', 'ghi': '3', 'jkl': '4', 'mnñ': '5', 'opq': '6', 'rst': '7', 'uvw': '8', 'xyz': '9' } cad = '' for i in range(0, len(dato), 3): cad += dic[dato[i:i + 3]] return chr(int(cad)) def cifrar_sms(dato): val = str(ord(dato)) val_cirado = [ '#?&', 'abc', 'def', 'ghi', 'jkl', 'mnñ', 'opq', 'rst', 'uvw', 'xyz' ] cad = '' for num in valor: num_ent = int(num) cad += val_cirado[num_ent] cad += "%" return cad mensaje = 'El amor y el odio, son dos lados de una misma cuchilla. –Jacqueline Carey.' mensaje_cifrado = '' print('Mensaje a cifrar: ') print(mensaje) print() for letra in mensaje: valor = buscar_ta(tabla, hash_diccionario, Palabra(letra, ''), 'palabra') cifrado = '' if valor is None: cifrado = cifrar_sms(letra) palabra = Palabra(letra, cifrado) agregar_ta(tabla, hash_diccionario, palabra, 'palabra') else: cifrado = valor.info.significado mensaje_cifrado += cifrado print('Mensaje cifrado:') print(mensaje_cifrado) print() lista = mensaje_cifrado.split('%') lista.pop() sms = '' for letras in lista: valor = buscar_ta(tabla_aux, bernstein_palabra, Palabra(letras, ''), 'palabra') decifrado = '' if valor is None: decifrado = desifrar_sms(letras) palabra = Palabra(letras, decifrado) agregar_ta(tabla_aux, bernstein_palabra, palabra, 'palabra') else: decifrado = valor.info.significado sms += decifrado print('El mensaje ha sido decifrado') print(sms)
def agencia_shield(): pass def hash_cadenas(string): hash = 5381 for caracter in string: hash = ((hash << 5) + hash) + ord(caracter) return hash & 0xFFFFFFFF def calculo_complemento(caracter): if ord(caracter) <= 78: return 79 + ord(caracter) - 32 else: return 32 + ord(caracter) - 79 # a def codifica4dig(caracter): caracteres = '' caracter_ascii = ord(caracter) caracter_ascii *= 37 complemento = calculo_complemento(caracter) caracter_ascii = str(caracter_ascii) for digito in caracter_ascii: digito = int(digito) num = pow(digito, 2) + complemento caracter = chr(int(num)) caracteres += caracter caracteres += chr(complemento) return caracteres def codifica_segm(segmento): num_cuatro_digitos = '' pri_chr = segmento[:4] ult_chr = segmento[4] complemento = ord(ult_chr) for elemento in pri_chr: elemento = ord(elemento) - complemento elemento = int(sqrt(elemento)) elemento = str(elemento) num_cuatro_digitos += elemento num_cuatro_digitos = int(num_cuatro_digitos) chr_ascii = int(num_cuatro_digitos/37) caracter = chr(chr_ascii) return caracter def decodificar(mensaje): oracion = '' i = 0 while i < len(mensaje): segmento = mensaje[i:i+5] indice = hash_cadenas(segmento) % len(tabla) if (tabla[indice] is None): caracter = codifica_segm(segmento) tabla[indice] = caracter else: caracter = tabla[indice] oracion += caracter i += 5 return oracion tabla = crear_tabla(240) f = open('/home/iglesiasfacu/Facu Lic. en Sistemas/Algoritmos y Estructuras de Datos/TP6 - Hash/mensaje_1.txt', encoding='utf8') msj_codificado = f.read() f.close() msj_decodificado = decodificar(msj_codificado) print('Mensaje 1:') print(msj_decodificado) print() f = open('/home/iglesiasfacu/Facu Lic. en Sistemas/Algoritmos y Estructuras de Datos/TP6 - Hash/mensaje_2.txt', encoding='utf8') msj_codificado = f.read() f.close() msj_decodificado = decodificar(msj_codificado) print('Mensaje 2') print(msj_decodificado) print() f = open('/home/iglesiasfacu/Facu Lic. en Sistemas/Algoritmos y Estructuras de Datos/TP6 - Hash/mensaje_3.txt', encoding='utf8') msj_codificado = f.read() f.close() msj_decodificado = decodificar(msj_codificado) print('Mensaje 3') print(msj_decodificado)