{"id":5254,"date":"2016-01-08T15:46:43","date_gmt":"2016-01-08T14:46:43","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/?p=5254"},"modified":"2016-01-09T11:48:34","modified_gmt":"2016-01-09T10:48:34","slug":"i1m2015-el-triangulo-de-floyd","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/i1m2015-el-triangulo-de-floyd\/","title":{"rendered":"I1M2015: El tri\u00e1ngulo de Floyd"},"content":{"rendered":"<p>En la primera parte de la clase de hoy de <a href=\"http:\/\/www.cs.us.es\/~jalonso\/cursos\/i1m-15\">Inform\u00e1tica de 1\u00ba del Grado en Matem\u00e1ticas<\/a> hemos comentando las soluciones del 9\u00ba ejercicio de la 14\u00aa relaci\u00f3n sobre el tri\u00e1ngulo de Floyd.<\/p>\n<p>Los ejercicios, y sus soluciones, se muestran a continuaci\u00f3n.<br \/>\n<!--more--><\/p>\n<pre lang=\"haskell\">\n-- ---------------------------------------------------------------------\n-- \u00a7 El tri\u00e1ngulo de Floyd                                            --\n-- ---------------------------------------------------------------------\n\n-- El tri\u00e1ngulo de Floyd, llamado as\u00ed en honor a Robert Floyd, es un\n-- tri\u00e1ngulo rect\u00e1ngulo formado con n\u00fameros naturales. Para crear un\n-- tri\u00e1ngulo de Floyd, se comienza con un 1 en la esquina superior\n-- izquierda, y se contin\u00faa escribiendo la secuencia de los n\u00fameros\n-- naturales de manera que cada l\u00ednea contenga un n\u00famero m\u00e1s que la\n-- anterior. Las 5 primeras l\u00edneas del tri\u00e1ngulo de Floyd son\n--     1\n--     2   3\n--     4   5   6\n--     7   8   9  10\n--    11  12  13  14  15\n-- \n-- El tri\u00e1ngulo de Floyd tiene varias propiedades matem\u00e1ticas\n-- interesantes. Los n\u00fameros del cateto de la parte izquierda forman la\n-- secuencia de los n\u00fameros poligonales centrales, mientras que los de\n-- la hipotenusa nos dan el conjunto de los n\u00fameros triangulares.\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 9.1. Definir la funci\u00f3n\n--    siguienteF :: [Integer] -> [Integer]\n-- tal que (siguienteF xs) es la lista de los elementos de la l\u00ednea xs en\n-- el tri\u00e1ngulo de Lloyd. Por ejemplo,\n--    siguienteF [2,3]    ==  [4,5,6]\n--    siguienteF [4,5,6]  ==  [7,8,9,10]\n-- ---------------------------------------------------------------------\n\nsiguienteF :: [Integer] -> [Integer]\nsiguienteF xs = [a..a+n]\n    where a = 1+last xs\n          n = genericLength xs\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 9.2. Definir la funci\u00f3n        \n--    trianguloFloyd :: [[Integer]]\n-- tal que trianguloFloyd es el tri\u00e1ngulo de Floyd. Por ejemplo,\n--    ghci> take 4 trianguloFloyd\n--    [[1],\n--     [2,3],\n--     [4,5,6],\n--     [7,8,9,10]]\n-- ---------------------------------------------------------------------\n\ntrianguloFloyd :: [[Integer]]\ntrianguloFloyd = iterate siguienteF [1]\n\n-- Filas del tri\u00e1ngulo de Floyd\n-- ============================\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 9.3. Definir la funci\u00f3n\n--    filaTrianguloFloyd :: Integer -> [Integer]\n-- tal que (filaTrianguloFloyd n) es la fila n-\u00e9sima del tri\u00e1ngulo de\n-- Floyd. Por ejemplo,  \n--    filaTrianguloFloyd 3  ==  [4,5,6]\n--    filaTrianguloFloyd 4  ==  [7,8,9,10]\n-- ---------------------------------------------------------------------\n\nfilaTrianguloFloyd :: Integer -> [Integer]\nfilaTrianguloFloyd n = trianguloFloyd `genericIndex` (n-1)\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 9.4. Definir la funci\u00f3n\n--    sumaFilaTrianguloFloyd :: Integer -> Integer\n-- tal que (sumaFilaTrianguloFloyd n) es la suma de los fila n-\u00e9sima del\n-- tri\u00e1ngulo de Floyd. Por ejemplo,\n--    sumaFilaTrianguloFloyd 1  ==  1\n--    sumaFilaTrianguloFloyd 2  ==  5\n--    sumaFilaTrianguloFloyd 3  ==  15\n--    sumaFilaTrianguloFloyd 4  ==  34\n--    sumaFilaTrianguloFloyd 5  ==  65\n-- ---------------------------------------------------------------------\n\nsumaFilaTrianguloFloyd :: Integer -> Integer\nsumaFilaTrianguloFloyd = sum . filaTrianguloFloyd\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 9.5. A partir de los valores de (sumaFilaTrianguloFloyd n)\n-- para n entre 1 y 5, conjeturar una f\u00f3rmula para calcular\n-- (sumaFilaTrianguloFloyd n). \n-- ---------------------------------------------------------------------\n\n-- Usando Wolfram Alpha (como se indica en http:\/\/wolfr.am\/19XAl2X )\n-- a partir de 1, 5, 15, 34, 65, ... se obtiene la f\u00f3rmula\n--    (n^3+n)\/2\n\n-- ---------------------------------------------------------------------\n-- Ejecicio 6. Comprobar con QuickCheck la conjetura obtenida en el\n-- ejercicio anterior.\n-- ---------------------------------------------------------------------\n\n-- La conjetura es\nprop_sumaFilaTrianguloFloyd :: Integer -> Property\nprop_sumaFilaTrianguloFloyd n =        \n    n > 0 ==> sum (filaTrianguloFloyd n) == (n^3+n) `div` 2\n  \n-- La comprobaci\u00f3n es\n--    ghci> quickCheck prop_sumaFilaTrianguloFloyd\n--    +++ OK, passed 100 tests.\n\n-- Hipotenusa del tri\u00e1ngulo de Floyd y n\u00fameros triangulares\n-- ========================================================\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 9.7. Definir la funci\u00f3n\n--    hipotenusaFloyd :: [Integer]\n-- tal que hipotenusaFloyd es la lista de los elementos de la hipotenusa\n-- del tri\u00e1ngulo de Floyd. Por ejemplo, \n--    take 5 hipotenusaFloyd  ==  [1,3,6,10,15]\n-- ---------------------------------------------------------------------\n\nhipotenusaFloyd :: [Integer]\nhipotenusaFloyd = map last trianguloFloyd\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 9.9. Definir la funci\u00f3n \n--    prop_hipotenusaFloyd :: Int -> Bool\n-- tal que (prop_hipotenusaFloyd n) se verifica si los n primeros\n-- elementos de la hipotenusa del tri\u00e1ngulo de Floyd son los primeros n\n-- n\u00fameros triangulares. \n-- \n-- Comprobar la propiedad para los 1000 primeros elementos.\n-- ---------------------------------------------------------------------\n\n-- La propiedad es\nprop_hipotenusaFloyd :: Int -> Bool\nprop_hipotenusaFloyd n = \n    take n hipotenusaFloyd == take n triangulares\n\n-- La comprobaci\u00f3n es\n--    ghci> prop_hipotenusaFloyd 1000\n--    True\n\n-- Cateto del tri\u00e1ngulo de Floyd y n\u00fameros poligonales centrales\n-- =============================================================\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 9.10. Definir la funci\u00f3n\n--    catetoFloyd :: [Integer]\n-- tal que catetoFloyd es la lista de los elementos del cateto izquierdo\n-- del tri\u00e1ngulo de Floyd. Por ejemplo, \n--    take 5 catetoFloyd  ==  [1,2,4,7,11]\n-- ---------------------------------------------------------------------\n\ncatetoFloyd :: [Integer]\ncatetoFloyd = map head trianguloFloyd\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 9.11. El n-\u00e9simo n\u00famero poligonal centrado es el m\u00e1ximo\n-- n\u00famero de piezas que se pueden obtener a partir de un c\u00edrculo con n\n-- l\u00edneas rectas. Por ejemplo,\n--    poligonales_centrados.jpg\n--\n-- Definir la funci\u00f3n\n--    poligonalCentrado :: Integer -> Integer\n-- tal que (poligonalCentrado n) es el n-\u00e9simo n\u00famero poligonal\n-- centrado. Por ejemplo, \n--    [poligonalCentrado n | n <- [0..5]]  ==  [1,2,4,7,11,16]\n-- ---------------------------------------------------------------------\n\npoligonalCentrado :: Integer -> Integer\npoligonalCentrado 0 = 1\npoligonalCentrado n = n + poligonalCentrado (n-1)\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 9.12. Definir la funci\u00f3n\n--    poligonalesCentrados :: [Integer]\n-- tal que poligonalesCentrados es la lista de los n\u00fameros poligonales\n-- centrados. Por ejemplo, \n--    take 10 poligonalesCentrados  ==  [1,3,6,10,15,21,28,36,45,55]\n-- ---------------------------------------------------------------------\n\n-- 1\u00aa definici\u00f3n:\npoligonalesCentrados1 :: [Integer]\npoligonalesCentrados1 = [poligonalCentrado n | n <- [0..]]\n\n-- 2\u00aa definici\u00f3n (usando scanl):\npoligonalesCentrados :: [Integer]\npoligonalesCentrados = scanl (+) 1 [1..]\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 9.13. Definir la funci\u00f3n \n--    prop_catetoFloyd :: Int -> Bool\n-- tal que (prop_catetoFloyd n) se verifica si los n primeros\n-- elementos del cateto izquierdo del tri\u00e1ngulo de Floy son los primeros\n-- n n\u00fameros poligonales centrados.\n-- \n-- Comprobar la propiedad para los 1000 primeros elementos.\n-- ---------------------------------------------------------------------\n\n-- La propiedad es\nprop_catetoFloyd :: Int -> Bool\nprop_catetoFloyd n = \n    take n catetoFloyd == take n poligonalesCentrados\n\n-- La comprobaci\u00f3n es\n--    ghci> prop_catetoFloyd 1000\n--    True\n<\/pre>\n<p>El c\u00f3digo anterior se encuentra tambi\u00e9n en <a href=\"https:\/\/github.com\/jaalonso\/I1M-Ejercicios\/blob\/master\/Ejercicios\/Rel_14_sol.hs\">GitHub<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En la primera parte de la clase de hoy de Inform\u00e1tica de 1\u00ba del Grado en Matem\u00e1ticas hemos comentando las soluciones del 9\u00ba ejercicio de la 14\u00aa relaci\u00f3n sobre el tri\u00e1ngulo de Floyd. Los ejercicios, y sus soluciones, se muestran a continuaci\u00f3n.<\/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":[250],"tags":[270,310],"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\/5254"}],"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=5254"}],"version-history":[{"count":1,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/5254\/revisions"}],"predecessor-version":[{"id":5255,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/5254\/revisions\/5255"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=5254"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=5254"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=5254"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}