{"id":4663,"date":"2019-02-01T06:00:35","date_gmt":"2019-02-01T04:00:35","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=4663"},"modified":"2019-02-08T10:44:01","modified_gmt":"2019-02-08T08:44:01","slug":"digitos-en-las-posiciones-pares-de-cuadrados","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/digitos-en-las-posiciones-pares-de-cuadrados\/","title":{"rendered":"D\u00edgitos en las posiciones pares de cuadrados"},"content":{"rendered":"<p>Definir las funciones<\/p>\n<pre lang=\"text\"> \n   digitosPosParesCuadrado    :: Integer -> ([Integer],Int)\n   invDigitosPosParesCuadrado :: ([Integer],Int) -> [Integer]\n<\/pre>\n<p>tales que<\/p>\n<ul>\n<li>(digitosPosParesCuadrado n) es el par formados por los d\u00edgitos de n\u00b2 en la posiciones pares y por el n\u00famero de d\u00edgitos de n\u00b2. Por ejemplo, <\/li>\n<\/ul>\n<pre lang=\"text\">   \n     digitosPosParesCuadrado 8     ==  ([6],2)\n     digitosPosParesCuadrado 14    ==  ([1,6],3)\n     digitosPosParesCuadrado 36    ==  ([1,9],4)\n     digitosPosParesCuadrado 116   ==  ([1,4,6],5)\n     digitosPosParesCuadrado 2019  ==  ([4,7,3,1],7)\n<\/pre>\n<ul>\n<li>(invDigitosPosParesCuadrado (xs,k)) es la lista de los n\u00fameros n tales que xs es la lista de los d\u00edgitos de n\u00b2 en la posiciones pares y k es el n\u00famero de d\u00edgitos de n\u00b2. Por ejemplo,<\/li>\n<\/ul>\n<pre lang=\"text\">   \n     invDigitosPosParesCuadrado ([6],2)             ==  [8]\n     invDigitosPosParesCuadrado ([1,6],3)           ==  [14]\n     invDigitosPosParesCuadrado ([1,9],4)           ==  [36]\n     invDigitosPosParesCuadrado ([1,4,6],5)         ==  [116,136]\n     invDigitosPosParesCuadrado ([4,7,3,1],7)       ==  [2019,2139,2231]\n     invDigitosPosParesCuadrado ([1,2],3)           ==  []\n     invDigitosPosParesCuadrado ([1,2],4)           ==  [32,35,39]\n     invDigitosPosParesCuadrado ([1,2,3,4,5,6],11)  ==  [115256,127334,135254]\n<\/pre>\n<p>Comprobar con QuickCheck que para todo entero positivo n se verifica que para todo entero positivo m, m pertenece a (invDigitosPosParesCuadrado (digitosPosParesCuadrado n)) si, y s\u00f3lo si, (digitosPosParesCuadrado m) es igual a (digitosPosParesCuadrado n)<\/p>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Test.QuickCheck\n\n-- Definici\u00f3n de digitosPosParesCuadrado\n-- =====================================\n\ndigitosPosParesCuadrado :: Integer -> ([Integer],Int)\ndigitosPosParesCuadrado n =\n  (digitosPosPares (n^2),length (show (n^2)))\n\n-- (digitosPosPares n) es la lista de los d\u00edgitos de n en posiciones\n-- pares. Por ejemplo,\n--    digitosPosPares 24012019  ==  [2,0,2,1]\ndigitosPosPares :: Integer -> [Integer]\ndigitosPosPares n = elementosPosPares (digitos n)\n\n-- (digitos n) es la lista de los d\u00edgitos de n. Por ejemplo,\n--    digitos 325  ==  [3,2,5]\ndigitos :: Integer -> [Integer]\ndigitos n = [read [c] | c <- show n]\n\n-- (elementosPosPares xs) es la lista de los elementos de xs en\n-- posiciones pares. Por ejemplo,\n--    elementosPosPares [3,2,5,7,6,4]  ==  [3,5,6]\nelementosPosPares :: [a] -> [a]\nelementosPosPares []       = []\nelementosPosPares [x]      = [x]\nelementosPosPares (x:_:zs) = x : elementosPosPares zs\n\n-- 1\u00aa definici\u00f3n de invDigitosPosParesCuadrado\n-- ========================================\n\ninvDigitosPosParesCuadrado :: ([Integer],Int) -> [Integer]\ninvDigitosPosParesCuadrado (xs, a) =\n  [x | x <- [ceiling (sqrt 10^(a-1))..ceiling (sqrt 10^a)]\n     , digitosPosParesCuadrado x == (xs,a)]\n\n-- 2\u00aa definici\u00f3n de invDigitosPosParesCuadrado\n-- ========================================\n\ninvDigitosPosParesCuadrado2 :: ([Integer],Int) -> [Integer]\ninvDigitosPosParesCuadrado2 x =\n  [n | n <- [a..b], digitosPosParesCuadrado n == x]\n  where a = floor (sqrt (fromIntegral (completaNum x 0)))\n        b = ceiling (sqrt (fromIntegral (completaNum x 9)))\n\n-- (completaNum (xs,k) n) es el n\u00famero cuyos d\u00edgitos en las posiciones\n-- pares son los de xs y los de las posiciones impares son iguales a n\n-- (se supone que k es igual al doble de la longitud de xs o un\n-- menos). Por ejemplo, \n--    completaNum ([1,3,8],5) 4  ==  14348\n--    completaNum ([1,3,8],6) 4  ==  143484\ncompletaNum :: ([Integer],Int) -> Integer -> Integer\ncompletaNum x n = digitosAnumero (completa x n)\n\n-- (completa (xs,k) n) es la lista cuyos elementos en las posiciones\n-- pares son los de xs y los de las posiciones impares son iguales a n\n-- (se supone que k es igual al doble de la longitud de xs o un\n-- menos). Por ejemplo, \n--    completa ([1,3,8],5) 4  ==  [1,4,3,4,8]\n--    completa ([1,3,8],6) 4  ==  [1,4,3,4,8,4]\ncompleta :: ([Integer],Int) -> Integer -> [Integer]\ncompleta (xs,k) n\n  | even k    = ys\n  | otherwise = init ys\n  where ys = concat [[x,n] | x <- xs]\n\n-- (digitosAnumero ds) es el n\u00famero cuyos d\u00edgitos son ds. Por ejemplo,\n--    digitosAnumero [2,0,1,9]  ==  2019\ndigitosAnumero :: [Integer] -> Integer\ndigitosAnumero = read . concatMap show\n\n-- Comparaci\u00f3n de eficiencia\n-- =========================\n\n--    \u03bb> invDigitosPosParesCuadrado ([1,2,1,5,7,4,9],13)\n--    [1106393,1234567,1314597]\n--    (7.55 secs, 13,764,850,536 bytes)\n--    \u03bb> invDigitosPosParesCuadrado2 ([1,2,1,5,7,4,9],13)\n--    [1106393,1234567,1314597]\n--    (1.96 secs, 3,780,368,816 bytes)\n\n-- Comprobaci\u00f3n de la propiedad\n-- ============================\n\n-- La propiedad es  \nprop_digitosPosParesCuadrado :: Positive Integer -> Positive Integer -> Bool\nprop_digitosPosParesCuadrado (Positive n) (Positive m) =\n  (digitosPosParesCuadrado m == x)\n  == (m `elem` invDigitosPosParesCuadrado x)\n  where x = digitosPosParesCuadrado n\n\n-- La comprobaci\u00f3n es\n--    \u03bb> quickCheck prop_digitosPosParesCuadrado\n--    +++ OK, passed 100 tests.\n<\/pre>\n<h4>Pensamiento<\/h4>\n<blockquote><p>\n\u00a1Ojos que a la luz se abrieron<br \/>\nun d\u00eda para, despu\u00e9s,<br \/>\nciegos tornar a la tierra,<br \/>\nhartos de mirar sin ver.<\/p>\n<p>Antonio Machado\n<\/p><\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>Definir las funciones digitosPosParesCuadrado :: Integer -> ([Integer],Int) invDigitosPosParesCuadrado :: ([Integer],Int) -> [Integer] tales que (digitosPosParesCuadrado n) es el par formados por los d\u00edgitos de n\u00b2 en la posiciones pares y por el n\u00famero de d\u00edgitos de n\u00b2. Por ejemplo, digitosPosParesCuadrado 8 == ([6],2) digitosPosParesCuadrado 14 == ([1,6],3) digitosPosParesCuadrado 36 == ([1,9],4) digitosPosParesCuadrado 116 ==&#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":[322,8,58,26,91,282,183,285,28,11,95,6,33,236,146],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/4663"}],"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=4663"}],"version-history":[{"count":3,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/4663\/revisions"}],"predecessor-version":[{"id":4699,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/4663\/revisions\/4699"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=4663"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=4663"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=4663"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}