Menu Close

Búsqueda de la mina

En este ejercicio, se representa un mapa mediante una lista de listas de la misma longitud donde todos sus elementos son 0 menos uno (que es un 1) que es donde se encuentra la mina. Por ejemplo, en el mapa

   0 0 0 0
   0 0 0 0
   0 1 0 0

la posición de la mina es (2,1).

Definir la función

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

tal que (posicionMina m) es la posición de la mina en el mapa m, Por ejemplo,

   posicionMina [[0,0,0,0],[0,0,0,0],[0,1,0,0]]  ==  (2,1)

Soluciones

import Data.List (elemIndex)
import Data.Array (assocs, listArray)
 
-- 1ª solución
posicionMina :: [[Int]] -> (Int,Int)
posicionMina xss = (length yss, length ys)
  where (yss,xs:_) = break (1 `elem`) xss
        ys         = takeWhile (/= 1) xs
 
-- 2ª solución
posicionMina2 :: [[Int]] -> (Int,Int)
posicionMina2 xss = divMod p (length (head xss))
  where Just p = elemIndex 1 (concat xss)
 
-- 3ª solución
posicionMina3 :: [[Int]] -> (Int,Int)
posicionMina3 xss =
  (fst . head . filter ((1 ==) . snd) . assocs) a
  where m = length xss - 1
        n = length (head xss) - 1
        a = listArray ((0,0),(m,n)) (concat xss)

Otras soluciones

  • Se pueden escribir otras soluciones en los comentarios.
  • El código se debe escribir entre una línea con <pre lang="haskell"> y otra con </pre>

Pensamiento

“La vida de un matemático está dominada por una insaciable curiosidad, un deseo que raya en la pasión por resolver los problemas que estudia.”

Jean Dieudonné.

Medio

5 soluciones de “Búsqueda de la mina

  1. juabaerui
    posicionMina :: [[Int]] -> (Int,Int)
    posicionMina m = aux1 m 0 0
      where aux1 (xs:xss) a b | all (==0) xs = aux1 xss (a+1) b
                              | otherwise   = (a, aux2 xs 0)
            aux2 (x:xs) a | x == 0    = aux2 xs (a+1)
                          | otherwise = a
  2. anthormol
    posicionMina :: [[Int]] -> (Int,Int)
    posicionMina xss = (x,y)
         where x = head [q | (xs,q) <- zip xss [0..], elem 1 xs]
               y = head [p | (x,p) <- zip (xss !! x) [0..], x == 1]
  3. Enrique Zubiría
    import Data.Array
     
    posicionMina :: [[Int]] -> (Int,Int)
    posicionMina xss =
      fst
      $ head
      $ filter ((a, v) -> v == 1)
               (assocs (listArray ((0,0),(f-1,c-1)) (concat xss)))
      where f = length xss
            c = length $ head xss
  4. Enrique Zubiría
    posicionMina :: [[Int]] -> (Int,Int)
    posicionMina xss = encuentraFila xss 0
     
    encuentraFila :: [[Int]] -> Int -> (Int,Int)
    encuentraFila (xs:xss) f
      | all (==0) xs = encuentraFila xss (f+1)
      | otherwise    = encuentraColumna xs f
     
    encuentraColumna :: [Int] -> Int -> (Int,Int)
    encuentraColumna xs f = (f, length $ takeWhile (/=1) xs)
  5. Enrique Zubiría
    posicionMina :: [[Int]] -> (Int,Int)
    posicionMina xss =
      (length $ takeWhile (xs -> all (==0) xs) xss,
       length $ takeWhile (/=1) (head $ filter (xs -> any (==1) xs) xss))

Escribe tu solución

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