{"id":1647,"date":"2011-11-01T08:09:10","date_gmt":"2011-11-01T08:09:10","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/?p=1647"},"modified":"2013-03-08T05:49:01","modified_gmt":"2013-03-08T05:49:01","slug":"cuadrados-mediante-concatenacion-de-cuadrados-en-haskell","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/cuadrados-mediante-concatenacion-de-cuadrados-en-haskell\/","title":{"rendered":"Cuadrados mediante concatenaci\u00f3n de cuadrados en Haskell"},"content":{"rendered":"<p>La semana pasada, <a href=\"http:\/\/twitter.com\/#!\/republicofmath\">@republicofmath<\/a> plante\u00f3 en twitter la siguiente <a href=\"http:\/\/bit.ly\/smOp5F\">pregunta<\/a><\/p>\n<blockquote><p>\n4=2^2, 9=3^2, 4||9 = 49 = 7^2. 16=4^2, 81=9^2, 16||81= 1681=41^2. Others?\n<\/p><\/blockquote>\n<p>donde x||y es el n\u00famero obtenido concatenando las cifras de x e y. A partir de esta pregunta he elaborado la siguiente relaci\u00f3n de ejercicios para la asignatura de <a href=\"http:\/\/www.cs.us.es\/~jalonso\/cursos\/i1m-11\">Inform\u00e1tica de 1\u00ba del Grado en Matem\u00e1ticas<\/a><br \/>\n<!--more--><\/p>\n<pre lang=\"haskell\">\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 1.1. Definir la funci\u00f3n \r\n--    longitud :: Integer -> Integer\r\n-- tal que (longitud x) es el n\u00famero de cifras del n\u00famero x. Por\r\n-- ejemplo, \r\n--    longitud 3252  ====  4\r\n-- Indicaci\u00f3n: Usar las funciones floor y log tales que (floor x) es la\r\n-- parte entera de x y (log x) es el logaritmo neperiano de x.\r\n-- ---------------------------------------------------------------------\r\n\r\nlongitud :: Integer -> Integer\r\nlongitud x = 1 + floor ((log x') \/ (log 10))\r\n             where x' = fromIntegral x \r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 1.2. Definir la funci\u00f3n \r\n--    concatenacion :: Integer -> Integer -> Integer\r\n-- tal que (concatenacion x y) es el n\u00famero obtenido concatenando los\r\n-- n\u00fameros x e y. Por ejemplo,\r\n--    concatenacion 3252 476  ==  3252476\r\n-- ---------------------------------------------------------------------\r\n\r\n-- 1\u00aa definici\u00f3n (mediante aritm\u00e9tica):\r\nconcatenacion_1 :: Integer -> Integer -> Integer\r\nconcatenacion_1 x y = floor (p*10^(longitud y)+q)\r\n    where p = fromIntegral x\r\n          q = fromIntegral y\r\n\r\n-- 2\u00aa definici\u00f3n (mediante cadenas):\r\nconcatenacion_2 :: Integer -> Integer -> Integer\r\nconcatenacion_2 x y = read (show x ++ show y)\r\n\r\n-- En lo que sigue, usamos la 1\u00aa\r\nconcatenacion :: Integer -> Integer -> Integer\r\nconcatenacion = concatenacion_1\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 1.3. Definir la funci\u00f3n \r\n--    esCuadrado :: Integer -> Bool\r\n-- tal que (esCuadrado x) se verifica si  x es un cuadrado perfecto; es\r\n-- decir, si existe un y tal que y^2 es igual a x. Por ejemplo, \r\n--    esCuadrado 16  ==  True\r\n--    esCuadrado 17  ==  False\r\n-- ---------------------------------------------------------------------\r\n\r\nesCuadrado :: Integer -> Bool\r\nesCuadrado x = y^2 == x\r\n               where y = round (sqrt (fromIntegral x))\r\n\r\n-- Otra soluci\u00f3n, menos eficiente, es\r\nesCuadrado' :: Integer -> Bool\r\nesCuadrado' x = \r\n    [y | y <- [1..x], y^2 == x] \/= []\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 1.4. Definir la constante \r\n--    cuadrados :: [Integer]\r\n-- de forma que su valor es lista de los n\u00fameros que son cuadrados\r\n-- perfectos. Por ejemplo, \r\n--    take 5 cuadrados  ==  [1,4,9,16,25]\r\n-- ---------------------------------------------------------------------\r\n\r\ncuadrados :: [Integer]\r\ncuadrados = [x | x <- [1..], esCuadrado x]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 1.5. Definir la constante \r\n--    cuadradosConcatenados :: [(Integer,Integer,Integer)]\r\n-- de forma que su valor es la lista de ternas (x,y,z) de tres cuadrados\r\n-- perfectos tales que z es la concatenaci\u00f3n de x e y. Por ejemplo,\r\n--   ghci> take 10 cuadradosConcatenados\r\n--   [(4,9,49),(16,81,1681),(36,100,36100),(1,225,1225),(4,225,4225),\r\n--    (81,225,81225),(144,400,144400),(225,625,225625),(49,729,49729),\r\n--    (4,900,4900)]\r\n-- ---------------------------------------------------------------------\r\n\r\ncuadradosConcatenados :: [(Integer,Integer,Integer)]\r\ncuadradosConcatenados =\r\n    [(x,y,concatenacion x y) | y <- cuadrados, \r\n                               x <- [1..y], \r\n                               esCuadrado x,     \r\n                               esCuadrado (concatenacion x y)] \r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>La semana pasada, @republicofmath plante\u00f3 en twitter la siguiente pregunta 4=2^2, 9=3^2, 4||9 = 49 = 7^2. 16=4^2, 81=9^2, 16||81= 1681=41^2. Others? donde x||y es el n\u00famero obtenido concatenando las cifras de x e y. A partir de esta pregunta he elaborado la siguiente relaci\u00f3n de ejercicios para la asignatura de Inform\u00e1tica de 1\u00ba del&#8230;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","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":[270],"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\/1647"}],"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=1647"}],"version-history":[{"count":6,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/1647\/revisions"}],"predecessor-version":[{"id":2925,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/1647\/revisions\/2925"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=1647"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=1647"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=1647"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}