Saltar a contenido

6. Secuencias II#

(★☆☆, ★★☆, ★★★) Esta notación indica la dificultad de cada ejercicio, de menor a mayor.

Cadenas#

  1. ★☆☆ Corrija este código defectuoso para que imprima la longitud de un string:

    print(length("Esto es un texto"))
    
  2. ★★☆ Escriba una función que tome una cadena de texto y retorne una nueva cadena formada por la letra inicial, la letra del medio, y la letra final, de la cadena inicial.

    def shorten(s):
        # complete me
    

    En la tabla siguiente se muestran algunos ejemplos de pares entrada/salida para la función:

    msg shorten(msg) ¿Por qué nos interesa este caso?
    "" "" Cadena vacía
    "P" "P" Cadena de largo 1
    "PM" "PM" Cadena de largo 2
    "PMZ" "PMZ" Cadena de largo 3
    "code" "cde" Cadena de largo mayor a 3, par
    "hax0r" "hxr" Cadena de largo mayor a 3, impar
  3. ★☆☆ Una dirección IP (IPv4) es una cuarteto de números entre 0 y 255 (inclusive) separados por “.”, y es la dirección única de cada dispositivo conectado a una red, como la dirección postal de una casa en una ciudad. Escribir una función que dada una dirección IPv4 válida, devuelva una versión modificada de esa dirección IP, a esta versión modificada la llamaremos “IP con colmillos”. Una dirección IP con colmillos reemplaza cada punto “.” de la dirección IP original con “[.]”.

    En la tabla siguiente se muestran algunos ejemplos de pares entrada/salida para la función:

    IPv4 IP con colmillos
    "1.1.1.1" "1[.]1[.]1[.]1"
    "255.100.50.0" "255[.]100[.]50[.]0"
  4. ★★☆ Queremos acortar el largo de un mensaje para que entre en una cantidad fija de caracteres, n. Si el mensaje tiene más de n caracteres, es decir, no entra en n caracteres, entonces eliminaremos el excedente. En caso que el mensaje sea truncado, debe terminar en “…”, incluyendo esos puntos dentro de los n caracteres. En la tabla siguiente se muestran, dados un mensaje y un n, distintos ejemplos con el resultado esperado.

    mensaje n Resultado ¿Por qué nos interesa este caso?
    "" 10 "" Cadena vacía
    "Mensaje" 0 "" n = 0
    "Mensaje" 1 "." n = 1
    "Mensaje" 2 ".." n = 2
    "Mensaje" 3 "..." n = 3
    "Mensaje" 4 "M..." n > 3, supera la cantidad de puntos
    "" 1 "" n es positivo y la cadena vacía
    "" -1 "" n es negativo
    "Este es el mensaje largo" 20 "Este es el mensaj..." Ejemplo
    "Mensaje corto" 20 "Mensaje corto" Ejemplo
    "Mensaje corto" 10 "Mensaje..." Ejemplo
  5. ★☆☆ Escribir una función que reciba una cadena, representando una fecha en formato AAAA-MM-DD, y retorne un True si esa fecha corresponde a Sagitario, el signo del zodiaco. Sagitario es entre el 22 de noviembre y el 21 de diciembre (ambas fechas inclusive).

    En el formato AAAA-MM-DD, AAAA representa el año con 4 dígitos, MM el mes con 2 dígitos, y DD el día con 2 dígitos.

    La siguiente tabla le puede ayudar a validar su función:

    Fecha ¿Es de sagitario?
    1934-11-21 False
    0836-11-22 True
    1815-12-10 True
    2022-12-20 True
    3910-12-21 True
    4096-12-22 False
  6. ★★☆ El cifrado César es un tipo de cifrado de mensajes que se basa en intercambiar unas letras por otras, según un desplazamiento, como se muestra en la figura a continuación:

    Caesar's Cipher

    En este cifrado, se toman todas las letras que se van a utilizar, por ejemplo, de la A a la Z y de la a a la z. Luego, se define una rotación, un número que utilizaremos para desplazar cada letra, por ejemplo, en la figura es 3. De ese modo, la A se convertirá en una D, la B en E, la C en F, la X en A, la Y en B y la Z en C.

    Implemente dos funciones, una para cifrar y una para descifrar un mensaje. Para probar el funcionamiento, considere que decipher(cipher(msg, n), n) devuelve el mensaje original. La siguiente tabla contiene ejemplos de cifrados.

    Mensaje original n Mensaje cifrado
    "PENSAMIENTOCOMPUTACIONAL" 0 "PENSAMIENTOCOMPUTACIONAL"
    "PENSAMIENTOCOMPUTACIONAL" 3 "SHQVDPLHQWRFRPSXWDFLRQDO"
    "PENSAMIENTOCOMPUTACIONAL" 13 "CRAFNZVRAGBPBZCHGNPVBANY"
    "PENSAMIENTOCOMPUTACIONAL" 26 "PENSAMIENTOCOMPUTACIONAL"
    "MENSAJE" 3 "PHQVDMH"
    "PHQVDMH" 3 "SKTYGPK"
    "THEQUICKBROWNFOXJUMPSOVERTHELAZYDOG" 3 "WKHTXLFNEURZQIRAMXPSVRYHUWKHODCBGRJ"
    "WKHTXLFNEURZQIRAMXPSVRYHUWKHODCBGRJ" 3 "ZNKWAOIQHXUCTLUDPASVYUBKXZNKRGFEJUM"

    Cuidado

    Solamente para n = 13 las funciones son equivalentes, es decir, cipher(cipher(msg, 13), 13) da msg.

