{"id":7462,"date":"2022-10-27T06:00:05","date_gmt":"2022-10-27T04:00:05","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=7462"},"modified":"2022-12-14T12:22:59","modified_gmt":"2022-12-14T10:22:59","slug":"digitos-de-un-numero","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/digitos-de-un-numero\/","title":{"rendered":"D\u00edgitos de un n\u00famero"},"content":{"rendered":"<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   digitos :: Integer -> [Int]\n<\/pre>\n<p>tal que <code>digitos n<\/code> es la lista de los d\u00edgitos del n\u00famero <code>n<\/code>. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   digitos 320274  ==  [3,2,0,2,7,4]\n<\/pre>\n<p><b>Soluciones<\/b><\/p>\n<p>A continuaci\u00f3n se muestran las <a href=\"#haskell\">soluciones en Haskell<\/a> y las <a href=\"#python\">soluciones en Python<\/a>.<\/p>\n<p><a name=\"haskell\"><\/a><br \/>\n<b>Soluciones en Haskell<\/b><\/p>\n<pre lang=\"haskell\">\nimport Data.Char (digitToInt)\nimport qualified Data.Digits as D (digits)\nimport qualified Data.FastDigits as FD (digits)\nimport Test.QuickCheck\n\n-- 1\u00aa soluci\u00f3n\n-- ===========\n\ndigitos1 :: Integer -> [Int]\ndigitos1 n = map fromInteger (aux n)\n  where aux :: Integer -> [Integer]\n        aux m\n          | m < 10    = [m]\n          | otherwise = aux (m `div` 10) ++ [m `rem` 10]\n\n-- 2\u00aa soluci\u00f3n\n-- ===========\n\ndigitos2 :: Integer -> [Int]\ndigitos2 n = map fromInteger (reverse (aux n))\n  where aux :: Integer -> [Integer]\n        aux m\n          | m < 10    = [m]\n          | otherwise = (m `rem` 10) : aux (m `div` 10)\n\n-- 3\u00aa soluci\u00f3n\n-- ===========\n\ndigitos3 :: Integer -> [Int]\ndigitos3 n = map fromInteger (aux [] n)\n  where aux :: [Integer] -> Integer -> [Integer]\n        aux ds m\n          | m < 10    = m : ds\n          | otherwise = aux (m `rem` 10 : ds) (m `div` 10)\n\n-- 4\u00aa soluci\u00f3n\n-- ===========\n\ndigitos4 :: Integer -> [Int]\ndigitos4 n = [read [x] | x <- show n]\n\n-- 5\u00aa soluci\u00f3n\n-- ===========\n\ndigitos5 :: Integer -> [Int]\ndigitos5 n = map (\\ x -> read [x]) (show n)\n\n-- 6\u00aa soluci\u00f3n\n-- ===========\n\ndigitos6 :: Integer -> [Int]\ndigitos6 = map (read . return) . show\n\n-- 7\u00aa soluci\u00f3n\n-- ===========\n\ndigitos7 :: Integer -> [Int]\ndigitos7 n = map digitToInt (show n)\n\n-- 8\u00aa soluci\u00f3n\n-- ===========\n\ndigitos8 :: Integer -> [Int]\ndigitos8 = map digitToInt . show\n\n-- 9\u00aa soluci\u00f3n\n-- ===========\n\ndigitos9 :: Integer -> [Int]\ndigitos9 0 = [0]\ndigitos9 n = map fromInteger (D.digits 10 n)\n\n-- 10\u00aa soluci\u00f3n\n-- ===========\n\ndigitos10 :: Integer -> [Int]\ndigitos10 0 = [0]\ndigitos10 n = reverse (FD.digits 10 n)\n\n-- Comprobaci\u00f3n de equivalencia\n-- ============================\n\n-- La propiedad es\nprop_digitos :: NonNegative Integer -> Bool\nprop_digitos (NonNegative n) =\n  all (== digitos1 n)\n      [digitos2 n,\n       digitos3 n,\n       digitos4 n,\n       digitos5 n,\n       digitos6 n,\n       digitos7 n,\n       digitos8 n,\n       digitos9 n,\n       digitos10 n]\n\n-- La comprobaci\u00f3n es\n--    \u03bb> quickCheck prop_digitos\n--    +++ OK, passed 100 tests.\n\n-- Comparaci\u00f3n de eficiencia\n-- =========================\n\n-- La comparaci\u00f3n es\n--    \u03bb> n = product [1..5000]\n--    \u03bb> length (digitos1 n)\n--    16326\n--    (3.00 secs, 11,701,450,912 bytes)\n--    \u03bb> length (digitos2 n)\n--    16326\n--    (0.13 secs, 83,393,816 bytes)\n--    \u03bb> length (digitos3 n)\n--    16326\n--    (0.11 secs, 83,132,552 bytes)\n--    \u03bb> length (digitos4 n)\n--    16326\n--    (0.01 secs, 23,054,920 bytes)\n--    \u03bb> length (digitos5 n)\n--    16326\n--    (0.01 secs, 22,663,088 bytes)\n--    \u03bb> length (digitos6 n)\n--    16326\n--    (0.06 secs, 22,663,224 bytes)\n--    \u03bb> length (digitos7 n)\n--    16326\n--    (0.01 secs, 22,663,064 bytes)\n--    \u03bb> length (digitos8 n)\n--    16326\n--    (0.03 secs, 22,663,192 bytes)\n--    \u03bb> length (digitos9 n)\n--    16326\n--    (0.05 secs, 82,609,944 bytes)\n--    \u03bb> length (digitos10 n)\n--    16326\n--    (0.01 secs, 26,295,416 bytes)\n--\n--    \u03bb> n = product [1..5*10^4]\n--    \u03bb> length (digitos2 n)\n--    213237\n--    (10.17 secs, 12,143,633,056 bytes)\n--    \u03bb> length (digitos3 n)\n--    213237\n--    (10.54 secs, 12,140,221,216 bytes)\n--    \u03bb> length (digitos4 n)\n--    213237\n--    (1.29 secs, 2,638,199,328 bytes)\n--    \u03bb> length (digitos5 n)\n--    213237\n--    (2.48 secs, 2,633,081,632 bytes)\n--    \u03bb> length (digitos6 n)\n--    213237\n--    (2.59 secs, 2,633,081,600 bytes)\n--    \u03bb> length (digitos7 n)\n--    213237\n--    (2.55 secs, 2,633,081,608 bytes)\n--    \u03bb> length (digitos8 n)\n--    213237\n--    (2.49 secs, 2,633,081,600 bytes)\n--    \u03bb> length (digitos9 n)\n--    213237\n--    (7.07 secs, 12,133,397,456 bytes)\n--    \u03bb> length (digitos10 n)\n--    213237\n--    (2.47 secs, 2,725,182,064 bytes)\n<\/pre>\n<p>El c\u00f3digo se encuentra en <a href=\"https:\/\/github.com\/jaalonso\/Exercitium\/blob\/main\/src\/Digitos_de_un_numero.hs\">GitHub<\/a>.<\/p>\n<p><a name=\"python\"><\/a><br \/>\n<b>Soluciones en Python<\/b><\/p>\n<pre lang=\"python\">\nfrom math import factorial\nfrom sys import setrecursionlimit\nfrom timeit import Timer, default_timer\n\nfrom hypothesis import given\nfrom hypothesis import strategies as st\nfrom sympy.ntheory.digits import digits\n\nsetrecursionlimit(10**6)\n\n# 1\u00aa soluci\u00f3n\n# ===========\n\ndef digitos1(n: int) -> list[int]:\n    if n < 10:\n        return [n]\n    return digitos1(n \/\/ 10) + [n % 10]\n\n# 2\u00aa soluci\u00f3n\n# ===========\n\ndef digitos2(n: int) -> list[int]:\n    return [int(x) for x in str(n)]\n\n# 3\u00aa soluci\u00f3n\n# ===========\n\ndef digitos3(n: int) -> list[int]:\n    r: list[int] = []\n    for x in str(n):\n        r.append(int(x))\n    return r\n\n# 4\u00aa soluci\u00f3n\n# ===========\n\ndef digitos4(n: int) -> list[int]:\n    return list(map(int, list(str(n))))\n\n# 5\u00aa soluci\u00f3n\n# ===========\n\ndef digitos5(n: int) -> list[int]:\n    r: list[int] = []\n    while n > 0:\n        r = [n % 10] + r\n        n = n \/\/ 10\n    return r\n\n# 6\u00aa soluci\u00f3n\n# ===========\n\ndef digitos6(n: int) -> list[int]:\n    r: list[int] = []\n    while n > 0:\n        r.append(n % 10)\n        n = n \/\/ 10\n    return list(reversed(r))\n\n# 7\u00aa soluci\u00f3n\n# ===========\n\ndef digitos7(n: int) -> list[int]:\n    return digits(n)[1:]\n\n# Comprobaci\u00f3n de equivalencia\n# ============================\n\n# La propiedad es\n@given(st.integers(min_value=1))\ndef test_digitos(n: int) -> None:\n    r = digitos1(n)\n    assert digitos2(n) == r\n    assert digitos3(n) == r\n    assert digitos4(n) == r\n    assert digitos5(n) == r\n    assert digitos6(n) == r\n    assert digitos7(n) == r\n\n# La comprobaci\u00f3n es\n#    src> poetry run pytest -q digitos_de_un_numero.py\n#    1 passed in 0.49s\n\n# Comparaci\u00f3n de eficiencia\n# =========================\n\ndef tiempo(ex: str) -> None:\n    \"\"\"Tiempo (en segundos) de evaluar la expresi\u00f3n e.\"\"\"\n    t = Timer(ex, \"\", default_timer, globals()).timeit(1)\n    print(f\"{t:0.2f} segundos\")\n\n# La comparaci\u00f3n es\n#    >>> tiempo('digitos1(factorial(6000))')\n#    0.58 segundos\n#    >>> tiempo('digitos2(factorial(6000))')\n#    0.01 segundos\n#    >>> tiempo('digitos3(factorial(6000))')\n#    0.01 segundos\n#    >>> tiempo('digitos4(factorial(6000))')\n#    0.01 segundos\n#    >>> tiempo('digitos5(factorial(6000))')\n#    0.60 segundos\n#    >>> tiempo('digitos6(factorial(6000))')\n#    0.17 segundos\n#    >>> tiempo('digitos7(factorial(6000))')\n#    0.10 segundos\n#\n#    >>> tiempo('digitos2(factorial(2*10**4))')\n#    0.10 segundos\n#    >>> tiempo('digitos3(factorial(2*10**4))')\n#    0.10 segundos\n#    >>> tiempo('digitos4(factorial(2*10**4))')\n#    0.09 segundos\n#    >>> tiempo('digitos6(factorial(2*10**4))')\n#    2.33 segundos\n#    >>> tiempo('digitos7(factorial(2*10**4))')\n#    1.18 segundos\n#\n#    >>> tiempo('digitos2(factorial(10**5))')\n#    3.53 segundos\n#    >>> tiempo('digitos3(factorial(10**5))')\n#    3.22 segundos\n#    >>> tiempo('digitos4(factorial(10**5))')\n#    3.02 segundos\n<\/pre>\n<p>El c\u00f3digo se encuentra en <a href=\"https:\/\/github.com\/jaalonso\/Exercitium-Python\/blob\/main\/src\/digitos_de_un_numero.py\">GitHub<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Definir la funci\u00f3n digitos :: Integer -> [Int] tal que digitos n es la lista de los d\u00edgitos del n\u00famero n. Por ejemplo, digitos 320274 == [3,2,0,2,7,4] Soluciones A continuaci\u00f3n se muestran las soluciones en Haskell y las soluciones en Python. Soluciones en Haskell import Data.Char (digitToInt) import qualified Data.Digits as D (digits) import qualified&#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":[581],"tags":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/7462"}],"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=7462"}],"version-history":[{"count":3,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/7462\/revisions"}],"predecessor-version":[{"id":7661,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/7462\/revisions\/7661"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=7462"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=7462"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=7462"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}