Año cúbico
El año 2016 será un año cúbico porque se puede escribir como la suma de los cubos de 7 números consecutivos; en efecto,
2016 = 3³+ 4³ +...+ 9³
Definir la función
esCubico :: Integer -> Bool
tal que (esCubico x) se verifica si x se puede escribir como la suma de los cubos de 7 números consecutivos. Por ejemplo,
esCubico 2016 == True esCubico 2017 == False esCubico 189005670081900441 == True esCubico 189005670081900442 == False
Soluciones
-- 1ª definición -- ============= esCubico1 :: Integer -> Bool esCubico1 x = pertenece x cubicos -- cubicos es la lista de los números que se pueden escribir como la -- suma de los cubos de 7 números consecutivos. Por ejemplo, -- take 5 cubicos == [784,1295,2016,2989,4256] cubicos :: [Integer] cubicos = [sum [x^3 | x <- [y..y+6]] | y <- [1..]] -- (pertenece x ys) se verifica si x pertenece a la lista ordenada -- ys. Por ejemplo, -- pertenece 25 [0,3..] == False -- pertenece 27 [0,3..] == True pertenece :: Integer -> [Integer] -> Bool pertenece x ys = x == head (dropWhile (<x) ys) -- 2ª definición -- ============= esCubico2 :: Integer -> Bool esCubico2 x = pertenece x (cubicosDesde k) where k = floor ((fromIntegral x/7)**(1/3)) cubicosDesde :: Integer -> [Integer] cubicosDesde k = [sum [x^3 | x <- [y..y+6]] | y <- [k..]] -- Comparación de eficiencia -- ========================= -- λ> esCubico1 189005670081900441 -- True -- (7.49 secs, 1,917,868,024 bytes) -- λ> esCubico2 189005670081900441 -- True -- (0.01 secs, 0 bytes)