-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathMovimientos_en_el_plano.hs
77 lines (63 loc) · 2.48 KB
/
Movimientos_en_el_plano.hs
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
-- Movimientos_en_el_plano.hs
-- Movimientos en el plano.
-- José A. Alonso Jiménez <https://jaalonso.github.io>
-- Sevilla, 23-noviembre-2022
-- ---------------------------------------------------------------------
-- ---------------------------------------------------------------------
-- Se consideran el tipo de las posiciones del plano definido por
-- type Posicion = (Int,Int)
-- y el tipo de las direcciones definido por
-- data Direccion = Izquierda | Derecha | Arriba | Abajo
-- deriving Show
--
-- Definir las siguientes funciones
-- opuesta :: Direccion -> Direccion
-- movimiento :: Posicion -> Direccion -> Posicion
-- movimientos :: Posicion -> [Direccion] -> Posicion
-- tales que
-- + (opuesta d) es la dirección opuesta de d. Por ejemplo,
-- opuesta Izquierda == Derecha
-- + (movimiento p d) es la posición reultante de moverse, desde la
-- posición p, un paso en la dirección d . Por ejemplo,
-- movimiento (2,5) Arriba == (2,6)
-- movimiento (2,5) (opuesta Abajo) == (2,6)
-- + (movimientos p ds) es la posición obtenida aplicando la lista de
-- movimientos según las direcciones de ds a la posición p. Por ejemplo,
-- movimientos (2,5) [Arriba, Izquierda] == (1,6)
-- ---------------------------------------------------------------------
module Movimientos_en_el_plano where
type Posicion = (Int,Int)
data Direccion = Izquierda | Derecha | Arriba | Abajo
deriving Show
-- Definición de opuesta
-- =====================
opuesta :: Direccion -> Direccion
opuesta Izquierda = Derecha
opuesta Derecha = Izquierda
opuesta Arriba = Abajo
opuesta Abajo = Arriba
-- 1ª definición de movimiento
-- ===========================
movimiento1 :: Posicion -> Direccion -> Posicion
movimiento1 (x,y) Izquierda = (x-1,y)
movimiento1 (x,y) Derecha = (x+1,y)
movimiento1 (x,y) Arriba = (x,y+1)
movimiento1 (x,y) Abajo = (x,y-1)
-- 2ª definición de movimiento
-- ===========================
movimiento2 :: Posicion -> Direccion -> Posicion
movimiento2 (x,y) d =
case d of
Izquierda -> (x-1,y)
Derecha -> (x+1,y)
Arriba -> (x,y+1)
Abajo -> (x,y-1)
-- 1ª definición de movimientos
-- ============================
movimientos1 :: Posicion -> [Direccion] -> Posicion
movimientos1 p [] = p
movimientos1 p (d:ds) = movimientos1 (movimiento1 p d) ds
-- 2ª definición de movimientos
-- ============================
movimientos2 :: Posicion -> [Direccion] -> Posicion
movimientos2 = foldl movimiento1