{"id":4286,"date":"2018-07-24T19:24:22","date_gmt":"2018-07-24T17:24:22","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=4286"},"modified":"2022-03-26T11:30:10","modified_gmt":"2022-03-26T09:30:10","slug":"numero-medio","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/numero-medio\/","title":{"rendered":"N\u00famero medio"},"content":{"rendered":"<p>Un <strong>n\u00famero medio<\/strong> es n\u00famero natural que es igual a la media aritm\u00e9tica de las permutaciones de sus d\u00edgitos. Por ejemplo, 370 es un n\u00famero medio ya que las permutaciones de sus d\u00edgitos es 073, 037, 307, 370, 703 y 730 cuya media es 2220\/6 que es igual a 370.<\/p>\n<p>Definir las siguientes funciones<\/p>\n<pre lang=\"text\">\n   numeroMedio                :: Integer -> Bool\n   densidadesNumeroMedio      :: [Double]\n   graficaDensidadNumeroMedio :: Int -> IO ()\n<\/pre>\n<p>tales que<\/p>\n<ul>\n<li>(numeroMedio n) se verifica si n es un n\u00famero medio. Por ejemplo,<\/li>\n<\/ul>\n<pre lang=\"text\">\n      \u03bb> numeroMedio 370\n      True\n      \u03bb> numeroMedio 371\n      False\n      \u03bb> numeroMedio 485596707818930041152263374\n      True\n      \u03bb> filter numeroMedio [100..600]\n      [111,222,333,370,407,444,481,518,555,592]\n      \u03bb> filter numeroMedio [3*10^5..6*10^5]\n      [333333,370370,407407,444444,481481,518518,555555,592592]\n<\/pre>\n<ul>\n<li>densidades es la lista cuyo elemento n-\u00e9simo (empezando a contar en 1) es la densidad de n\u00fameros medios en el intervalo [1,n]; es decir, la cantidad de n\u00fameros medios menores o iguales que n dividida por n. Por ejemplo,<\/li>\n<\/ul>\n<pre lang=\"text\">\n      \u03bb> mapM_ print (take 30 densidades)\n      1.0\n      1.0\n      1.0\n      1.0\n      1.0\n      1.0\n      1.0\n      1.0\n      1.0\n      0.9\n      0.9090909090909091\n      0.8333333333333334\n      0.7692307692307693\n      0.7142857142857143\n      0.6666666666666666\n      0.625\n      0.5882352941176471\n      0.5555555555555556\n      0.5263157894736842\n      0.5\n      0.47619047619047616\n      0.5\n      0.4782608695652174\n      0.4583333333333333\n      0.44\n      0.4230769230769231\n      0.4074074074074074\n      0.39285714285714285\n      0.3793103448275862\n      0.36666666666666664\n<\/pre>\n<ul>\n<li>(graficaDensidadNumeroMedio n) dibuja la gr\u00e1fica de las densidades de<br \/>\n los intervalos [1,k] para k desde 1 hasta n. Por ejemplo, (graficaDensidadNumeroMedio 100) dibuja<br \/>\n<a href=\"https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2018\/07\/Numero_medio_100.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2018\/07\/Numero_medio_100.png?resize=640%2C480\" alt=\"\" width=\"640\" height=\"480\" class=\"aligncenter size-full wp-image-4289\" srcset=\"https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2018\/07\/Numero_medio_100.png?w=640&amp;ssl=1 640w, https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2018\/07\/Numero_medio_100.png?resize=300%2C225&amp;ssl=1 300w\" sizes=\"(max-width: 640px) 100vw, 640px\" data-recalc-dims=\"1\" \/><\/a><br \/>\ny (graficaDensidadNumeroMedio 1000) dibuja<br \/>\n<a href=\"https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2018\/07\/Numero_medio_1000.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2018\/07\/Numero_medio_1000.png?resize=640%2C480\" alt=\"\" width=\"640\" height=\"480\" class=\"aligncenter size-full wp-image-4290\" srcset=\"https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2018\/07\/Numero_medio_1000.png?w=640&amp;ssl=1 640w, https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2018\/07\/Numero_medio_1000.png?resize=300%2C225&amp;ssl=1 300w\" sizes=\"(max-width: 640px) 100vw, 640px\" data-recalc-dims=\"1\" \/><\/a><\/li>\n<\/ul>\n<h4>Soluciones<\/h4>\n<p>Puedes escribir tus soluciones en los comentarios o ver las soluciones propuestas pulsando [expand title=\u00bbaqu\u00ed\u00bb]<\/p>\n<pre lang=\"haskell\">\r\nimport Data.List (genericLength, permutations, foldl')\r\nimport Test.QuickCheck\r\nimport Graphics.Gnuplot.Simple \r\n\r\n-- 1\u00aa definici\u00f3n de numeroMedio\r\n-- ============================\r\n\r\nnumeroMedio :: Integer -> Bool\r\nnumeroMedio n =\r\n  n == media (map digitosAnumero (permutations (digitos n)))\r\n\r\n-- (digitos n) es la lista de los d\u00edgitos de n. Por ejemplo,\r\n--    digitos 425  ==  [4,2,5]\r\ndigitos :: Integer -> [Integer]\r\ndigitos n =\r\n  [read [c] | c <- show n]\r\n\r\n-- (digitosAnumero xs) es el n\u00famero cuya lista de d\u00edgitos es xs. Por\r\n-- ejemplo, \r\n--    digitosAnumero [4,2,5]  ==  425\r\n\r\n-- 1\u00aa definici\u00f3n de digitosAnumero\r\ndigitosAnumero1 :: [Integer] -> Integer\r\ndigitosAnumero1 = aux . reverse\r\n  where aux [] = 0\r\n        aux (x:xs) = x + 10 * aux xs\r\n\r\n-- 1\u00aa definici\u00f3n de digitosAnumero\r\ndigitosAnumero2 :: [Integer] -> Integer\r\ndigitosAnumero2 = foldl' (\\x y -> 10*x+y) 0\r\n\r\n-- Comparaci\u00f3n de eficiencia de definiciones de digitosAnumero\r\n--    \u03bb> length (show (digitosAnumero1 (replicate (10^5) 5)))\r\n--    100000\r\n--    (5.07 secs, 4,317,349,968 bytes)\r\n--    \u03bb> length (show (digitosAnumero2 (replicate (10^5) 5)))\r\n--    100000\r\n--    (0.67 secs, 4,288,054,592 bytes)\r\n\r\n-- Se usar\u00e1 la 2\u00aa definici\u00f3n de digitosAnumero\r\ndigitosAnumero :: [Integer] -> Integer\r\ndigitosAnumero = digitosAnumero2\r\n\r\n-- (media xs) es la media aritm\u00e9tica de la lista xs (se supone que su\r\n-- valor es entero). Por ejemplo,\r\n--    media [370,730,73,703,37,307]  ==  370\r\nmedia :: [Integer] -> Integer\r\nmedia xs = sum xs `div` genericLength xs\r\n\r\n-- 2\u00aa definici\u00f3n de numeroMedio\r\n-- ============================\r\n\r\nnumeroMedio2 :: Integer -> Bool\r\nnumeroMedio2 n =\r\n  (10^k-1)*s == 9*k*n\r\n  where xs = digitos n\r\n        k  = genericLength xs\r\n        s  = sum xs\r\n\r\n-- Equivalencia de las definiciones de numeroMedio\r\n-- ===============================================\r\n\r\n-- La propiedad es\r\nprop_numeroMedio :: Positive Integer -> Bool\r\nprop_numeroMedio (Positive n) =\r\n  numeroMedio n == numeroMedio2 n\r\n\r\n-- La comprobaci\u00f3n es\r\n--    \u03bb> quickCheck prop_numeroMedio\r\n--    +++ OK, passed 100 tests.\r\n\r\n-- Comparaci\u00f3n de eficiencia de las definiciones de numeroMedio\r\n-- ============================================================\r\n\r\n--    \u03bb> filter numeroMedio [10000..20000]\r\n--    [11111]\r\n--    (1.74 secs, 1,500,858,904 bytes)\r\n--    \u03bb> filter numeroMedio2 [10000..20000]\r\n--    [11111]\r\n--    (0.11 secs, 213,060,784 bytes)\r\n\r\n-- Definici\u00f3n de densidadesNumeroMedio\r\n-- ===================================\r\n\r\ndensidadesNumeroMedio :: [Double]\r\ndensidadesNumeroMedio = \r\n  [genericLength (filter numeroMedio2 [1..n]) \/ fromIntegral n | n <- [1..]]\r\n\r\n-- Definici\u00f3n de graficaDensidadNumeroMedio\r\n-- ========================================\r\n\r\ngraficaDensidadNumeroMedio :: Int -> IO ()\r\ngraficaDensidadNumeroMedio n =\r\n  plotList [ Title (\"graficaDensidadNumeroMedio\")\r\n           , Key Nothing\r\n           -- , PNG (\"Numero_medio_\" ++ show n ++ \".png\" )\r\n           , XRange (1, fromIntegral n)]\r\n           (take n densidadesNumeroMedio)\r\n<\/pre>\n<p>[\/expand]<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Un n\u00famero medio es n\u00famero natural que es igual a la media aritm\u00e9tica de las permutaciones de sus d\u00edgitos. Por ejemplo, 370 es un n\u00famero medio ya que las permutaciones de sus d\u00edgitos es 073, 037, 307, 370, 703 y 730 cuya media es 2220\/6 que es igual a 370. Definir las siguientes funciones numeroMedio&#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":[8,38,185,183,258,376,10,11,228,309,95,6,32,33,40,47,146],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/4286"}],"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=4286"}],"version-history":[{"count":4,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/4286\/revisions"}],"predecessor-version":[{"id":4288,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/4286\/revisions\/4288"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=4286"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=4286"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=4286"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}