Menu iconMenu icon
Introducción a los Algoritmos

Capítulo 1: Introducción a los Algoritmos

1.4 Problemas de Práctica

Habiendo cubierto los fundamentos de los algoritmos y el pensamiento computacional, ahora es el momento de poner en práctica estos principios. Los problemas en esta sección han sido diseñados para ayudarte a pensar de manera computacional y aplicar los conceptos de descomposición, reconocimiento de patrones, abstracción y pensamiento algorítmico. No te preocupes si no puedes resolver un problema de inmediato, recuerda que parte del pensamiento computacional es la iteración y el refinamiento de tu enfoque.

Problema 1: Generador de Contraseñas

Descripción del Problema: Escribe un algoritmo para generar una contraseña de longitud n. La contraseña debe generarse aleatoriamente y debe incluir al menos una letra mayúscula, una letra minúscula, un dígito y un carácter especial.

Pista: Considera descomponer el problema en partes: generar una letra mayúscula, generar una letra minúscula, generar un dígito, generar un carácter especial y luego combinar estas partes.

Solución:

Para resolver este problema, podríamos crear cuatro funciones para generar una letra mayúscula aleatoria, una letra minúscula aleatoria, un dígito aleatorio y un carácter especial aleatorio respectivamente. Luego, combinamos estos caracteres generados aleatoriamente y llenamos el resto de la longitud de la contraseña con caracteres aleatorios de todos los grupos.

Así es como podríamos escribirlo en Python:

import random
import string

def generate_password(n):
    # Ensure n is at least 4 so we can include at least one of each character type
    assert(n >= 4), "Password length must be at least 4"

    password = []
    password.append(random.choice(string.ascii_uppercase))
    password.append(random.choice(string.ascii_lowercase))
    password.append(random.choice(string.digits))
    password.append(random.choice(string.punctuation))

    for i in range(n - 4):
        random_choice = random.choice([0, 1, 2, 3])
        if random_choice == 0:
            password.append(random.choice(string.ascii_uppercase))
        elif random_choice == 1:
            password.append(random.choice(string.ascii_lowercase))
        elif random_choice == 2:
            password.append(random.choice(string.digits))
        else:
            password.append(random.choice(string.punctuation))

    random.shuffle(password)

    return ''.join(password)

Problema 2: Eventos del Calendario

Descripción del Problema: Tienes una lista de eventos con sus horarios de inicio y fin (en formato de 24 horas). Escribe un algoritmo para determinar si alguno de los eventos se superpone.

Pista: Busca patrones en cómo se superponen los eventos y piensa en cómo podrías abstraer el problema para hacerlo más manejable.

Solución:

Primero, ordenaremos la lista de eventos según sus horarios de inicio. Luego, iteraremos a través de la lista ordenada y compararemos la hora de fin del evento actual con la hora de inicio del siguiente evento. Si la hora de fin del evento actual es posterior a la hora de inicio del siguiente evento, entonces hay una superposición.

def has_overlap(events):
    # Sort events by start time
    events.sort(key = lambda x: x['start'])

    for i in range(len(events) - 1):
        if events[i]['end'] > events[i + 1]['start']:
            return True

    return False

Problema 3: Construyendo una Pirámide

Descripción del Problema: Dado un número n, escribe un algoritmo para imprimir una pirámide de asteriscos con n niveles. Por ejemplo, si n = 3, la salida debería ser:

  *
 ***
*****

Pista: Descompón el problema en dos partes: generar cada nivel de la pirámide y luego combinar los niveles. Además, intenta reconocer patrones en la cantidad de asteriscos y espacios.

Solución:

Este problema se puede resolver imprimiendo cada nivel de la pirámide uno por uno. En cada nivel, imprimimos algunos espacios, seguidos de algunos asteriscos, y luego nuevamente algunos espacios.

def print_pyramid(n):
    for i in range(n):
        print(' ' * (n - i - 1) + '*' * (2 * i + 1) + ' ' * (n - i - 1))

Problema 4: Compresión de Texto

Descripción del Problema: Escribe un algoritmo para comprimir una cadena dada reemplazando caracteres idénticos consecutivos por el carácter seguido del número de veces que aparece. Por ejemplo, la cadena "aaabbbbcc" debería comprimirse como "a3b4c2".