Listas#

  1. ★☆☆ Programar una función que elimine todas las ocurrencias de un cierto elemento en una lista.

    Por ejemplo, si la lista es [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5] y el elemento es 5, la función debe retornar [3, 1, 4, 1, 9, 2, 6, 3].

  2. ★☆☆ Programar una función que tome una lista y elimine todos los elementos duplicados.

  3. ★★☆ Sin usar la computadora, indique, dado el siguiente código ¿cuál es el contenido final de la lista temp_diarias?

    temp_diarias = [15, 20, 21, 21, 21, 20, 17]
    temp_diarias_copia = temp_diarias.copy()
    temp_diarias_copia[2:4] = [22, 22]
    

    Opciones:

    1. [15, 20, 21, 22, 22, 20, 17]
    2. [15, 20, 21, 21, 21, 20, 17]
    3. [15, 20, 22, 22, 21, 20, 17]
    4. [15, 20, 21, 22, 21, 20, 17]
  4. ★☆☆ Programar una función llamada terminan_en_vocal que tome por argumento una lista de strings, y devuelva otra lista con los strings que terminan en vocal.

    Pueden probar la función con las palabras que surgen de aplicar el método split al preámbulo de la Constitución Nacional.

  5. ★★★ Implementar una función que dadas 2 secuencias recibidas como argumento retorne los índices de cada una de ellas a partir de los cuales se obtiene la subsecuencia en común de mayor longitud, y retorne también la longitud de dicha secuencia. Por ejemplo, las cadenas:

    • "TAGGTTAATGGGCCATTTTCGGCACCCTAGGTAGCTTATT", y
    • "ACCATACTATGGTTTTTCCTAAGCGATTGGCATTTTCTTG"

    tienen un solapamiento máximo de 7 caracteres, como se muestra a continuación:

                     TAGGTTAATGGGCCATTTTCGGCACCCTAGGTAGCTTATT
    ACCATACTATGGTTTTTCCTAAGCGATTGGCATTTTCTTG
                                  ^^^^^^^
    

    Mientras que las cadenas:

    • "TACCAGTCTATGTCATCCAGGGTAGCTGTTTGATTGTCCC", y
    • "CGAACGGAGAAAGTTAGCATTCCCAGTTGTCGGGTCTACG"

    tienen un solapamiento máximo de 5 caracteres:

                        TACCAGTCTATGTCATCCAGGGTAGCTGTTTGATTGTCCC
    CGAACGGAGAAAGTTAGCATTCCCAGTTGTCGGGTCTACG
                          ^^^^^
    

