Ir al contenido principal

Ganadores de las elecciones

Los resultados de las votaciones a delegado en un grupo de clase se recogen mediante listas de asociación. Por ejemplo,

votos :: [(String,Int)]
votos = [("Ana Perez",10),("Juan Lopez",7), ("Julia Rus", 27),
         ("Pedro Val",1), ("Pedro Ruiz",27),("Berta Gomez",11)]

Definir la función

ganadores :: [(String,Int)] -> [String]

tal que (ganadores xs) es la lista de los estudiantes con mayor número de votos en xs. Por ejemplo,

ganadores votos == ["Julia Rus","Pedro Ruiz"]

Leer más…

Listas de igual longitud

Definir la función

mismaLongitud :: [[a]] -> Bool

tal que (mismaLongitud xss) se verifica si todas las listas de la lista de listas xss tienen la misma longitud. Por ejemplo,

mismaLongitud [[1,2],[6,4],[0,0],[7,4]] == True
mismaLongitud [[1,2],[6,4,5],[0,0]]     == False

Leer más…

Ternas con suma acotada

Definir la función

ternasAcotadas :: [Int] -> Int -> [(Int,Int,Int)]

tal que (ternasAcotadas xs n) es el conjunto de ternas de números naturales de xs cuya suma es menor que n. Por ejemplo,

ternasAcotadas [5,1,3,4,7] 12      ==  [(1,3,4),(1,3,5),(1,3,7),(1,4,5)]
ternasAcotadas [5,1,3,4,7] 11      ==  [(1,3,4),(1,3,5),(1,4,5)]
ternasAcotadas [5,1,3,4,7] 10      ==  [(1,3,4),(1,3,5)]
ternasAcotadas [5,1,3,4,7]  9      ==  [(1,3,4)]
ternasAcotadas [5,1,3,4,7]  8      ==  []
ternasAcotadas [1..10^6] 8         ==  [(1,2,3),(1,2,4)]
ternasAcotadas [10^6,10^6-1..1] 8  ==  [(1,2,3),(1,2,4)]

Leer más…

Subárboles monovalorados

Los árboles binarios con valores enteros se pueden representar mediante el tipo Arbol definido por

data Arbol = H Int
           | N Int Arbol Arbol
           deriving Show

Por ejemplo, el árbol

      7
     / \
    /   \
   /     \
  4       9
 / \     / \
1   3   5   6

se puede representar por

N 7 (N 4 (H 1) (H 3)) (N 9 (H 5) (H 6))

Un árbol es monovalorado si todos sus elementos son iguales. Por ejemplo, de los siguientes árboles sólo son monovalorados los dos primeros

  5          9           5          9
 / \        / \         / \        / \
5   5      9   9       5   6      9   7
              / \                    / \
             9   9                  9   9

Definir la función

monovalorados :: Arbol -> [Arbol]

tal que (monovalorados a) es la lista de los subárboles monovalorados de a. Por ejemplo,

λ> monovalorados (N 5 (H 5) (H 5))
[N 5 (H 5) (H 5),H 5,H 5]
λ> monovalorados (N 5 (H 5) (H 6))
[H 5,H 6]
λ> monovalorados (N 9 (H 9) (N 9 (H 9) (H 9)))
[N 9 (H 9) (N 9 (H 9) (H 9)),H 9,N 9 (H 9) (H 9),H 9,H 9]
λ> monovalorados (N 9 (H 9) (N 7 (H 9) (H 9)))
[H 9,H 9,H 9]
λ> monovalorados (N 9 (H 9) (N 9 (H 7) (H 9)))
[H 9,H 7,H 9]

Leer más…

Intersecciones parciales

Definir la función

interseccionParcial :: Eq a => Int -> [[a]] -> [a]

tal que (interseccionParcial n xss) es la lista de los elementos que pertenecen al menos a n conjuntos de xss. Por ejemplo,

interseccionParcial 1 [[3,4],[4,5,9],[5,4,7]]  == [3,4,5,9,7]
interseccionParcial 2 [[3,4],[4,5,9],[5,4,7]]  == [4,5]
interseccionParcial 3 [[3,4],[4,5,9],[5,4,7]]  == [4]
interseccionParcial 4 [[3,4],[4,5,9],[5,4,7]]  == []

Leer más…

Productos de N números consecutivos

La semana pasada se planteó en Twitter el siguiente problema

Se observa que

1x2x3x4 = 2x3x4 2x3x4x5 = 4x5x6

