{"id":3223,"date":"2017-04-14T07:50:01","date_gmt":"2017-04-14T05:50:01","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=3223"},"modified":"2022-03-26T14:35:00","modified_gmt":"2022-03-26T12:35:00","slug":"buscaminas","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/buscaminas\/","title":{"rendered":"Buscaminas"},"content":{"rendered":"<p>El buscaminas es un juego cuyo objetivo es despejar un campo de minas sin detonar ninguna.<\/p>\n<p>El campo de minas se representa mediante un cuadrado con NxN casillas. Algunas casillas tienen un n\u00famero, este n\u00famero indica las minas que hay en todas las casillas vecinas. Cada casilla tiene como m\u00e1ximo 8 vecinas. Por ejemplo, el campo 4&#215;4 de la izquierda contiene dos minas, cada una representada por el n\u00famero 9, y a la  derecha se muestra el campo obtenido anotando las minas vecinas de cada casilla<\/p>\n<pre lang=\"text\">\n   9 0 0 0       9 1 0 0\n   0 0 0 0       2 2 1 0\n   0 9 0 0       1 9 1 0\n   0 0 0 0       1 1 1 0\n<\/pre>\n<p>de la misma forma, la anotaci\u00f3n del siguiente a la izquierda es el de la derecha<\/p>\n<pre lang=\"text\">\n   9 9 0 0 0     9 9 1 0 0\n   0 0 0 0 0     3 3 2 0 0\n   0 9 0 0 0     1 9 1 0 0\n<\/pre>\n<p>En el ejercicio se usar\u00e1 la librer\u00eda Data.Matrix, cuyo manual se encuentra en <a href=\"http:\/\/www.cs.us.es\/~jalonso\/cursos\/i1m\/doc\/manual-Data.Matrix.html\">aqu\u00ed<\/a>.<\/p>\n<p>Los campos de minas se representan mediante matrices:<\/p>\n<pre lang=\"text\">\n   type Campo = Matrix Int\n<\/pre>\n<p>Por ejemplo, los anteriores campos de la izquierda se definen por<\/p>\n<pre lang=\"text\">\n   ejCampo1, ejCampo2 :: Campo\n   ejCampo1 = fromLists [[9,0,0,0],\n                         [0,0,0,0], \n                         [0,9,0,0], \n                         [0,0,0,0]]\n   ejCampo2 = fromLists [[9,9,0,0,0],\n                         [0,0,0,0,0],\n                         [0,9,0,0,0]]\n<\/pre>\n<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   buscaminas :: Campo -> Campo\n<\/pre>\n<p>tal que (buscaminas c) es el campo obtenido anotando las minas vecinas de cada casilla. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   ghci> buscaminas ejCampo1\n   ( 9 1 0 0 )\n   ( 2 2 1 0 )\n   ( 1 9 1 0 )\n   ( 1 1 1 0 )\n\n   ghci> buscaminas ejCampo2\n   ( 9 9 1 0 0 )\n   ( 3 3 2 0 0 )\n   ( 1 9 1 0 0 )\n<\/pre>\n<h4>Soluciones<\/h4>\n<p>[schedule expon=&#8217;2017-04-21&#8242; expat=\u00bb06:00&#8243;]<\/p>\n<ul>\n<li>Las soluciones se pueden escribir en los comentarios hasta el 21 de abril.\n<li>El c\u00f3digo se debe escribir entre una l\u00ednea con &#60;pre lang=\u00bbhaskell\u00bb&#62; y otra con &#60;\/pre&#62;\n<\/ul>\n<p>[\/schedule]<\/p>\n<p>[schedule on=&#8217;2017-04-21&#8242; at=\u00bb06:00&#8243;]<\/p>\n<pre lang=\"haskell\">\r\nimport Data.Matrix\r\n\r\ntype Campo   = Matrix Int\r\ntype Casilla = (Int,Int)\r\n\r\nejCampo1, ejCampo2 :: Campo\r\nejCampo1 = fromLists [[9,0,0,0],\r\n                      [0,0,0,0], \r\n                      [0,9,0,0], \r\n                      [0,0,0,0]]\r\nejCampo2 = fromLists [[9,9,0,0,0],\r\n                      [0,0,0,0,0],\r\n                      [0,9,0,0,0]]\r\n\r\n-- 1\u00aa soluci\u00f3n\r\n-- ===========\r\n\r\nbuscaminas1 :: Campo -> Campo\r\nbuscaminas1 c = matrix m n (\\(i,j) -> minas c (i,j))\r\n    where m = nrows c\r\n          n = ncols c\r\n\r\n-- (minas c (i,j)) es el n\u00famero de minas en las casillas vecinas de la\r\n-- (i,j) en el campo de mina c y es 9 si en (i,j) hay una mina. Por\r\n-- ejemplo,\r\n--    minas ejCampo (1,1)  ==  9\r\n--    minas ejCampo (1,2)  ==  1\r\n--    minas ejCampo (1,3)  ==  0\r\n--    minas ejCampo (2,1)  ==  2\r\nminas :: Campo -> Casilla -> Int\r\nminas c (i,j) \r\n    | c!(i,j) == 9 = 9\r\n    | otherwise    = length (filter (==9) [c!(x,y) | (x,y) <- vecinas m n (i,j)])\r\n                     where m = nrows c\r\n                           n = ncols c\r\n\r\n-- (vecinas m n (i,j)) es la lista de las casillas vecinas de la (i,j) en\r\n-- un campo de dimensiones mxn. Por ejemplo,\r\n--    vecinas 4 (1,1)  ==  [(1,2),(2,1),(2,2)]\r\n--    vecinas 4 (1,2)  ==  [(1,1),(1,3),(2,1),(2,2),(2,3)]\r\n--    vecinas 4 (2,3)  ==  [(1,2),(1,3),(1,4),(2,2),(2,4),(3,2),(3,3),(3,4)]\r\nvecinas :: Int -> Int -> Casilla -> [Casilla]\r\nvecinas m n (i,j) = [(a,b) | a <- [max 1 (i-1)..min m (i+1)],\r\n                             b <- [max 1 (j-1)..min n (j+1)],\r\n                             (a,b) \/= (i,j)]\r\n\r\n-- 2\u00aa soluci\u00f3n\r\n-- ===========\r\n\r\nbuscaminas2 :: Campo -> Campo\r\nbuscaminas2 c = matrix m n (\\(i,j) -> minas (i,j))\r\n    where m = nrows c\r\n          n = ncols c\r\n          minas :: Casilla -> Int\r\n          minas (i,j) \r\n              | c!(i,j) == 9 = 9\r\n              | otherwise    = \r\n                  length (filter (==9) [c!(x,y) | (x,y) <- vecinas (i,j)])\r\n          vecinas :: Casilla -> [Casilla]\r\n          vecinas (i,j) = [(a,b) | a <- [max 1 (i-1)..min m (i+1)],\r\n                                   b <- [max 1 (j-1)..min n (j+1)],\r\n                                   (a,b) \/= (i,j)]\r\n<\/pre>\n<p>[\/schedule]<\/p>\n","protected":false},"excerpt":{"rendered":"<p>El buscaminas es un juego cuyo objetivo es despejar un campo de minas sin detonar ninguna. El campo de minas se representa mediante un cuadrado con NxN casillas. Algunas casillas tienen un n\u00famero, este n\u00famero indica las minas que hay en todas las casillas vecinas. Cada casilla tiene como m\u00e1ximo 8 vecinas. Por ejemplo, el&#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":[2],"tags":[511],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/3223"}],"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=3223"}],"version-history":[{"count":3,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/3223\/revisions"}],"predecessor-version":[{"id":3226,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/3223\/revisions\/3226"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=3223"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=3223"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=3223"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}