Tuplas#

  1. ★☆☆ ¿Cuál es la principal diferencia entre una lista y una tupla?

  2. ★☆☆ Dada la siguiente lista, escribir una línea de código que reemplace el nombre ‘Juan’ por ‘Pedro’.

    lista_nombres = [ 'Tomas', 'Juan', 'Esteban' ]
    # Escribir la línea de código aquí
    
  3. ★☆☆ Dada la siguiente tupla, escribir una línea de código que reemplace el nombre ‘Juan’ por ‘Pedro’.

    tupla_nombres = ( 'Tomas', 'Juan', 'Esteban' )
    # Escribir la línea de código aquí
    
    • Explique el error que sale al intentar hacerlo.
  4. ★☆☆ Sin usar la computadora, indique, dado el siguiente código ¿qué elementos se imprimen por pantalla?

    alumnos_legajo = (("Nicolas", 110405), ("Javier", 121402), ("Juan", 98407))
    for i in range(1, 2):
        print(alumnos_legajo[i][1])
    
    1. 121402
    2. “Javier”
    3. “Javier”, “Juan”
    4. 121402, 98407
  5. ★☆☆ Escribir una función que reciba una fecha en formato AAAA-MM-DD y retorne un tupla de 3 enteros con la fecha. En el formato AAAA-MM-DD, AAAA representa el año con 4 dígitos, MM el mes con 2 dígitos, y DD el día con 2 dígitos.

  6. ★☆☆ Escribir una función que reciba una lista de tuplas, donde cada tupla contiene un nombre y una fecha (la fecha puede ser una tupla o una cadena en formato AAAA-MM-DD, a elección de quien programa la función). La función debe retornar True si todas las personas son de sagitario. Considere el caso particular en que la lista contenga 8 tuplas, los primeros 6 nombres sean “Gachi”, “Pachi”, “Lorena”, “novio”, “exnovio” y “Andrea”, y sean todos de sagitario, en cuyo caso debe imprimirse un mensaje acorde, además de retornar el correspondiente True.

  7. ★☆☆ Dadas tres listas: tps compuesta por tuplas con 3 floats, parcial que contiene números, y nombres que contiene cadenas, crear una nueva lista que contenga tuplas (nombre, valor), únicamente con los nombres para los que el promedio de tps y parcial da mayor o igual que 4, donde valor es el promedio. Puede asumir que las listas tienen todas igual longitud, que las tuplas de tps tienen todas igual longitud, y que los índices de las listas se encuentran asociados.

    Por ejemplo, dadas:

    • tps que contiene las tuplas (1.2, 2.5, 3), (4, 5.7, 6), y (5, 4.1, 4).
    • parcial que contiene los valores 9, 5.2, y 1.
    • nombres que contiene los valores "Ariel", "Dani", "Cami".

    El resultado debe ser [("Dani", 5.225)].

Mix#

  1. ★★★ El equipo de investigación de la facultad se encuentra trabajando sobre un problema de alineación de secuencias de ADN. Se detectó un nuevo virus que posiblemente tenga impacto en nuestro país y para poder saber como actuar frente a este debemos buscar si existe otro virus similar del cual ya se conozca un tratamiento viable. De encontrarlo, podríamos tener una potencial cura. Gracias a la base de datos mundial de secuenciación de ADN provista por NCBI, descargamos listado de sencuencias que debemos investigar. En pos de paralelizar el trabajo, se nos asigna la tarea de crear una función find_matches con las siguientes carácterísticas:

    • Recibe 3 argumentos: query de tipo string, threshold de tipo float y corpus de tipo iterable.
    • query representa la secuencia de ADN de la que queremos encontrar similares.
    • threshold es el porcentaje de similtud mínimos que queremos para considerar que existe un match.
    • corpus es un iterable que representa la colección de secuencias de ADN en la que queremos encontrar matches.
    • Devuelve una lista con todos los miembros del corpus que tienen un grado de similitud superior a threshold.

    El retorno de dicha función será una lista de tuplas, cada tupla contiene como primer elemento la secuencia encontrada y como segundo elemento el grado de similitud (0% a 100%).

    Dado que el volúmen de información es grande debemos pensar en una solución eficiente.

    Tip

    Subdividir el problema en pequeñas partes. Pensar en cuales serían las subfunciones en que se podría subdividir este problema.

    Tip

    La similitud entre 2 strings puede considerarse la logitud del substring maximal que contengan ambos strings.

    El substring maximal será la sub-cadena de caracteres seguidos más larga que aparezca en ambos strings.

    Por ejemplo:

    string_a = 'hola'
    string_b = 'ola'
    

    el substring maximal es => ‘ola’

    Desde el punto de vista de string_a, la coincidencia sería len(substring) / len(string_a) (3 / 4), o lo que es lo mismo \(0.75\) o \(75%\).

    En cambio si el string con el que buscamos (nuestro query) fuera string_b, la coincidencia sería de un 100%.

  2. ★★★ Escribir un programa que reciba una secuencia de comandos por terminal. Los comandos tienen dos partes, la acción (add o find) y un string. El programa representa una agenda de contactos. Las acciones que nos envían se traducen en:

    • insertar el nuevo nombre en la agenda, y
    • encontrar todos los nombres que comiencen con el string.

    El programa debe tener una función principal, contacts, que reciba una lista de tuplas y retorne una lista donde cada elemento es la cantidad matches que encuentra en cada operación de find.

    Ejemplo

    Si el programa recibe la siguiente secuencia de acciones

    add hola
    add holanda
    add santi
    find ho
    find sa
    add sandra
    find se
    

    debe devolver la siguiente lista:

    [2, 1, 0]
    

    dado que existe 2 nombres con el substring incial “ho” al momento del primer find, hay 1 instancia de nombre con substring inicial “sa” al momento del segundo find y no hay instancias con substring “se” al momento del tercer find.

    Tener en cuenta que la agenda de contactos crecerá en tamaño acorde a pasen los años y debemos seguir dando un resultado en un tiempo razonable.