{"id":3678,"date":"2018-01-31T06:00:03","date_gmt":"2018-01-31T04:00:03","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=3678"},"modified":"2018-02-07T07:29:59","modified_gmt":"2018-02-07T05:29:59","slug":"recorrido-del-robot","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/recorrido-del-robot\/","title":{"rendered":"Recorrido del robot"},"content":{"rendered":"<p>Los puntos de una ret\u00edcula se representan mediante pares de enteros<\/p>\n<pre lang=\"text\"> \n   type Punto = (Int,Int)\n<\/pre>\n<p>y los movimientos de un robot mediante el tipo<\/p>\n<pre lang=\"text\">\n   data Movimiento = N Int\n                   | S Int\n                   | E Int\n                   | O Int\n<\/pre>\n<p>donde (N x) significa que se mueve x unidades en la direcci\u00f3n norte y an\u00e1logamente para las restantes direcciones (S es sur, E es este y O es oeste).<\/p>\n<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   posicion :: [Movimiento] -> Punto\n<\/pre>\n<p>tal que (posicion ms) es la posici\u00f3n final de un robot que inicialmente est\u00e1 en el el punto (0,0) y realiza los movimientos ms. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   posicion [N 3]                           ==  (0,3)\n   posicion [N 3, E 5]                      ==  (5,3)\n   posicion [N 3, E 5, S 1]                 ==  (5,2)\n   posicion [N 3, E 5, S 1, O 4]            ==  (1,2)\n   posicion [N 3, E 5, S 1, O 4, N 3]       ==  (1,5)\n   posicion [N 3, E 5, S 1, O 4, N 3, S 3]  ==  (1,2)\n<\/pre>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\ntype Punto = (Int,Int)\n\ndata Movimiento = N Int\n                | S Int\n                | E Int\n                | O Int\n\n-- 1\u00aa soluci\u00f3n                \nposicion :: [Movimiento] -> Punto\nposicion ms = aux ms (0,0)\n  where aux [] p = p\n        aux (N x:ms) (a,b) = aux ms (a,b+x)\n        aux (S x:ms) (a,b) = aux ms (a,b-x)\n        aux (E x:ms) (a,b) = aux ms (a+x,b)\n        aux (O x:ms) (a,b) = aux ms (a-x,b)\n\n-- 2\u00aa soluci\u00f3n\nposicion2 :: [Movimiento] -> Punto\nposicion2 []       = (0,0)\nposicion2 (N x:ms) = suma (0 ,x)  (posicion2 ms)\nposicion2 (S x:ms) = suma (0 ,-x) (posicion2 ms)\nposicion2 (E x:ms) = suma (x ,0)  (posicion2 ms)\nposicion2 (O x:ms) = suma (-x,0)  (posicion2 ms)\n\nsuma :: Punto -> Punto -> Punto\nsuma (x,y) (a,b) = (x+a,y+b)\n\n-- 3\u00aa soluci\u00f3n\nposicion3 :: [Movimiento] -> Punto\nposicion3 []     = (0,0)\nposicion3 (m:ms) = case m of\n                     N x -> (a,b+x)\n                     S x -> (a,b-x)\n                     E x -> (a+x,b)\n                     O x -> (a-x,b)\n  where (a,b) = posicion3 ms\n\n-- 4\u00aa soluci\u00f3n\nposicion4 :: [Movimiento] -> Punto\nposicion4 = foldl aux (0,0)\n  where\n    aux (x,y) (N j) = (x,y+j)\n    aux (x,y) (S j) = (x,y-j)\n    aux (x,y) (E i) = (x+i,y)\n    aux (x,y) (O i) = (x-i,y)\n\n--- 5\u00aa soluci\u00f3n\nposicion5 :: [Movimiento] -> Punto\nposicion5 xs = (sum hs, sum vs)\n  where\n    (hs,vs)   = unzip (map aux xs)\n    aux (N j) = (0,j)\n    aux (S j) = (0,-j)\n    aux (E i) = (i,0)\n    aux (O i) = (-i,0)\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Los puntos de una ret\u00edcula se representan mediante pares de enteros type Punto = (Int,Int) y los movimientos de un robot mediante el tipo data Movimiento = N Int | S Int | E Int | O Int donde (N x) significa que se mueve x unidades en la direcci\u00f3n norte y an\u00e1logamente para las&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"footnotes":"","_jetpack_memberships_contains_paid_content":false},"categories":[5],"tags":[185,10,11,6,40,416],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/3678"}],"collection":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/comments?post=3678"}],"version-history":[{"count":5,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/3678\/revisions"}],"predecessor-version":[{"id":3721,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/3678\/revisions\/3721"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=3678"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=3678"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=3678"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}