El 2019 es un número de la suerte
Un número de la suerte es un número natural que se genera por una criba, similar a la criba de Eratóstenes, como se indica a continuación:
Se comienza con la lista de los números enteros a partir de 1:
| 
					 1  | 
						   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...  | 
					
Se eliminan los números de dos en dos
| 
					 1  | 
						   1,  3,  5,  7,  9,   11,   13,   15,   17,   19,   21,   23,   25...  | 
					
Como el segundo número que ha quedado es 3, se eliminan los números restantes de tres en tres:
| 
					 1  | 
						   1,  3,      7,  9,         13,   15,         19,   21,         25...  | 
					
Como el tercer número que ha quedado es 7, se eliminan los números restantes de siete en siete:
| 
					 1  | 
						   1,  3,      7,  9,         13,   15,               21,         25...  | 
					
Este procedimiento se repite indefinidamente y los supervivientes son los números de la suerte:
| 
					 1  | 
						   1,3,7,9,13,15,21,25,31,33,37,43,49,51,63,67,69,73,75,79  | 
					
Definir las funciones
| 
					 1 2  | 
						   numerosDeLaSuerte  :: [Int]    esNumeroDeLaSuerte :: Int -> Bool  | 
					
tales que
- numerosDeLaSuerte es la sucesión de los números de la suerte. Por ejemplo,
 
| 
					 1 2 3 4 5 6  | 
						     λ> take 20 numerosDeLaSuerte      [1,3,7,9,13,15,21,25,31,33,37,43,49,51,63,67,69,73,75,79]      λ> numerosDeLaSuerte !! 277      2019      λ> numerosDeLaSuerte !! 2000      19309  | 
					
- (esNumeroDeLaSuerte n) que se verifica si n es un número de la suerte. Por ejemplo,
 
| 
					 1 2 3  | 
						   esNumeroDeLaSuerte 15    ==  True    esNumeroDeLaSuerte 16    ==  False    esNumeroDeLaSuerte 2019  ==  True  | 
					
Soluciones
| 
					 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  | 
						-- 1ª definición de numerosDeLaSuerte  numerosDeLaSuerte :: [Int] numerosDeLaSuerte = criba 3 [1,3..]   where     criba i (n:s:xs) =       n : criba (i + 1) (s : [x | (k, x) <- zip [i..] xs                                 , rem k s /= 0]) -- 2ª definición de numerosDeLaSuerte  numerosDeLaSuerte2 :: [Int] numerosDeLaSuerte2 =  1 : criba 2 [1, 3..]   where criba k xs = z : criba (k + 1) (aux xs)           where z = xs !! (k - 1 )                 aux ws = us ++ aux vs                   where (us, _:vs) = splitAt (z - 1) ws  -- Comparación de eficiencia -- ========================= --    λ> numerosDeLaSuerte2 !! 200 --    1387 --    (9.25 secs, 2,863,983,232 bytes) --    λ> numerosDeLaSuerte !! 200 --    1387 --    (0.06 secs, 10,263,880 bytes) -- Definición de esNumeroDeLaSuerte esNumeroDeLaSuerte :: Int -> Bool esNumeroDeLaSuerte n =   n == head (dropWhile (<n) numerosDeLaSuerte)  | 
					
Pensamiento
Ya es sólo brocal el pozo;
púlpito será mañana;
pasado mañana, trono.Antonio Machado