Ir al contenido principal

Lista con repeticiones

Definir la función

tieneRepeticiones :: Eq a => [a] -> Bool

tal que (tieneRepeticiones xs) se verifica si xs tiene algún elemento repetido. Por ejemplo,

tieneRepeticiones [3,2,5,2,7]          ==  True
tieneRepeticiones [3,2,5,4,7]          ==  False
tieneRepeticiones (5:[1..2000000000])  ==  True
tieneRepeticiones [1..20000]           ==  False

Leer más…

Mayor resto

El resultado de dividir un número n por un divisor d es un cociente q y un resto r.

Definir la función

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

tal que (mayorResto n d) es el par (m,xs) tal que m es el mayor resto de dividir n entre x (con 1 ≤ x < d) y xs es la lista de números x menores que d tales que el resto de n entre x es m. Por ejemplo,

mayorResto 20 10  ==  (6,[7])
mayorResto 50 8   ==  (2,[3,4,6])

Nota: Se supone que d > 1.


Leer más…

Entero positivo con ciertas propiedades

El 6 de octubre, se propuso en el blog Gaussianos el siguiente problema

Demostrar que para todo entero positivo n, existe otro entero positivo que tiene las siguientes propiedades:

  1. Tiene exactamente n dígitos.
  2. Ninguno de sus dígitos es 0.
  3. Es divisible por la suma de sus dígitos.

Definir la función

especiales :: Integer -> [Integer]

tal que (especiales n) es la lista de los números enteros que cumplen las 3 propiedades anteriores para n. Por ejemplo,

take 3 (especiales 2)  ==  [12,18,21]
take 3 (especiales 3)  ==  [111,112,114]
head (especiales 30)   ==  111111111111111111111111111125
length (especiales 3)  ==  108
null (especiales 1000) ==  False

En el primer ejemplo, 12 es un número especial para 2 ya que tiene exactamente 2 dígitos, ninguno de sus dígitos es 0 y 12 es divisible por la suma de sus dígitos.


Leer más…

Centro de masas

El centro de masas de un sistema discreto es el punto geométrico que dinámicamente se comporta como si en él estuviera aplicada la resultante de las fuerzas externas al sistema.

Representamos un conjunto de n masas en el plano mediante una lista de n pares de la forma ((a(i),b(i)),m(i)) donde (a(i),b(i)) es la posición y m(i) la masa puntual. Las coordenadas del centro de masas (a,b) se calculan por

a = (a(1)·m(1) + a(2)·m(2) + ... + a(n)·m(n)) / (m(1) + m(2) +...+ m(n))
b = (b(1)·m(1) + b(2)·m(2) + ... + b(n)·m(n)) / (m(1) + m(2) +...+ m(n))

Definir la función

centrodeMasas :: [((Float,Float),Float)] -> (Float,Float)

tal que (centrodeMasas xs) es las coordenadas del centro de masas del sistema discreto xs. Por ejemplo:

centrodeMasas [((-1,3),2),((0,0),5),((1,3),3)] == (0.1,1.5)

Leer más…

Refinamiento de listas

Definir la función

refinada :: [Float] -> [Float]

tal que (refinada xs) es la lista obtenida intercalando entre cada dos elementos consecutivos de xs su media aritmética. Por ejemplo,

refinada [2,7,1,8]  ==  [2.0,4.5,7.0,4.0,1.0,4.5,8.0]
refinada [2]        ==  [2.0]
refinada []         ==  []

Leer más…

Pandigitales tridivibles

El número 4106357289 tiene la siguientes dos propiedades:

  • es pandigital, porque tiene todos los dígitos del 0 al 9 exactamente una vez y
  • es tridivisible, porque los sucesivos subnúmeros de tres dígitos (a partir del segundo) son divisibles por los sucesivos números primos; es decir, representado por d(i) el i-ésimo dígito, se tiene
