Skip to content

Instantly share code, notes, and snippets.

@parzibyte
Created December 22, 2021 23:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save parzibyte/971421c51a140147fd7d3d8be7534699 to your computer and use it in GitHub Desktop.
Save parzibyte/971421c51a140147fd7d3d8be7534699 to your computer and use it in GitHub Desktop.
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