Recorrido del robot
Los puntos de una retícula se representan mediante pares de enteros
1 |
type Punto = (Int,Int) |
y los movimientos de un robot mediante el tipo
1 2 3 4 |
data Movimiento = N Int | S Int | E Int | O Int |
donde (N x) significa que se mueve x unidades en la dirección norte y análogamente para las restantes direcciones (S es sur, E es este y O es oeste).
Definir la función
1 |
posicion :: [Movimiento] -> Punto |
tal que (posicion ms) es la posición final de un robot que inicialmente está en el el punto (0,0) y realiza los movimientos ms. Por ejemplo,
1 2 3 4 5 6 |
posicion [N 3] == (0,3) posicion [N 3, E 5] == (5,3) posicion [N 3, E 5, S 1] == (5,2) posicion [N 3, E 5, S 1, O 4] == (1,2) posicion [N 3, E 5, S 1, O 4, N 3] == (1,5) posicion [N 3, E 5, S 1, O 4, N 3, S 3] == (1,2) |
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 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
type Punto = (Int,Int) data Movimiento = N Int | S Int | E Int | O Int -- 1ª solución posicion :: [Movimiento] -> Punto posicion ms = aux ms (0,0) where aux [] p = p aux (N x:ms) (a,b) = aux ms (a,b+x) aux (S x:ms) (a,b) = aux ms (a,b-x) aux (E x:ms) (a,b) = aux ms (a+x,b) aux (O x:ms) (a,b) = aux ms (a-x,b) -- 2ª solución posicion2 :: [Movimiento] -> Punto posicion2 [] = (0,0) posicion2 (N x:ms) = suma (0 ,x) (posicion2 ms) posicion2 (S x:ms) = suma (0 ,-x) (posicion2 ms) posicion2 (E x:ms) = suma (x ,0) (posicion2 ms) posicion2 (O x:ms) = suma (-x,0) (posicion2 ms) suma :: Punto -> Punto -> Punto suma (x,y) (a,b) = (x+a,y+b) -- 3ª solución posicion3 :: [Movimiento] -> Punto posicion3 [] = (0,0) posicion3 (m:ms) = case m of N x -> (a,b+x) S x -> (a,b-x) E x -> (a+x,b) O x -> (a-x,b) where (a,b) = posicion3 ms -- 4ª solución posicion4 :: [Movimiento] -> Punto posicion4 = foldl aux (0,0) where aux (x,y) (N j) = (x,y+j) aux (x,y) (S j) = (x,y-j) aux (x,y) (E i) = (x+i,y) aux (x,y) (O i) = (x-i,y) --- 5ª solución posicion5 :: [Movimiento] -> Punto posicion5 xs = (sum hs, sum vs) where (hs,vs) = unzip (map aux xs) aux (N j) = (0,j) aux (S j) = (0,-j) aux (E i) = (i,0) aux (O i) = (-i,0) |
7 Comentarios