d(2)d(3)d(4)  = 106 es divisible por 2
d(3)d(4)d(5)  = 063 es divisible por 3
d(4)d(5)d(6)  = 635 es divisible por 5
d(5)d(6)d(7)  = 357 es divisible por 7
d(6)d(7)d(8)  = 572 es divisible por 11
d(7)d(8)d(9)  = 728 es divisible por 13
d(8)d(9)d(10) = 289 es divisible por 17

Definir la constante

pandigitalesTridivisibles :: [Integer]

cuyos elementos son los números pandigitales tridivisibles. Por ejemplo,

head pandigitalesTridivisibles  ==  4106357289
sum pandigitalesTridivisibles   ==  16695334890

Leer más…

Pandigitales primos

Un número con n dígitos es pandigital si contiene todos los dígitos del 1 a n exactamente una vez. Por ejemplo, 2143 es un pandigital con 4 dígitos y, además, es primo.

Definir la constante

pandigitalesPrimos :: [Int]

tal que sus elementos son los números pandigitales, ordenados de mayor a menor. Por ejemplo,

take 3 pandigitalesPrimos       ==  [7652413,7642513,7641253]
2143 `elem` pandigitalesPrimos  ==  True
length pandigitalesPrimos       ==  538

Leer más…

Codificación de Fibonacci

La codificación de Fibonacci de un número n es una cadena d = d(0)d(1)...d(k-1)d(k) de ceros y unos tal que

n = d(0)·F(2) + d(1)·F(3) +...+ d(k-1)·F(k+1)
d(k-1) = d(k) = 1

donde F(i) es el i-ésimo término de la sucesión de Fibonacci.

0,1,1,2,3,5,8,13,21,34,...

Por ejemplo. La codificación de Fibonacci de 4 es "1011" ya que los dos últimos elementos son iguales a 1 y

1·F(2) + 0·F(3) + 1·F(4) = 1·1 + 0·2 + 1·3 = 4

La codificación de Fibonacci de los primeros números se muestra en la siguiente tabla

 1  = 1     = F(2)           ≡       11
 2  = 2     = F(3)           ≡      011
 3  = 3     = F(4)           ≡     0011
 4  = 1+3   = F(2)+F(4)      ≡     1011
 5  = 5     = F(5)           ≡    00011
 6  = 1+5   = F(2)+F(5)      ≡    10011
 7  = 2+5   = F(3)+F(5)      ≡    01011
 8  = 8     = F(6)           ≡   000011
 9  = 1+8   = F(2)+F(6)      ≡   100011
10  = 2+8   = F(3)+F(6)      ≡   010011
11  = 3+8   = F(4)+F(6)      ≡   001011
12  = 1+3+8 = F(2)+F(4)+F(6) ≡   101011
13  = 13    = F(7)           ≡  0000011
14  = 1+13  = F(2)+F(7)      ≡  1000011

Definir la función

codigoFib :: Integer -> String

tal que (codigoFib n) es la codificación de Fibonacci del número n. Por ejemplo,

λ> codigoFib 65
"0100100011"
λ> [codigoFib n | n <- [1..7]]
["11","011","0011","1011","00011","10011","01011"]

Leer más…

Partición por longitudes

Definir la función

particion :: [a] -> [Int] -> [[a]]

tal que (particion xs ns) es la partición de xs donde la longitud de cada parte está determinada por los elementos de ns. Por ejemplo,

particion [1..10] [2,5,0,3]  ==  [[1,2],[3,4,5,6,7],[],[8,9,10]]
particion [1..10] [1,4,2,3]  ==  [[1],[2,3,4,5],[6,7],[8,9,10]]

Leer más…

Máximos de una lista

Definir la función

maximos :: Ord a => [a] -> [a]

tal que (maximos xs) es la lista de los elementos de xs que son mayores que todos sus anteriores. Por ejemplo,

maximos [1,-3,5,2,3,4,7,6,7]                         ==  [1,5,7]
maximos "bafcdegag"                                  ==  "bfg"
maximos (concat (replicate (10^6) "adxbcde")++"yz")  ==  "adxyz"
length (maximos [1..10^6])                           ==  1000000

Leer más…