-
-
Save parzibyte/971421c51a140147fd7d3d8be7534699 to your computer and use it in GitHub Desktop.
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 sys | |
sys.setrecursionlimit(20000) | |
# FUNCIONES RECURSIVAS EMPIEZAN AQUÍ | |
def merge(left, right): | |
merged_list = [] | |
indice_de_izquierda = 0 | |
indice_de_derecha = 0 | |
indice_arreglo_ordenado = 0 | |
while indice_de_izquierda < len(left) and indice_de_derecha < len(right): | |
valor_izquierda = left[indice_de_izquierda] | |
valor_derecha = right[indice_de_derecha] | |
# Accedemos a 0 porque en 0 está el nombre (en 1 está el ID) | |
if valor_izquierda[0] <= valor_derecha[0]: | |
# El de la izquierda es menor, entonces lo ponemos primero | |
merged_list.append(valor_izquierda) | |
# Y aumentamos en 1 el valor de la izquierda | |
indice_de_izquierda += 1 | |
else: | |
merged_list.append(valor_derecha) | |
indice_de_derecha += 1 | |
# Sin importar lo que hayamos movido, aumentamos el índice del actual | |
indice_arreglo_ordenado += 1 | |
# Hasta aquí puede que el índice izquierdo o derecho hayan llegado a su fin, pero no ambos. Entonces | |
# nos aseguramos de recorrerlos a ambos hasta el final | |
while indice_de_izquierda < len(left): | |
merged_list.append(left[indice_de_izquierda]) | |
indice_de_izquierda += 1 | |
while indice_de_derecha < len(right): | |
merged_list.append(right[indice_de_derecha]) | |
indice_de_derecha += 1 | |
return merged_list | |
def merge_sort(lista): | |
longitud = len(lista) | |
mitad = longitud//2 # El doble / es para dividir y redondear hacia abajo | |
# Condición de salida de recursividad es que el arreglo mida 1 o 0 | |
if longitud <= 1: | |
return lista | |
left = merge_sort(lista[:mitad]) | |
right = merge_sort(lista[mitad:]) | |
return merge(left, right) | |
# FUNCIONES RECURSIVAS TERMINAN AQUÍ | |
class Solution: | |
# NO MODIFICAR ABAJO DE EST LINEA, ES PARTE DEL AUTOGRADER | |
def sort(self, data=[]): | |
return "clear" | |
def sorted(self, data=[]): | |
return "clear" | |
# NO MODIFICAR ARRIBA DE EST LINEA, ES PARTE DEL AUTOGRADER | |
def crear_diccionarios(self, ruta="pokemon.csv"): | |
pokemones = {} | |
with open(ruta) as archivo: | |
next(archivo) # Descartar la primera línea | |
for linea in archivo: | |
linea_como_arreglo = linea.rstrip().split(";") | |
name = linea_como_arreglo[0] | |
id = linea_como_arreglo[1] | |
sp_attack = linea_como_arreglo[2] | |
sp_defense = linea_como_arreglo[3] | |
speed = linea_como_arreglo[4] | |
ability = linea_como_arreglo[5] | |
pokemones[int(id)] = { | |
"nombre": name, | |
"puntos_ataque": int(sp_attack), | |
"puntos_defensa": int(sp_defense), | |
"puntos_velocidad": int(speed), | |
"habilidad": ability, | |
} | |
return pokemones | |
def buscar_dato(self, pokemones, id, valor): | |
for id_pokemon in pokemones: | |
if id_pokemon == id: | |
pokemon = pokemones.get(id_pokemon) | |
return pokemon[valor] | |
return "Pokémon no encontrado" | |
def pokemon_rapido(self, pokemones): | |
nombre = "" | |
puntaje = -1 # iniciar valores en algo muy bajo | |
for id_pokemon in pokemones: | |
pokemon = pokemones.get(id_pokemon) | |
if pokemon["puntos_velocidad"] >= puntaje: | |
puntaje = pokemon["puntos_velocidad"] | |
nombre = pokemon["nombre"] | |
return nombre, puntaje | |
def nombre_ascendente(self, pokemones): | |
result = [] | |
for id_pokemon in pokemones: | |
result.append((pokemones.get(id_pokemon)["nombre"], id_pokemon)) | |
result = merge_sort(result) | |
return result | |
def busqueda_habilidad(self, nombre_a_buscar, nombres_ordenados, pokemones): | |
result = {} | |
izquierda, derecha = 0, len(nombres_ordenados) - 1 | |
while izquierda <= derecha: | |
indiceDelElementoDelMedio = (izquierda + derecha) // 2 | |
elementoDelMedio = nombres_ordenados[indiceDelElementoDelMedio] | |
# Accedemos a 0 porque queremos el primer valor de la tupla, mismo que es el nombre | |
if elementoDelMedio[0] == nombre_a_buscar: | |
# Aquí hemos encontrado al Pokémon. Usamos su índice para acceder al diccionario | |
id = elementoDelMedio[1] | |
return {id: pokemones[id]} | |
if nombre_a_buscar < elementoDelMedio[0]: | |
derecha = indiceDelElementoDelMedio - 1 | |
else: | |
izquierda = indiceDelElementoDelMedio + 1 | |
return {-1: "No encontrado"} | |
s = Solution() | |
pokemones = s.crear_diccionarios() | |
print(s.buscar_dato(pokemones, 8, "habilidad")) | |
print(s.buscar_dato(pokemones, 88888, "puntos_velocidad")) | |
print(s.buscar_dato(pokemones, 3, "puntos_ataque")) | |
print(s.pokemon_rapido(pokemones)) | |
print(s.nombre_ascendente(pokemones)) | |
print(s.busqueda_habilidad("Squirtle5", s.nombre_ascendente(pokemones), pokemones)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment