6. Secuencias II#
(★☆☆, ★★☆, ★★★) Esta notación indica la dificultad de cada ejercicio, de menor a mayor.
Cadenas#
-
★☆☆ Corrija este código defectuoso para que imprima la longitud de un string:
-
★★☆ 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.
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 -
★☆☆ 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"
-
★★☆ 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 -
★☆☆ Escribir una función que reciba una cadena, representando una fecha en formato
AAAA-MM-DD
, y retorne unTrue
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, yDD
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 -
★★☆ 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:
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)
damsg
.
Listas#
-
★☆☆ 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 es5
, la función debe retornar[3, 1, 4, 1, 9, 2, 6, 3]
. -
★☆☆ Programar una función que tome una lista y elimine todos los elementos duplicados.
-
★★☆ 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:
[15, 20, 21, 22, 22, 20, 17]
[15, 20, 21, 21, 21, 20, 17]
[15, 20, 22, 22, 21, 20, 17]
[15, 20, 21, 22, 21, 20, 17]
-
★☆☆ 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.
-
★★★ 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:
Mientras que las cadenas:
"TACCAGTCTATGTCATCCAGGGTAGCTGTTTGATTGTCCC"
, y"CGAACGGAGAAAGTTAGCATTCCCAGTTGTCGGGTCTACG"
tienen un solapamiento máximo de 5 caracteres:
Tuplas#
-
★☆☆ ¿Cuál es la principal diferencia entre una lista y una tupla?
-
★☆☆ Dada la siguiente lista, escribir una línea de código que reemplace el nombre ‘Juan’ por ‘Pedro’.
-
★☆☆ Dada la siguiente tupla, escribir una línea de código que reemplace el nombre ‘Juan’ por ‘Pedro’.
- Explique el error que sale al intentar hacerlo.
-
★☆☆ 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])
- 121402
- “Javier”
- “Javier”, “Juan”
- 121402, 98407
-
★☆☆ 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 formatoAAAA-MM-DD
,AAAA
representa el año con 4 dígitos,MM
el mes con 2 dígitos, yDD
el día con 2 dígitos. -
★☆☆ 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. -
★☆☆ Dadas tres listas:
tps
compuesta por tuplas con 3 floats,parcial
que contiene números, ynombres
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 valores9
,5.2
, y1
.nombres
que contiene los valores"Ariel"
,"Dani"
,"Cami"
.
El resultado debe ser
[("Dani", 5.225)]
.
Mix#
-
★★★ 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 ycorpus
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 athreshold
.
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:
el substring maximal es => ‘ola’
Desde el punto de vista de
string_a
, la coincidencia seríalen(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
) fuerastring_b
, la coincidencia sería de un 100%. - Recibe 3 argumentos:
-
★★★ Escribir un programa que reciba una secuencia de comandos por terminal. Los comandos tienen dos partes, la acción (
add
ofind
) 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 defind
.Ejemplo
Si el programa recibe la siguiente secuencia de acciones
debe devolver la siguiente lista:
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 segundofind
y no hay instancias con substring “se” al momento del tercerfind
.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.