{"id":4018,"date":"2014-01-20T20:31:53","date_gmt":"2014-01-20T19:31:53","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/?p=4018"},"modified":"2014-01-20T20:31:53","modified_gmt":"2014-01-20T19:31:53","slug":"peh-la-sucesion-de-kolakoski","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/peh-la-sucesion-de-kolakoski\/","title":{"rendered":"PeH: La sucesi\u00f3n de Kolakoski"},"content":{"rendered":"<p>Dada una sucesi\u00f3n, su contadora es la sucesi\u00f3n de las longitudes de de sus bloque de elementos consecutivos iguales. Por ejemplo, la sucesi\u00f3n contadora de abbaaabbba es 12331; es decir; 1 vez la a, 2 la b, 3 la a, 3 la b y 1 la a.<\/p>\n<p>La <a href=\"http:\/\/en.wikipedia.org\/wiki\/Kolakoski_sequence\">sucesi\u00f3n de Kolakoski<\/a> es una sucesi\u00f3n infinita de los s\u00edmbolos 1 y 2 que es su propia contadora. Los primeros t\u00e9rminos de la sucesi\u00f3n de Kolakoski son 1221121221221&#8230; que coincide con su contadora (es decir, 1 vez el 1, 2 veces el 2, 2 veces el 1, &#8230;). <\/p>\n<p>En la siguiente relaci\u00f3n (para la asignatura de <a href=\"http:\/\/www.cs.us.es\/~jalonso\/cursos\/i1m\">Inform\u00e1tica de 1\u00ba del Grado en Matem\u00e1ticas<\/a> y para la siguiente versi\u00f3n del libro <a href=\"http:\/\/www.cs.us.es\/~jalonso\/publicaciones\/Piensa_en_Haskell.pdf\">Piensa en Haskell<\/a>) se define la sucesi\u00f3n de Kolakoski.<br \/>\n<!--more--><\/p>\n<pre lang=\"haskell\">\r\n-- ---------------------------------------------------------------------\r\n-- \u00a7 Librer\u00edas auxiliares                                             --\r\n-- ---------------------------------------------------------------------\r\n\r\nimport Data.List (group)\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 1. Dados los s\u00edmbolos a y b, la sucesi\u00f3n contadora de\r\n--    abbaaabbba... =  a bb aaa bbb a ...  \r\n-- es\r\n--    1233...       =  1 2  3   3...\r\n-- es decir; 1 vez la a, 2 la b, 3 la a, 3 la b, 1 la a, ...\r\n--    contadora \"abbaaabbb\"        ==  [1,2,3,3]\r\n--    contadora \"122112122121121\"  ==  [1,2,2,1,1,2,1,1,2,1,1]\r\n-- ---------------------------------------------------------------------\r\n\r\n-- 1\u00aa definici\u00f3n (usando group definida en Data.List)\r\ncontadora :: Eq a => [a] -> [Int]\r\ncontadora xs = map length (group xs)\r\n\r\n-- 2\u00aa definici\u00f3n (por recursi\u00f3n sin group):\r\ncontadora2 :: Eq a => [a] -> [Int]\r\ncontadora2 [] = []\r\ncontadora2 ys@(x:xs) = \r\n    length (takeWhile (==x) ys) : contadora2 (dropWhile (==x) xs)\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 2. Definir la funci\u00f3n\r\n--    contada :: [Int] -> [a] -> [a]\r\n-- tal que (contada ns xs) es la sucesi\u00f3n formada por los s\u00edmbolos de xs\r\n-- cuya contadora es ns. Por ejemplo,\r\n--    contada [1,2,3,3] \"ab\"                ==  \"abbaaabbb\"\r\n--    contada [1,2,3,3] \"abc\"               ==  \"abbcccaaa\"\r\n--    contada [1,2,2,1,1,2,1,1,2,1,1] \"12\"  ==  \"122112122121121\"\r\n-- ---------------------------------------------------------------------\r\n\r\ncontada :: [Int] -> [a] -> [a]\r\ncontada (n:ns) (x:xs) = replicate n x ++ contada ns (xs++[x])\r\ncontada []     _      = []\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 3. La sucesi\u00f3n autocontadora (o sucesi\u00f3n de  Kolakoski) es\r\n-- la sucesi\u00f3n xs formada por 1 y 2 tal que coincide con su contada; es\r\n-- decir (contadora xs) == xs. Los primeros t\u00e9rminos de la funci\u00f3n\r\n-- autocontadora son\r\n--    1221121221221... = 1 22 11 2 1 22 1 22 11 ...\r\n-- y su contadora es\r\n--    122112122...     = 1 2  2  1 1 2  1 2  2...\r\n-- que coincide con la inicial. \r\n-- \r\n-- Definir la funci\u00f3n\r\n--    autocontadora :: [Int]\r\n-- tal que autocontadora es la sucesi\u00f3n autocondadora con los n\u00fameros 1\r\n-- y 2. Por ejemplo,\r\n--    take 11 autocontadora  ==  [1,2,2,1,1,2,1,1,2,1,1]\r\n--    take 12 autocontadora  ==  [1,2,2,1,1,2,1,1,2,1,1,2]\r\n-- ---------------------------------------------------------------------\r\n\r\n-- 1\u00aa soluci\u00f3n\r\nautocontadora :: [Int]\r\nautocontadora = [1,2] ++ siguiente [2] 2\r\n\r\n-- Los pasos lo da la funci\u00f3n siguiente. Por ejemplo,\r\n--    take 3 (siguiente [2] 2)            ==  [2,1,1]\r\n--    take 4 (siguiente [2,1,1] 1)        ==  [2,1,1,2]\r\n--    take 6 (siguiente [2,1,1,2] 2)      ==  [2,1,1,2,1,1]\r\n--    take 7 (siguiente [2,1,1,2,1,1] 1)  ==  [2,1,1,2,1,1,2]\r\nsiguiente (x:xs) y = x : siguiente (xs ++ (nuevos x)) y'\r\n    where contrario 1 = 2\r\n          contrario 2 = 1\r\n          y'          = contrario y              \r\n          nuevos 1    = [y']\r\n          nuevos 2    = [y',y'] \r\n\r\n-- 2\u00aa soluci\u00f3n (usando contada)\r\nautocontadora2 :: [Int]\r\nautocontadora2 = 1 : 2: xs \r\n    where xs = 2 : contada xs [1,2]\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Dada una sucesi\u00f3n, su contadora es la sucesi\u00f3n de las longitudes de de sus bloque de elementos consecutivos iguales. Por ejemplo, la sucesi\u00f3n contadora de abbaaabbba es 12331; es decir; 1 vez la a, 2 la b, 3 la a, 3 la b y 1 la a. La sucesi\u00f3n de Kolakoski es una sucesi\u00f3n infinita&#8230;<\/p>\n","protected":false},"author":2,"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":[221],"tags":[270,279,299],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_likes_enabled":false,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/4018"}],"collection":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/comments?post=4018"}],"version-history":[{"count":1,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/4018\/revisions"}],"predecessor-version":[{"id":4019,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/4018\/revisions\/4019"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=4018"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=4018"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=4018"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}