Menu Close

Posición del primer falso en un vector

Excercitium

Definir la función

   posicion :: Array Int Bool -> Maybe Int

tal que (posicion v) es la menor posición del vector de booleanos v cuyo valor es falso y es Nothing si todos los valores son verdaderos. Por ejemplo,

   posicion (listArray (0,4) [True,True,False,True,False]) == Just 2
   posicion (listArray (0,4) [i <= 2 | i <- [0..4]])       == Just 3
   posicion (listArray (0,4) [i <= 7 | i <- [0..4]])       == Nothing

Soluciones

import Data.Array 
 
-- 1ª definición:
posicion :: Array Int Bool -> Maybe Int
posicion v | p > n     = Nothing
           | otherwise = Just p
    where p = (length . takeWhile id . elems) v
          (_,n) = bounds v 
 
-- 2ª posición:
posicion2 :: Array Int Bool -> Maybe Int
posicion2 v | null xs   = Nothing
            | otherwise = Just (head xs)
    where xs = [i | i <- indices v, v!i]

4 soluciones de “Posición del primer falso en un vector

  1. jneira

    recorriendo los indices:

    posicion :: Array Int Bool -> Maybe Int
    posicion arr = foldl' f Nothing $ indices arr
       where f (Just i) _ = Just i
             f acc i | arr!i = acc
                     | otherwise = Just i
  2. jneira

    Usando assocs:

    posicion = maybe Nothing (Just . fst) . find (not . snd) . assocs

Escribe tu solución

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.