Pista: Este problema puede abordarse utilizando el pensamiento algorítmico: idear un proceso paso a paso para recorrer la cadena y llevar un registro del conteo de cada caracter.

Solución:

Podemos resolver este problema iterando sobre la cadena y llevando un seguimiento del caracter actual y su conteo. Si el caracter actual es diferente al anterior, agregamos el caracter anterior y su conteo a la cadena comprimida y reiniciamos el conteo.

def compress_text(text):
    compressed = ''
    count = 1

    for i in range(1, len(text)):
        if text[i] == text[i - 1]:
            count += 1
        else:
            compressed += text[i - 1] + str(count)
            count = 1

    # Add the last character and its count
    compressed += text[-1] + str(count)

    return compressed

Recuerda, estos problemas no se tratan solo de encontrar la respuesta correcta, sino de comprender y aplicar el pensamiento computacional. Una vez que hayas intentado resolver un problema, trata de reflexionar sobre cómo usaste la descomposición, el reconocimiento de patrones, la abstracción y el pensamiento algorítmico. Si encuentras una solución, considera cómo podrías refinarla para hacerla más eficiente o más elegante.

1.4 Problemas de Práctica

Habiendo cubierto los fundamentos de los algoritmos y el pensamiento computacional, ahora es el momento de poner en práctica estos principios. Los problemas en esta sección han sido diseñados para ayudarte a pensar de manera computacional y aplicar los conceptos de descomposición, reconocimiento de patrones, abstracción y pensamiento algorítmico. No te preocupes si no puedes resolver un problema de inmediato, recuerda que parte del pensamiento computacional es la iteración y el refinamiento de tu enfoque.

Problema 1: Generador de Contraseñas

Descripción del Problema: Escribe un algoritmo para generar una contraseña de longitud n. La contraseña debe generarse aleatoriamente y debe incluir al menos una letra mayúscula, una letra minúscula, un dígito y un carácter especial.

Pista: Considera descomponer el problema en partes: generar una letra mayúscula, generar una letra minúscula, generar un dígito, generar un carácter especial y luego combinar estas partes.

Solución:

Para resolver este problema, podríamos crear cuatro funciones para generar una letra mayúscula aleatoria, una letra minúscula aleatoria, un dígito aleatorio y un carácter especial aleatorio respectivamente. Luego, combinamos estos caracteres generados aleatoriamente y llenamos el resto de la longitud de la contraseña con caracteres aleatorios de todos los grupos.

Así es como podríamos escribirlo en Python:

import random
import string

def generate_password(n):
    # Ensure n is at least 4 so we can include at least one of each character type
    assert(n >= 4), "Password length must be at least 4"

    password = []
    password.append(random.choice(string.ascii_uppercase))
    password.append(random.choice(string.ascii_lowercase))
    password.append(random.choice(string.digits))
    password.append(random.choice(string.punctuation))

    for i in range(n - 4):
        random_choice = random.choice([0, 1, 2, 3])
        if random_choice == 0:
            password.append(random.choice(string.ascii_uppercase))
        elif random_choice == 1:
            password.append(random.choice(string.ascii_lowercase))
        elif random_choice == 2:
            password.append(random.choice(string.digits))
        else:
            password.append(random.choice(string.punctuation))

    random.shuffle(password)

    return ''.join(password)

Problema 2: Eventos del Calendario

Descripción del Problema: Tienes una lista de eventos con sus horarios de inicio y fin (en formato de 24 horas). Escribe un algoritmo para determinar si alguno de los eventos se superpone.

Pista: Busca patrones en cómo se superponen los eventos y piensa en cómo podrías abstraer el problema para hacerlo más manejable.

Solución:

Primero, ordenaremos la lista de eventos según sus horarios de inicio. Luego, iteraremos a través de la lista ordenada y compararemos la hora de fin del evento actual con la hora de inicio del siguiente evento. Si la hora de fin del evento actual es posterior a la hora de inicio del siguiente evento, entonces hay una superposición.

def has_overlap(events):
    # Sort events by start time
    events.sort(key = lambda x: x['start'])

    for i in range(len(events) - 1):
        if events[i]['end'] > events[i + 1]['start']:
            return True

    return False

Problema 3: Construyendo una Pirámide

