{"id":7153,"date":"2022-07-26T06:00:09","date_gmt":"2022-07-26T04:00:09","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=7153"},"modified":"2022-07-19T14:06:27","modified_gmt":"2022-07-19T12:06:27","slug":"numeros-belgas","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/numeros-belgas\/","title":{"rendered":"N\u00fameros belgas"},"content":{"rendered":"<p>Un n\u00famero n es <strong>k-belga<\/strong> si la sucesi\u00f3n cuyo primer elemento es k y  cuyos elementos se obtienen sumando reiteradamente las cifras de n contiene a n.<\/p>\n<p>El 18 es 0-belga, porque a partir del 0 vamos a ir sumando sucesivamente 1, 8, 1, 8, &#8230; hasta llegar o sobrepasar el 18: 0, 1, 9, 10, 18, &#8230; Como se alcanza el 18, resulta que el 18 es 0-belga.<\/p>\n<p>El 19 no es 1-belga, porque a partir del 1 vamos a ir  sucesivamente 1, 9, 1, 9, &#8230; hasta llegar o sobrepasar el 18: 0, 1, 10, 11, 20, 21, &#8230; Como no se alcanza el 19, resulta que el 19 no es 1-belga.<\/p>\n<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   esBelga :: Int -> Int -> Bool\n<\/pre>\n<p>tal que (esBelga k n)  se verifica si n es k-belga. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   esBelga 0 18                              ==  True\n   esBelga 1 19                              ==  False\n   esBelga 0 2016                            ==  True\n   [x | x <- [0..30], esBelga 7 x]           ==  [7,10,11,21,27,29]\n   [x | x <- [0..30], esBelga 10 x]          ==  [10,11,20,21,22,24,26]\n   length [n | n <- [1..10^6], esBelga 0 n]  ==  272049\n<\/pre>\n<p>Comprobar con QuickCheck que para todo n\u00famero entero positivo n, si k es el resto de n entre la suma de los d\u00edgitos de n, entonces n es k-belga.<\/p>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Data.Char (digitToInt)\nimport Test.QuickCheck (Positive (Positive), quickCheck)\n\n-- 1\u00aa soluci\u00f3n\n-- ===========\n\nesBelga1 :: Int -> Int -> Bool\nesBelga1 k n =\n  n == head (dropWhile (<n) (scanl (+) k (cycle (digitos n))))\n\ndigitos :: Int -> [Int]\ndigitos n = map digitToInt (show n)\n\n-- 2\u00aa soluci\u00f3n\n-- ===========\n\nesBelga2 :: Int -> Int -> Bool\nesBelga2 k n =\n  k <= n &#038;&#038; n == head (dropWhile (<n) (scanl (+) (k + q * s) ds))\n  where ds = digitos n\n        s  = sum ds\n        q  = (n - k) `div` s\n\n-- Equivalencia\n-- ============\n\n-- La propiedad es\nprop_esBelga :: Positive Int -> Positive Int -> Bool\nprop_esBelga (Positive k) (Positive n) = \n  esBelga1 k n == esBelga2 k n\n\n-- La comprobaci\u00f3n es\n--    \u03bb> quickCheck prop_esBelga\n--    +++ OK, passed 100 tests.\n\n-- Comparaci\u00f3n de eficiencia\n-- =========================\n\n-- La comparaci\u00f3n es\n--    \u03bb> length [n | n <- [1..2*10^4], esBelga1 0 n]\n--    6521\n--    (6.27 secs, 6,508,102,192 bytes)\n--    \u03bb> length [n | n <- [1..2*10^4], esBelga2 0 n]\n--    6521\n--    (0.07 secs, 46,741,144 bytes)\n\n-- Verificaci\u00f3n de la propiedad\n-- ============================\n\n-- La propiedad es\nprop_Belga :: Positive Int -> Bool\nprop_Belga (Positive n) = \n  esBelga2 k n\n  where k = n `mod` sum (digitos n)\n\n-- La comprobaci\u00f3n es\n--    \u03bb> quickCheck prop_Belga\n--    +++ OK, passed 100 tests.\n<\/pre>\n<h4>Referencias<\/h4>\n<p>Basado en el art\u00edculo <a href=\"http:\/\/bit.ly\/1n49fPh\">N\u00fameros belgas<\/a> del blog <a href=\"http:\/\/hojaynumeros.blogspot.com.es\">N\u00fameros y hoja de c\u00e1lculo<\/a> de <a href=\"http:\/\/bit.ly\/1nrlV3l\">Antonio Rold\u00e1n Mart\u00ednez<\/a>.<\/p>\n<p>El c\u00f3digo se encuentra en <a href=\"https:\/\/github.com\/jaalonso\/Exercitium\/blob\/main\/src\/Numeros_belgas.hs\">GitHub<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Un n\u00famero n es k-belga si la sucesi\u00f3n cuyo primer elemento es k y cuyos elementos se obtienen sumando reiteradamente las cifras de n contiene a n. El 18 es 0-belga, porque a partir del 0 vamos a ir sumando sucesivamente 1, 8, 1, 8, &#8230; hasta llegar o sobrepasar el 18: 0, 1, 9,&#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":[2],"tags":[521],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/7153"}],"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=7153"}],"version-history":[{"count":1,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/7153\/revisions"}],"predecessor-version":[{"id":7154,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/7153\/revisions\/7154"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=7153"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=7153"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=7153"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}