El problema del número perdido
Sea xs una lista de números consecutivos (creciente o decreciente), en la que puede faltar algún número. El problema del número perdido en xs consiste en lo siguiente:
- si falta un único número z, devolver Just z
- si no falta ninguno, devolver Nothing
Definir la función
1 |
numeroPerdido :: [Int] -> Maybe Int |
tal que (numeroPerdido xs) es el resultado del problema del número perdidio en xs. Por ejemplo,
1 2 3 4 5 |
numeroPerdido [7,6,4,3] == Just 5 numeroPerdido [1,2,4,5,6] == Just 3 numeroPerdido [6,5..3] == Nothing numeroPerdido [1..6] == Nothing numeroPerdido ([5..10^6] ++ [10^6+2..10^7]) == Just 1000001 |
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 |
import Data.List (tails, sort) import Data.Maybe (listToMaybe) -- 1ª solución numeroPerdido :: [Int] -> Maybe Int numeroPerdido (x:y:xs) | abs (y - x) == 1 = numeroPerdido (y:xs) | otherwise = Just (div (x+y) 2) numeroPerdido _ = Nothing -- 2ª solución numeroPerdido2 :: [Int] -> Maybe Int numeroPerdido2 xs = aux z (z:zs) where (z:zs) = sort xs aux _ [] = Nothing aux y (x:xs) | y == x = aux (y+1) xs | otherwise = Just y -- 3ª solución -- =========== numeroPerdido3 :: [Int] -> Maybe Int numeroPerdido3 xs = listToMaybe [(a+b) `div` 2 | (a:b:_) <- tails xs, abs(a-b) /= 1] |
Pensamiento
¡Reventó de risa!
¡Un hombre tan serio!
… Nadie lo diría.Antonio Machado
Solución en Maxima:
numeroPerdido (xs) := if (length(xs)<2)
then Nothing else g(xs)$
g(xs):=if (abs(second(xs)-first(xs))=1) then
numeroPerdido (rest(xs)) else
(Just ((first(xs)+second(xs))/ 2)) $