Descripción del Problema: Dado un número n, escribe un algoritmo para imprimir una pirámide de asteriscos con n niveles. Por ejemplo, si n = 3, la salida debería ser:

  *
 ***
*****

Pista: Descompón el problema en dos partes: generar cada nivel de la pirámide y luego combinar los niveles. Además, intenta reconocer patrones en la cantidad de asteriscos y espacios.

Solución:

Este problema se puede resolver imprimiendo cada nivel de la pirámide uno por uno. En cada nivel, imprimimos algunos espacios, seguidos de algunos asteriscos, y luego nuevamente algunos espacios.

def print_pyramid(n):
    for i in range(n):
        print(' ' * (n - i - 1) + '*' * (2 * i + 1) + ' ' * (n - i - 1))

Problema 4: Compresión de Texto

Descripción del Problema: Escribe un algoritmo para comprimir una cadena dada reemplazando caracteres idénticos consecutivos por el carácter seguido del número de veces que aparece. Por ejemplo, la cadena "aaabbbbcc" debería comprimirse como "a3b4c2".

Pista: Este problema puede abordarse utilizando el pensamiento algorítmico: idear un proceso paso a paso para recorrer la cadena y llevar un registro del conteo de cada caracter.

Solución:

Podemos resolver este problema iterando sobre la cadena y llevando un seguimiento del caracter actual y su conteo. Si el caracter actual es diferente al anterior, agregamos el caracter anterior y su conteo a la cadena comprimida y reiniciamos el conteo.

def compress_text(text):
    compressed = ''
    count = 1

    for i in range(1, len(text)):
        if text[i] == text[i - 1]:
            count += 1
        else:
            compressed += text[i - 1] + str(count)
            count = 1

    # Add the last character and its count
    compressed += text[-1] + str(count)

    return compressed

Recuerda, estos problemas no se tratan solo de encontrar la respuesta correcta, sino de comprender y aplicar el pensamiento computacional. Una vez que hayas intentado resolver un problema, trata de reflexionar sobre cómo usaste la descomposición, el reconocimiento de patrones, la abstracción y el pensamiento algorítmico. Si encuentras una solución, considera cómo podrías refinarla para hacerla más eficiente o más elegante.

1.4 Problemas de Práctica

Habiendo cubierto los fundamentos de los algoritmos y el pensamiento computacional, ahora es el momento de poner en práctica estos principios. Los problemas en esta sección han sido diseñados para ayudarte a pensar de manera computacional y aplicar los conceptos de descomposición, reconocimiento de patrones, abstracción y pensamiento algorítmico. No te preocupes si no puedes resolver un problema de inmediato, recuerda que parte del pensamiento computacional es la iteración y el refinamiento de tu enfoque.

Problema 1: Generador de Contraseñas

Descripción del Problema: Escribe un algoritmo para generar una contraseña de longitud n. La contraseña debe generarse aleatoriamente y debe incluir al menos una letra mayúscula, una letra minúscula, un dígito y un carácter especial.

Pista: Considera descomponer el problema en partes: generar una letra mayúscula, generar una letra minúscula, generar un dígito, generar un carácter especial y luego combinar estas partes.

Solución:

Para resolver este problema, podríamos crear cuatro funciones para generar una letra mayúscula aleatoria, una letra minúscula aleatoria, un dígito aleatorio y un carácter especial aleatorio respectivamente. Luego, combinamos estos caracteres generados aleatoriamente y llenamos el resto de la longitud de la contraseña con caracteres aleatorios de todos los grupos.

Así es como podríamos escribirlo en Python:

import random
import string

def generate_password(n):
    # Ensure n is at least 4 so we can include at least one of each character type
    assert(n >= 4), "Password length must be at least 4"

    password = []
    password.append(random.choice(string.ascii_uppercase))
    password.append(random.choice(string.ascii_lowercase))
    password.append(random.choice(string.digits))
    password.append(random.choice(string.punctuation))

    for i in range(n - 4):
        random_choice = random.choice([0, 1, 2, 3])
        if random_choice == 0:
            password.append(random.choice(string.ascii_uppercase))
        elif random_choice == 1:
            password.append(random.choice(string.ascii_lowercase))
        elif random_choice == 2:
            password.append(random.choice(string.digits))
        else:
            password.append(random.choice(string.punctuation))

    random.shuffle(password)

    return ''.join(password)

