Base de datos de actividades
Las bases de datos sobre actividades de personas pueden representarse mediante listas de elementos de la forma (a,b,c,d), donde a es el nombre de la persona, b su actividad, c su fecha de nacimiento y d la de su fallecimiento. Un ejemplo es la siguiente que usaremos a lo largo de este ejercicio,
1 2 3 4 5 6 7 8 9 10 11 12 13 |
personas :: [(String,String,Int,Int)] personas = [("Cervantes","Literatura",1547,1616), ("Velazquez","Pintura",1599,1660), ("Picasso","Pintura",1881,1973), ("Beethoven","Musica",1770,1823), ("Poincare","Ciencia",1854,1912), ("Quevedo","Literatura",1580,1654), ("Goya","Pintura",1746,1828), ("Einstein","Ciencia",1879,1955), ("Mozart","Musica",1756,1791), ("Botticelli","Pintura",1445,1510), ("Borromini","Arquitectura",1599,1667), ("Bach","Musica",1685,1750)] |
Definir las funciones
1 2 3 4 5 |
nombres :: [(String,String,Int,Int)] -> [String] musicos :: [(String,String,Int,Int)] -> [String] seleccion :: [(String,String,Int,Int)] -> String -> [String] musicos' :: [(String,String,Int,Int)] -> [String] vivas :: [(String,String,Int,Int)] -> Int -> [String] |
tales que
nombres bd
es la lista de los nombres de las personas de la base de datosbd
. Por ejemplo,
1 2 3 4 |
λ> nombres personas ["Cervantes","Velazquez","Picasso","Beethoven","Poincare", "Quevedo","Goya","Einstein","Mozart","Botticelli","Borromini", "Bach"] |
musicos bd
es la lista de los nombres de los músicos de la base de datosbd
. Por ejemplo,
1 |
musicos personas == ["Beethoven","Mozart","Bach"] |
seleccion bd m
es la lista de los nombres de las personas de la base de datosbd
cuya actividad esm
. Por ejemplo,
1 2 3 4 |
λ> seleccion personas "Pintura" ["Velazquez","Picasso","Goya","Botticelli"] λ> seleccion personas "Musica" ["Beethoven","Mozart","Bach"] |
musicos' bd
es la lista de los nombres de los músicos de la base de datosbd
. Por ejemplo,
1 |
musicos' personas == ["Beethoven","Mozart","Bach"] |
vivas bd a
es la lista de los nombres de las personas de la base de datosbd
que estaban vivas en el añoa
. Por ejemplo,
1 2 |
λ> vivas personas 1600 ["Cervantes","Velazquez","Quevedo","Borromini"] |
Soluciones
A continuación se muestran las soluciones en Haskell y las soluciones en Python.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
personas :: [(String,String,Int,Int)] personas = [("Cervantes","Literatura",1547,1616), ("Velazquez","Pintura",1599,1660), ("Picasso","Pintura",1881,1973), ("Beethoven","Musica",1770,1823), ("Poincare","Ciencia",1854,1912), ("Quevedo","Literatura",1580,1654), ("Goya","Pintura",1746,1828), ("Einstein","Ciencia",1879,1955), ("Mozart","Musica",1756,1791), ("Botticelli","Pintura",1445,1510), ("Borromini","Arquitectura",1599,1667), ("Bach","Musica",1685,1750)] nombres :: [(String,String,Int,Int)] -> [String] nombres bd = [x | (x,_,_,_) <- bd] musicos :: [(String,String,Int,Int)] -> [String] musicos bd = [x | (x,"Musica",_,_) <- bd] seleccion :: [(String,String,Int,Int)] -> String -> [String] seleccion bd m = [ x | (x,m',_,_) <- bd, m == m' ] musicos' :: [(String,String,Int,Int)] -> [String] musicos' bd = seleccion bd "Musica" vivas :: [(String,String,Int,Int)] -> Int -> [String] vivas bd a = [x | (x,_,a1,a2) <- bd, a1 <= a, a <= a2] |
El código se encuentra en GitHub.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
BD = list[tuple[str, str, int, int]] personas: BD = [ ("Cervantes", "Literatura", 1547, 1616), ("Velazquez", "Pintura", 1599, 1660), ("Picasso", "Pintura", 1881, 1973), ("Beethoven", "Musica", 1770, 1823), ("Poincare", "Ciencia", 1854, 1912), ("Quevedo", "Literatura", 1580, 1654), ("Goya", "Pintura", 1746, 1828), ("Einstein", "Ciencia", 1879, 1955), ("Mozart", "Musica", 1756, 1791), ("Botticelli", "Pintura", 1445, 1510), ("Borromini", "Arquitectura", 1599, 1667), ("Bach", "Musica", 1685, 1750)] def nombres(bd: BD) -> list[str]: return [p[0] for p in bd] def musicos(bd: BD) -> list[str]: return [p[0] for p in bd if p[1] == "Musica"] def seleccion(bd: BD, m: str) -> list[str]: return [p[0] for p in bd if p[1] == m] def musicos2(bd: BD) -> list[str]: return seleccion(bd, "Musica") def vivas(bd: BD, a: int) -> list[str]: return [p[0] for p in bd if p[2] <= a <= p[3]] |
El código se encuentra en GitHub.