Guest User

Untitled

a guest
Nov 22nd, 2017
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.86 KB | None | 0 0
  1. import qualified Data.Map as Map
  2. import Control.Monad
  3.  
  4.  
  5. main :: IO ()
  6. main = processOneField
  7.  
  8.  
  9. processOneField :: IO ()
  10. processOneField = do
  11. [n, m] <- (map read . words) <$> getLine :: IO [Int]
  12. when ((n, m) /= (0, 0)) $ doProcessOneField n m
  13.  
  14.  
  15. doProcessOneField :: Int -> Int -> IO ()
  16. doProcessOneField n m = do
  17. arena <- replicateM n getLine
  18. let coords = [ (i, j) | i <- [0..n-1], j <- [0..m-1] ]
  19. let mines = filter ( \ c -> (arena !! fst c) !! snd c == '*' ) coords
  20. let zeromap = Map.fromList $ map ( \ c -> (c, 0::Int) ) coords
  21. print $ foldr (f coords) zeromap mines
  22. processOneField
  23.  
  24.  
  25. f :: [(Int, Int)] -> (Int, Int) -> Map.Map (Int, Int) Int -> Map.Map (Int, Int) Int
  26. f coords (i, j) r = foldr (Map.adjust (+1)) r neighs
  27. where
  28. neighs = do
  29. ii <- [i-1..i+1]
  30. jj <- [j-1..j+1]
  31. guard $ (ii, jj) `elem` coords
  32. return (ii, jj)
Add Comment
Please, Sign In to add comment