¿Existen ejemplos de otros productos de cuatro enteros consecutivos iguales a un producto de tres enteros consecutivos?

Definir la función

esProductoDeNconsecutivos :: Integer -> Integer -> Maybe Integer

tal que (esProductoDeNconsecutivos n x) es (Just m) si x es el producto de n enteros consecutivos a partir de m y es Nothing si x no es el producto de n enteros consecutivos. Por ejemplo,

esProductoDeNconsecutivos 3   6  == Just 1
esProductoDeNconsecutivos 4   6  == Nothing
esProductoDeNconsecutivos 4  24  == Just 1
esProductoDeNconsecutivos 3  24  == Just 2
esProductoDeNconsecutivos 3 120  == Just 4
esProductoDeNconsecutivos 4 120  == Just 2

Para ejemplos mayores,

λ> esProductoDeNconsecutivos 3 (product [10^20..2+10^20])
Just 100000000000000000000
λ> esProductoDeNconsecutivos2 4 (product [10^20..2+10^20])
Nothing
λ> esProductoDeNconsecutivos2 4 (product [10^20..3+10^20])
Just 100000000000000000000

Usando la función esProductoDeNconsecutivos resolver el problema.


Leer más…

Dígitos visibles y ocultos

Una cadena clave es una cadena que contiene dígitos visibles y ocultos. Los dígitos se ocultan mediante las primeras letras minúsculas: la 'a' oculta el '0', la 'b' el '1' y así sucesivamente hasta la 'j' que oculta el '9'. Los restantes símbolos de la cadena no tienen significado y se pueden ignorar.

Definir la función

numeroOculto :: String -> Maybe Integer

tal que (numeroOculto cs) es justo el número formado por los dígitos visibles u ocultos de la cadena clave cs, si cs tiene dígitos y Nothing en caso contrario. Por ejemplo,

numeroOculto "jihgfedcba"      ==  Just 9876543210
numeroOculto "JIHGFEDCBA"      ==  Nothing
numeroOculto "el 23 de Enero"  ==  Just 423344
numeroOculto "El 23 de Enero"  ==  Just 23344
numeroOculto "El 23 de enero"  ==  Just 233444
numeroOculto "Todo para nada"  ==  Just 300030

Leer más…

Números muy pares

Un entero positivo x es muy par si tanto x como x² sólo contienen cifras pares. Por ejemplo, 200 es muy par porque todas las cifras de 200 y 200² = 40000 son pares; pero 26 no lo es porque 26² = 767 tiene cifras impares.

Definir la función

siguienteMuyPar :: Integer -> Integer

tal que (siguienteMuyPar x) es menor número mayor que x que es muy par. Por ejemplo,

siguienteMuyPar 300           ==  668
siguienteMuyPar 668           ==  680
siguienteMuyPar 828268400000  ==  828268460602

Leer más…

Unión e intersección general de conjuntos.

Definir las funciones

unionGeneral        :: Eq a => [[a]] -> [a]
interseccionGeneral :: Eq a => [[a]] -> [a]

tales que + (unionGeneral xs) es la unión de los conjuntos de la lista de conjuntos xs (es decir, el conjunto de los elementos que pertenecen a alguno de los elementos de xs). Por ejemplo,

unionGeneral []                    ==  []
unionGeneral [[1]]                 ==  [1]
unionGeneral [[1],[1,2],[2,3]]     ==  [1,2,3]
unionGeneral ([[x] | x <- [1..9]]) ==  [1,2,3,4,5,6,7,8,9]
  • (interseccionGeneral xs) es la intersección de los conjuntos de la lista de conjuntos xs (es decir, el conjunto de los elementos que pertenecen a todos los elementos de xs). Por ejemplo,
interseccionGeneral [[1]]                      ==  [1]
interseccionGeneral [[2],[1,2],[2,3]]          ==  [2]
interseccionGeneral [[2,7,5],[1,5,2],[5,2,3]]  ==  [2,5]
interseccionGeneral ([[x] | x <- [1..9]])      ==  []

Leer más…

Ceros finales del factorial

Definir la función

cerosDelFactorial :: Integer -> Integer

tal que (cerosDelFactorial n) es el número de ceros en que termina el factorial de n. Por ejemplo,

cerosDelFactorial 24                           ==  4
cerosDelFactorial 25                           ==  6
length (show (cerosDelFactorial (1234^5678)))  ==  17552

Leer más…