{"id":4345,"date":"2018-11-29T06:00:14","date_gmt":"2018-11-29T04:00:14","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=4345"},"modified":"2019-01-19T12:10:20","modified_gmt":"2019-01-19T10:10:20","slug":"numeros-colinas","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/numeros-colinas\/","title":{"rendered":"N\u00fameros colinas"},"content":{"rendered":"<p>Se dice que un n\u00famero natural n es una colina si su primer d\u00edgito es igual a su \u00faltimo d\u00edgito, los primeros d\u00edgitos son estrictamente creciente hasta llegar al m\u00e1ximo, el m\u00e1ximo se puede repetir y los d\u00edgitos desde el m\u00e1ximo al final son estrictamente decrecientes.<\/p>\n<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   esColina :: Integer -> Bool\n<\/pre>\n<p>tal que (esColina n) se verifica si n es un n\u00famero colina. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   esColina 12377731  ==  True\n   esColina 1237731   ==  True\n   esColina 123731    ==  True\n   esColina 122731    ==  False\n   esColina 12377730  ==  False\n   esColina 12377730  ==  False\n   esColina 10377731  ==  False\n   esColina 12377701  ==  False\n   esColina 33333333  ==  True\n<\/pre>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Data.Char (digitToInt)\n\n-- 1\u00aa definici\u00f3n\n-- =============\n\nesColina :: Integer -> Bool\nesColina n =\n  head ds == last ds &&\n  esCreciente xs &&\n  esDecreciente ys\n  where ds = digitos n\n        m  = maximum ds\n        xs = takeWhile (<m) ds\n        ys = dropWhile (==m) (dropWhile (<m) ds)\n\n-- (digitos n) es la lista de los d\u00edgitos de n. Por ejemplo,\n--    digitos 425  ==  [4,2,5]\ndigitos :: Integer -> [Int]\ndigitos n = map digitToInt (show n)\n\n-- (esCreciente xs) se verifica si la lista xs es estrictamente\n-- creciente. Por ejemplo,\n--    esCreciente [2,4,7]  ==  True\n--    esCreciente [2,2,7]  ==  False\n--    esCreciente [2,1,7]  ==  False\nesCreciente :: [Int] -> Bool\nesCreciente xs = and [x < y | (x,y) <- zip xs (tail xs)]\n\n-- (esDecreciente xs) se verifica si la lista xs es estrictamente\n-- decreciente. Por ejemplo,\n--    esDecreciente [7,4,2]  ==  True\n--    esDecreciente [7,2,2]  ==  False\n--    esDecreciente [7,1,2]  ==  False\nesDecreciente :: [Int] -> Bool\nesDecreciente xs = and [x > y | (x,y) <- zip xs (tail xs)]\n\n-- 2\u00aa definici\u00f3n\n-- =============\n\nesColina2 :: Integer -> Bool\nesColina2 n =\n  head ds == last ds &&\n  null (dropWhile (==(-1)) (dropWhile (==0) (dropWhile (==1) xs)))\n  where ds = digitos n\n        xs = [signum (y-x) | (x,y) <- zip ds (tail ds)] \n\n-- Equivalencia\n-- ============\n\n-- La propiedad de equivalencia es\nprop_esColina :: Integer -> Property\nprop_esColina n =\n  n >= 0 ==> esColina n == esColina2 n \n\n-- La comprobaci\u00f3n es\n--    \u03bb> quickCheck prop_esColina\n--    +++ OK, passed 100 tests.\n<\/pre>\n<h4>Referencia<\/h4>\n<p>Basado en el problema <a href=\"http:\/\/bit.ly\/2QjVhvl\">Is this number a hill number?<\/a> de <a href=\"http:\/\/bit.ly\/2QgJ7mV\">Code Golf<\/a><\/p>\n<h4>Pensamiento<\/h4>\n<blockquote><p>\nSi me tengo que morir<br \/>\npoco me importa aprender.<br \/>\nY si no puedo saber,<br \/>\npoco me importa vivir.<\/p>\n<p>Antonio Machado\n<\/p><\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>Se dice que un n\u00famero natural n es una colina si su primer d\u00edgito es igual a su \u00faltimo d\u00edgito, los primeros d\u00edgitos son estrictamente creciente hasta llegar al m\u00e1ximo, el m\u00e1ximo se puede repetir y los d\u00edgitos desde el m\u00e1ximo al final son estrictamente decrecientes. Definir la funci\u00f3n esColina :: Integer -> Bool tal&#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":[4],"tags":[100,8,248,59,71,134,10,15,11,32,33,151,34,9],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/4345"}],"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=4345"}],"version-history":[{"count":7,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/4345\/revisions"}],"predecessor-version":[{"id":4590,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/4345\/revisions\/4590"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=4345"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=4345"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=4345"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}