Problema 2: Eventos del Calendario

Descripción del Problema: Tienes una lista de eventos con sus horarios de inicio y fin (en formato de 24 horas). Escribe un algoritmo para determinar si alguno de los eventos se superpone.

Pista: Busca patrones en cómo se superponen los eventos y piensa en cómo podrías abstraer el problema para hacerlo más manejable.

Solución:

Primero, ordenaremos la lista de eventos según sus horarios de inicio. Luego, iteraremos a través de la lista ordenada y compararemos la hora de fin del evento actual con la hora de inicio del siguiente evento. Si la hora de fin del evento actual es posterior a la hora de inicio del siguiente evento, entonces hay una superposición.

def has_overlap(events):
    # Sort events by start time
    events.sort(key = lambda x: x['start'])

    for i in range(len(events) - 1):
        if events[i]['end'] > events[i + 1]['start']:
            return True

    return False

Problema 3: Construyendo una Pirámide

Descripción del Problema: Dado un número n, escribe un algoritmo para imprimir una pirámide de asteriscos con n niveles. Por ejemplo, si n = 3, la salida debería ser:

  *
 ***
*****

Pista: Descompón el problema en dos partes: generar cada nivel de la pirámide y luego combinar los niveles. Además, intenta reconocer patrones en la cantidad de asteriscos y espacios.

Solución:

Este problema se puede resolver imprimiendo cada nivel de la pirámide uno por uno. En cada nivel, imprimimos algunos espacios, seguidos de algunos asteriscos, y luego nuevamente algunos espacios.

def print_pyramid(n):
    for i in range(n):
        print(' ' * (n - i - 1) + '*' * (2 * i + 1) + ' ' * (n - i - 1))

Problema 4: Compresión de Texto

Descripción del Problema: Escribe un algoritmo para comprimir una cadena dada reemplazando caracteres idénticos consecutivos por el carácter seguido del número de veces que aparece. Por ejemplo, la cadena "aaabbbbcc" debería comprimirse como "a3b4c2".

Pista: Este problema puede abordarse utilizando el pensamiento algorítmico: idear un proceso paso a paso para recorrer la cadena y llevar un registro del conteo de cada caracter.

Solución:

Podemos resolver este problema iterando sobre la cadena y llevando un seguimiento del caracter actual y su conteo. Si el caracter actual es diferente al anterior, agregamos el caracter anterior y su conteo a la cadena comprimida y reiniciamos el conteo.

def compress_text(text):
    compressed = ''
    count = 1

    for i in range(1, len(text)):
        if text[i] == text[i - 1]:
            count += 1
        else:
            compressed += text[i - 1] + str(count)
            count = 1

    # Add the last character and its count
    compressed += text[-1] + str(count)

    return compressed

Recuerda, estos problemas no se tratan solo de encontrar la respuesta correcta, sino de comprender y aplicar el pensamiento computacional. Una vez que hayas intentado resolver un problema, trata de reflexionar sobre cómo usaste la descomposición, el reconocimiento de patrones, la abstracción y el pensamiento algorítmico. Si encuentras una solución, considera cómo podrías refinarla para hacerla más eficiente o más elegante.

1.4 Problemas de Práctica

Habiendo cubierto los fundamentos de los algoritmos y el pensamiento computacional, ahora es el momento de poner en práctica estos principios. Los problemas en esta sección han sido diseñados para ayudarte a pensar de manera computacional y aplicar los conceptos de descomposición, reconocimiento de patrones, abstracción y pensamiento algorítmico. No te preocupes si no puedes resolver un problema de inmediato, recuerda que parte del pensamiento computacional es la iteración y el refinamiento de tu enfoque.

Problema 1: Generador de Contraseñas

Descripción del Problema: Escribe un algoritmo para generar una contraseña de longitud n. La contraseña debe generarse aleatoriamente y debe incluir al menos una letra mayúscula, una letra minúscula, un dígito y un carácter especial.

Pista: Considera descomponer el problema en partes: generar una letra mayúscula, generar una letra minúscula, generar un dígito, generar un carácter especial y luego combinar estas partes.

Solución:

