0votos

Rotar matriz en 90º en Haskell

por josejuan hace 4 años

Puede hacerse con una sola variable auxiliar, por comodidad yo uso 4. Por otro lado, aunque las matrices son *MUTABLES*, todas las funciones son puras ;) bajo la mónada ST.

Rotar una matriz mutable en 90º sin usar otra matriz de ayuda

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
31
32
33
34
35
{-# LANGUAGE FlexibleContexts #-} 
import Control.Monad.ST 
import Data.Array.ST 
import Data.Array.Unboxed 
import Data.List 
import Data.Function 
import Text.Printf 
import Control.Monad 
 
rota90 :: STArray s (Int,Int) Int -> ST s () 
rota90 c = do 
  (_,(_,n)) <- getBounds c 
  let rota i = do 
        forM_ [0..n - 2 * i] $ \d -> do 
          let is = [(i,j-d),(j-d,j),(j,i+d),(i+d,i)] where j=n-i+1 
          mapM (readArray c) is >>= mapM_ (uncurry $ writeArray c) . zip (drop 1 $ cycle is) 
  mapM_ rota [1..n `div` 2] 
 
 
 
 
 
 
 
 
cuadrada :: Int -> ST s (STArray s (Int, Int) Int) 
cuadrada n = newListArray ((1,1),(n,n)) [1..] 
 
printM :: UArray (Int, Int) Int -> IO () 
printM = mapM_ (putStrLn.concatMap ((printf "%5s" :: String -> String) . show . snd)) . groupBy ((==) `on` (fst.fst)) . assocs 
 
main = printM $ runST $ do 
  c <- cuadrada 4 
  rota90 c 
  freeze c 

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.