Para resolver este problema, podríamos crear cuatro funciones para generar una letra mayúscula aleatoria, una letra minúscula aleatoria, un dígito aleatorio y un carácter especial aleatorio respectivamente. Luego, combinamos estos caracteres generados aleatoriamente y llenamos el resto de la longitud de la contraseña con caracteres aleatorios de todos los grupos.

Así es como podríamos escribirlo en Python:

import random
import string

def generate_password(n):
    # Ensure n is at least 4 so we can include at least one of each character type
    assert(n >= 4), "Password length must be at least 4"

    password = []
    password.append(random.choice(string.ascii_uppercase))
    password.append(random.choice(string.ascii_lowercase))
    password.append(random.choice(string.digits))
    password.append(random.choice(string.punctuation))

    for i in range(n - 4):
        random_choice = random.choice([0, 1, 2, 3])
        if random_choice == 0:
            password.append(random.choice(string.ascii_uppercase))
        elif random_choice == 1:
            password.append(random.choice(string.ascii_lowercase))
        elif random_choice == 2:
            password.append(random.choice(string.digits))
        else:
            password.append(random.choice(string.punctuation))

    random.shuffle(password)

    return ''.join(password)

Problema 2: Eventos del Calendario

Descripción del Problema: Tienes una lista de eventos con sus horarios de inicio y fin (en formato de 24 horas). Escribe un algoritmo para determinar si alguno de los eventos se superpone.

Pista: Busca patrones en cómo se superponen los eventos y piensa en cómo podrías abstraer el problema para hacerlo más manejable.

Solución:

Primero, ordenaremos la lista de eventos según sus horarios de inicio. Luego, iteraremos a través de la lista ordenada y compararemos la hora de fin del evento actual con la hora de inicio del siguiente evento. Si la hora de fin del evento actual es posterior a la hora de inicio del siguiente evento, entonces hay una superposición.

def has_overlap(events):
    # Sort events by start time
    events.sort(key = lambda x: x['start'])

    for i in range(len(events) - 1):
        if events[i]['end'] > events[i + 1]['start']:
            return True

    return False

Problema 3: Construyendo una Pirámide

Descripción del Problema: Dado un número n, escribe un algoritmo para imprimir una pirámide de asteriscos con n niveles. Por ejemplo, si n = 3, la salida debería ser:

  *
 ***
*****

Pista: Descompón el problema en dos partes: generar cada nivel de la pirámide y luego combinar los niveles. Además, intenta reconocer patrones en la cantidad de asteriscos y espacios.

Solución:

Este problema se puede resolver imprimiendo cada nivel de la pirámide uno por uno. En cada nivel, imprimimos algunos espacios, seguidos de algunos asteriscos, y luego nuevamente algunos espacios.

def print_pyramid(n):
    for i in range(n):
        print(' ' * (n - i - 1) + '*' * (2 * i + 1) + ' ' * (n - i - 1))

Problema 4: Compresión de Texto

Descripción del Problema: Escribe un algoritmo para comprimir una cadena dada reemplazando caracteres idénticos consecutivos por el carácter seguido del número de veces que aparece. Por ejemplo, la cadena "aaabbbbcc" debería comprimirse como "a3b4c2".

Pista: Este problema puede abordarse utilizando el pensamiento algorítmico: idear un proceso paso a paso para recorrer la cadena y llevar un registro del conteo de cada caracter.

Solución:

Podemos resolver este problema iterando sobre la cadena y llevando un seguimiento del caracter actual y su conteo. Si el caracter actual es diferente al anterior, agregamos el caracter anterior y su conteo a la cadena comprimida y reiniciamos el conteo.

def compress_text(text):
    compressed = ''
    count = 1

    for i in range(1, len(text)):
        if text[i] == text[i - 1]:
            count += 1
        else:
            compressed += text[i - 1] + str(count)
            count = 1

    # Add the last character and its count
    compressed += text[-1] + str(count)

    return compressed

Recuerda, estos problemas no se tratan solo de encontrar la respuesta correcta, sino de comprender y aplicar el pensamiento computacional. Una vez que hayas intentado resolver un problema, trata de reflexionar sobre cómo usaste la descomposición, el reconocimiento de patrones, la abstracción y el pensamiento algorítmico. Si encuentras una solución, considera cómo podrías refinarla para hacerla más eficiente o más elegante.