<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?action=history&amp;feed=atom&amp;title=Examen_16%2F02%2F21</id>
	<title>Examen 16/02/21 - Historial de revisiones</title>
	<link rel="self" type="application/atom+xml" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?action=history&amp;feed=atom&amp;title=Examen_16%2F02%2F21"/>
	<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Examen_16/02/21&amp;action=history"/>
	<updated>2026-07-19T10:01:51Z</updated>
	<subtitle>Historial de revisiones de esta página en el wiki</subtitle>
	<generator>MediaWiki 1.36.1</generator>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Examen_16/02/21&amp;diff=437&amp;oldid=prev</id>
		<title>Mdelamor: Protegió «Examen 16/02/21» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Examen_16/02/21&amp;diff=437&amp;oldid=prev"/>
		<updated>2021-11-17T22:15:15Z</updated>

		<summary type="html">&lt;p&gt;Protegió «&lt;a href=&quot;/WIKIS/I1M2021G2/index.php/Examen_16/02/21&quot; title=&quot;Examen 16/02/21&quot;&gt;Examen 16/02/21&lt;/a&gt;» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;es&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Revisión anterior&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revisión del 22:15 17 nov 2021&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;es&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(Sin diferencias)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Examen_16/02/21&amp;diff=436&amp;oldid=prev</id>
		<title>Mdelamor: Página creada con «&lt;source lang=&#039;haskell&#039;&gt;  -- ================================================================== -- Informática (1º del Grado en Matemáticas), Grupo 2 -- 2º examen de eva…»</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Examen_16/02/21&amp;diff=436&amp;oldid=prev"/>
		<updated>2021-11-17T22:15:08Z</updated>

		<summary type="html">&lt;p&gt;Página creada con «&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;  -- ================================================================== -- Informática (1º del Grado en Matemáticas), Grupo 2 -- 2º examen de eva…»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nueva&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-- ==================================================================&lt;br /&gt;
-- Informática (1º del Grado en Matemáticas), Grupo 2&lt;br /&gt;
-- 2º examen de evaluación continua (16 de febrero de 2021)&lt;br /&gt;
-- ------------------------------------------------------------------&lt;br /&gt;
-- Nombre: &lt;br /&gt;
--&lt;br /&gt;
-- Apellidos: &lt;br /&gt;
-- &lt;br /&gt;
-- Usuario Virtual de la Universidad(UVUS):&lt;br /&gt;
-- ==================================================================&lt;br /&gt;
&lt;br /&gt;
-- Nota 1: Es necesario que se pueda cargar el fichero. Es decir, que&lt;br /&gt;
-- no contenga errores sintácticos. Para ello, si alguna función no &lt;br /&gt;
-- está terminada de programar o bien tiene algún error sintáctico,&lt;br /&gt;
-- debe estar comentada.&lt;br /&gt;
&lt;br /&gt;
-- Nota 2: Hay que documentar las funciones auxilares, es decir:&lt;br /&gt;
--   1. Elegir un nombre para sugerir lo que hace&lt;br /&gt;
--   2. Escribir, en lenguaje natural, qué hace la función y no cómo lo&lt;br /&gt;
--      hace.&lt;br /&gt;
--&lt;br /&gt;
-- Nota 3: En cada ejercicio se valorará la corrección, claridad y &lt;br /&gt;
-- eficiencia de la solución propuesta. Todos los ejercicios valen igual.&lt;br /&gt;
&lt;br /&gt;
import Data.List&lt;br /&gt;
import Data.Char&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1&lt;br /&gt;
-- ----------------------------------------------------------------------&lt;br /&gt;
-- Un árbol de Huffman tiene la siguiente forma: los nodos no contienen&lt;br /&gt;
-- valores y las hojas almacenan caracteres. Para cada nodo, la rama &lt;br /&gt;
-- izquierda tiene asociado el 0, y la rama derecha el 1. Además, para &lt;br /&gt;
-- todo nodo, el subárbol izquierdo es siempre una hoja. Por ejemplo,&lt;br /&gt;
--       o&lt;br /&gt;
--      / \  &lt;br /&gt;
--   0 /   \ 1&lt;br /&gt;
--    /     \&lt;br /&gt;
--   A       o&lt;br /&gt;
--          / \&lt;br /&gt;
--       0 /   \ 1&lt;br /&gt;
--        /     \&lt;br /&gt;
--       R       o&lt;br /&gt;
--              / \&lt;br /&gt;
--           0 /   \ 1&lt;br /&gt;
--            /     \&lt;br /&gt;
--           B       K &lt;br /&gt;
-- &lt;br /&gt;
-- El tipo de dato que usaremos para representar un árbol de Huffman&lt;br /&gt;
-- es el siguiente:&lt;br /&gt;
&lt;br /&gt;
data ArbolH = H Char | N (ArbolH) (ArbolH)&lt;br /&gt;
  deriving Show&lt;br /&gt;
&lt;br /&gt;
-- Por tanto, el ejemplo anterior se representa como:&lt;br /&gt;
 &lt;br /&gt;
ahEj :: ArbolH&lt;br /&gt;
ahEj = N (H &amp;#039;a&amp;#039;) (N (H &amp;#039;r&amp;#039;) (N (H &amp;#039;b&amp;#039;) (H &amp;#039;k&amp;#039;)))&lt;br /&gt;
&lt;br /&gt;
-- Podemos usar un árbol de Huffman para codificar en binario los &lt;br /&gt;
-- caracteres que hay en él. La codificación de cada caracter es&lt;br /&gt;
-- simplemente el camino desde la raíz a la hoja de ese caracter.&lt;br /&gt;
-- Por ejemplo:&lt;br /&gt;
-- A    0&lt;br /&gt;
-- R   10&lt;br /&gt;
-- B  110&lt;br /&gt;
-- K  111&lt;br /&gt;
--&lt;br /&gt;
-- Define la función &lt;br /&gt;
--      codificaHuffman :: String -&amp;gt; ArbolH -&amp;gt; [Int]&lt;br /&gt;
-- tal que (codificaHuffman cs a) reciba una cadena de caracteres cs, un &lt;br /&gt;
-- árbol de Huffman a y devuelva una lista de enteros que represente la&lt;br /&gt;
-- secuencia de bits de la codificación final (0s y 1s). Para ello, hay que:&lt;br /&gt;
--    1. limpiar la cadena cs para que solo contenga los caracteres que &lt;br /&gt;
--       existan en las hojas del árbol a, sin distinguir entre mayúsculas&lt;br /&gt;
--       y minúsculas&lt;br /&gt;
--    2. codificar cada caracter resultante de lo anterior con su codificación &lt;br /&gt;
--       según el árbol.&lt;br /&gt;
-- &lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
-- &amp;gt; codificaHuffman &amp;quot;ABRRKBAARAA&amp;quot; ahEj&lt;br /&gt;
-- [0,1,1,0,1,0,1,0,1,1,1,1,1,0,0,0,1,0,0,0]&lt;br /&gt;
-- &amp;gt; codificaHuffman &amp;quot;arbk&amp;quot; ahEj&lt;br /&gt;
-- [0,1,0,1,1,0,1,1,1]&lt;br /&gt;
-- &amp;gt; codificaHuffman &amp;quot;bcccc!&amp;quot; ahEj&lt;br /&gt;
-- [1,1,0]&lt;br /&gt;
-- &amp;gt; codificaHuffman &amp;quot;i1m&amp;quot; ahEj&lt;br /&gt;
-- []&lt;br /&gt;
&lt;br /&gt;
codificaHuffman :: String -&amp;gt; ArbolH -&amp;gt; [Int]&lt;br /&gt;
codificaHuffman cs a = concatMap (huffaux a) cs&amp;#039;&lt;br /&gt;
    where cs&amp;#039; = filter (enArbol a) (map toLower cs)&lt;br /&gt;
&lt;br /&gt;
huffaux :: ArbolH -&amp;gt; Char -&amp;gt; [Int]&lt;br /&gt;
huffaux (N (H e) a) c&lt;br /&gt;
  | e == c = [0]&lt;br /&gt;
  | otherwise = 1:huffaux a c&lt;br /&gt;
huffaux _ _ = []&lt;br /&gt;
&lt;br /&gt;
enArbol :: ArbolH -&amp;gt; Char -&amp;gt; Bool &lt;br /&gt;
enArbol (H c&amp;#039;) c = toLower c == toLower c&amp;#039; &lt;br /&gt;
enArbol (N a1 a2) c = enArbol a1 c || enArbol a2 c&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2&lt;br /&gt;
-- ----------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.1. Define la función&lt;br /&gt;
--      frecuencias :: String -&amp;gt; [(Char,Int)]&lt;br /&gt;
-- tal que (frecuencias cs) reciba una cadena de caracteres cs y devuelva&lt;br /&gt;
-- una lista de pares (c,f), donde c es cada caracter en cs y f es el&lt;br /&gt;
-- número de veces que aparece c en cs (frecuencia). La lista devuelta &lt;br /&gt;
-- debe estar ordenada de mayor a menor según la frecuencia. No se deben&lt;br /&gt;
-- distinguir entre mayúsculas y minúsculas (es decir, &amp;#039;a&amp;#039; y &amp;#039;A&amp;#039; cuentan&lt;br /&gt;
-- igual). Por ejemplo,&lt;br /&gt;
-- &amp;gt; frecuencias &amp;quot;Mandalorian&amp;quot; &lt;br /&gt;
-- [(&amp;#039;a&amp;#039;,3),(&amp;#039;n&amp;#039;,2),(&amp;#039;r&amp;#039;,1),(&amp;#039;o&amp;#039;,1),(&amp;#039;m&amp;#039;,1),(&amp;#039;l&amp;#039;,1),(&amp;#039;i&amp;#039;,1),(&amp;#039;d&amp;#039;,1)]&lt;br /&gt;
-- &amp;gt; frecuencias &amp;quot;aaakdkaa&amp;quot;&lt;br /&gt;
-- [(&amp;#039;a&amp;#039;,5),(&amp;#039;k&amp;#039;,2),(&amp;#039;d&amp;#039;,1)]&lt;br /&gt;
-- &amp;gt; frecuencias &amp;quot;aaaAAaaAAAAa&amp;quot;&lt;br /&gt;
-- [(&amp;#039;a&amp;#039;,12)]&lt;br /&gt;
-- NOTA: recuerda, la función sort funciona también para pares.&lt;br /&gt;
&lt;br /&gt;
frecuencias :: String -&amp;gt; [(Char,Int)]&lt;br /&gt;
frecuencias cs = reverse $&lt;br /&gt;
                 map swap $ &lt;br /&gt;
                 sort [(length (filter (==c) cs&amp;#039;),c)  | c &amp;lt;- nub cs&amp;#039;]&lt;br /&gt;
  where cs&amp;#039; = map toLower cs &lt;br /&gt;
        swap (x,y) = (y,x)&lt;br /&gt;
&lt;br /&gt;
-- Ejercicio 2.2. Define la función&lt;br /&gt;
--    arbolHuffman :: String -&amp;gt; ArbolH&lt;br /&gt;
-- tal que (arbolHuffman cs) reciba un String y devuelva un árbol de Huffman.&lt;br /&gt;
-- Los caracteres se ponen en el subárbol izquierdo de cada nodo como hojas, &lt;br /&gt;
-- y en orden de mayor a menor frecuencia. En concreto, el caracter con más&lt;br /&gt;
-- frecuencia se pone como subárbol izquierdo de la raíz, y el caracter con&lt;br /&gt;
-- menor frecuencia terminará en el subárbol derecho del nodo más profundo.&lt;br /&gt;
-- No se deben distinguir entre mayúsculas y minúsculas. Por simplicidad,&lt;br /&gt;
-- asume que al menos hay dos caracteres distintos.&lt;br /&gt;
-- &amp;gt; arbolHuffman &amp;quot;ABRRKBAARAA&amp;quot;&lt;br /&gt;
-- N (H &amp;#039;a&amp;#039;) (N (H &amp;#039;r&amp;#039;) (N (H &amp;#039;b&amp;#039;) (H &amp;#039;k&amp;#039;)))&lt;br /&gt;
-- &amp;gt;  arbolHuffman &amp;quot;abBcCc&amp;quot;&lt;br /&gt;
-- N (H &amp;#039;c&amp;#039;) (N (H &amp;#039;b&amp;#039;) (H &amp;#039;a&amp;#039;))&lt;br /&gt;
-- &amp;gt;  arbolHuffman &amp;quot;Grogu&amp;quot;      &lt;br /&gt;
-- N (H &amp;#039;g&amp;#039;) (N (H &amp;#039;u&amp;#039;) (N (H &amp;#039;r&amp;#039;) (H &amp;#039;o&amp;#039;)))&lt;br /&gt;
&lt;br /&gt;
arbolHuffman :: String -&amp;gt; ArbolH&lt;br /&gt;
arbolHuffman cs = arbHuffAux fs&lt;br /&gt;
  where fs = map fst $ frecuencias cs&lt;br /&gt;
  &lt;br /&gt;
arbHuffAux :: String -&amp;gt; ArbolH&lt;br /&gt;
arbHuffAux [] = error &amp;quot;no posible&amp;quot;  -- este caso se descarta por el enunciado&lt;br /&gt;
arbHuffAux [c1,c2] = N (H c1) (H c2)&lt;br /&gt;
arbHuffAux (c:cs) = N (H c) (arbHuffAux cs)&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3&lt;br /&gt;
-- ----------------------------------------------------------------------&lt;br /&gt;
-- La raíz cuadrada de 2 es uno de los primeros números irracionales&lt;br /&gt;
-- en ser descubiertos. Su valor es aproximadamente 1.4142135624.&lt;br /&gt;
-- En concreto, sus primeros treinta dígitos (parte entera y decimal) son:&lt;br /&gt;
--   1,4,1,4,2,1,3,5,6,2,3,7,3,0,9,5,0,4,8,8,0,1,6,8,8,7,2,4,2,0&lt;br /&gt;
-- La lista infinita de los dígitos de la raíz de dos se puede calcular&lt;br /&gt;
-- con un proceso que depende de tan solo dos parámetros, &amp;#039;x&amp;#039; y &amp;#039;r&amp;#039;:&lt;br /&gt;
--   * Inicialmente, x=2 y r=0. &lt;br /&gt;
--   * Dados x y r, se genera el dígito d, siendo d el mayor número &lt;br /&gt;
--     natural de 0 a 9 tal que cumpla la condición: d(20r+d) &amp;lt; x&lt;br /&gt;
--   * Para generar el siguiene dígito, se actualizan los parámetros:&lt;br /&gt;
--      * x pasa a valer 100(x-d(20r+d)) &lt;br /&gt;
--      * r pasa a valer (10r+d)&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--   * Para x=2 y r=0:&lt;br /&gt;
--       * d=1, ya que es el mayor natural tal que d(20*1+d) &amp;lt; 2&lt;br /&gt;
--       * El siguiente valor de x es 100(2-1(20*0+1))=100 y de r es &lt;br /&gt;
--         10*0+1=1.&lt;br /&gt;
--   * Para x=100 y r=1:&lt;br /&gt;
--       * d=4, ya que 4(20*1+4) = 96 &amp;lt; 100&lt;br /&gt;
--       * El siguiente valor de x es 400 y de r es 14&lt;br /&gt;
--   * Para x=400 y r=14, d=1&lt;br /&gt;
--   * Para x=11900 y r=141, d=4&lt;br /&gt;
--   * Para x=60400 y r=1414, d=2&lt;br /&gt;
--   * ....&lt;br /&gt;
--&lt;br /&gt;
-- Ejercicio 3.1. Define la función &lt;br /&gt;
--      raizDeDos :: [Int]&lt;br /&gt;
-- tal que devuelva la lista de dígitos de la raíz cuadrada de 2.&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--   &amp;gt;  take 31 raizDeDos       &lt;br /&gt;
--   [1,4,1,4,2,1,3,5,6,2,3,7,3,0,9,5,0,4,8,8,0,1,6,8,8,7,2,4,2,0,9]&lt;br /&gt;
-- &lt;br /&gt;
-- NOTA: Cuidado, los valores de d y r pueden ser muy altos, por lo&lt;br /&gt;
-- que necesitarás hacer uso de Integer. Recuerda que puedes usar&lt;br /&gt;
-- (fromIntegral n) para traducir un Integer a un Int.&lt;br /&gt;
&lt;br /&gt;
-- 1ª Solución&lt;br /&gt;
raizDeDos :: [Int]&lt;br /&gt;
raizDeDos = proceso 2 0&lt;br /&gt;
&lt;br /&gt;
proceso :: Integer -&amp;gt; Integer -&amp;gt; [Int]&lt;br /&gt;
proceso x r = (fromIntegral dig) : proceso sigx sigr&lt;br /&gt;
  where dig = head (dropWhile cond [0..]) - 1&lt;br /&gt;
        cond d = (20 * r + d) * d &amp;lt; x&lt;br /&gt;
        sigx = 100 * (x - (20 * r + dig) * dig)&lt;br /&gt;
        sigr = 10 * r + dig&lt;br /&gt;
&lt;br /&gt;
-- 2ª Solución&lt;br /&gt;
raizDeDos&amp;#039; :: [Int]&lt;br /&gt;
raizDeDos&amp;#039; = tail $ map fst (iterate proc (0,(2,0)))&lt;br /&gt;
  where proc :: (Int,(Integer,Integer)) -&amp;gt; (Int,(Integer,Integer))&lt;br /&gt;
        proc (d,(x,r)) = (fromIntegral dig,(sigx,sigr))&lt;br /&gt;
          where dig = last (takeWhile cond [0..])&lt;br /&gt;
                cond d = (20 * r + d) * d &amp;lt; x&lt;br /&gt;
                sigx = 100 * (x - (20 * r + dig) * dig)&lt;br /&gt;
                sigr = 10 * r + dig&lt;br /&gt;
&lt;br /&gt;
-- Ejercicio 3.2. Define la función &lt;br /&gt;
--     expande :: [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (expande xs) recibe una secuencia de enteros xs y la &lt;br /&gt;
-- expande de la siguiente manera: para cada par de enteros consecutivos&lt;br /&gt;
-- x e y de xs, se insertan los números enteros para ir de x a y. Por&lt;br /&gt;
-- ejemplo, si x=1 e y=4, entonces se inserta 2,3 entre x e y. Si&lt;br /&gt;
-- x=8 e y=4, entonces se inserta 7,6,5. Por ejemplo,&lt;br /&gt;
-- &amp;gt; expande [1,10,1]&lt;br /&gt;
-- [1,2,3,4,5,6,7,8,9,10,9,8,7,6,5,4,3,2,1]&lt;br /&gt;
-- &amp;gt; take 20 $ expande raizDeDos&lt;br /&gt;
-- [1,2,3,4,3,2,1,2,3,4,3,2,1,2,3,4,5,6,5,4]&lt;br /&gt;
&lt;br /&gt;
-- 1ª Solución&lt;br /&gt;
expande :: [Int] -&amp;gt; [Int]&lt;br /&gt;
expande [] = []&lt;br /&gt;
expande [x] = [x]&lt;br /&gt;
expande (x:y:xs) = genera x y ++ expande (y:xs)&lt;br /&gt;
 &lt;br /&gt;
genera :: Int -&amp;gt; Int -&amp;gt; [Int]&lt;br /&gt;
genera x y | x==y = [x]&lt;br /&gt;
           | x &amp;lt; y = init [x..y]&lt;br /&gt;
           | otherwise = init [x,x-1..y]&lt;br /&gt;
&lt;br /&gt;
-- 2ª Solución&lt;br /&gt;
expande&amp;#039; :: [Int] -&amp;gt; [Int]&lt;br /&gt;
expande&amp;#039; xs = concat $ zipWith genera xs (tail xs)&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4&lt;br /&gt;
-- ----------------------------------------------------------------------&lt;br /&gt;
-- Define la función&lt;br /&gt;
--   digitosHasta :: Int -&amp;gt; Int&lt;br /&gt;
-- tal que (digitosHasta n) devuelva el mínimo número de dígitos de la raíz&lt;br /&gt;
-- cuadrada de dos necesarios para que aparezcan todos los dígitos del 0&lt;br /&gt;
-- al 9 al menos n veces cada uno. Por ejemplo, para que cada dígito (0 al&lt;br /&gt;
-- 9) aparezca al menos 2 veces se necesitan un mínimo de 31 dígitos de raíz&lt;br /&gt;
-- de dos. Por ejemplo,&lt;br /&gt;
-- &amp;gt; digitosHasta 1&lt;br /&gt;
-- 19&lt;br /&gt;
-- &amp;gt; digitosHasta 2&lt;br /&gt;
-- 31&lt;br /&gt;
-- &amp;gt; digitosHasta 3&lt;br /&gt;
-- 38&lt;br /&gt;
-- &amp;gt; digitosHasta 4&lt;br /&gt;
-- 47&lt;br /&gt;
-- &amp;gt; digitosHasta 100&lt;br /&gt;
-- 1188&lt;br /&gt;
-- &amp;gt; digitosHasta 500&lt;br /&gt;
-- 5328&lt;br /&gt;
-- NOTA: si no has definido el ejercicio 3, usa la siguiente definición y&lt;br /&gt;
-- prueba con hasta n = 4&lt;br /&gt;
--raizDeDos :: [Int]&lt;br /&gt;
--raizDeDos = [1,4,1,4,2,1,3,5,6,2,3,7,3,0,9,5,0,4,8,8,0,1,6,8,8,7,2,4,2,0,9,6,9,8,0,7,8,5,6,9,6,7,1,8,7,5,3,7,6,9]&lt;br /&gt;
&lt;br /&gt;
-- 1ª Solución (con recursión)&lt;br /&gt;
digitosHasta :: Int -&amp;gt; Int&lt;br /&gt;
digitosHasta n = recorre (replicate 10 0) 0 raizDeDos&lt;br /&gt;
  where aumenta i xs = take i xs ++ [(xs!!i)+1] ++ drop (i+1) xs&lt;br /&gt;
        recorre _ _ [] = error &amp;quot;imposible&amp;quot;&lt;br /&gt;
        recorre ns k (x:xs)&lt;br /&gt;
            | all (&amp;gt;=n) ns = k&lt;br /&gt;
            | otherwise = recorre (aumenta x ns) (k+1) xs&lt;br /&gt;
&lt;br /&gt;
-- 2ª Solución (con orden superior)&lt;br /&gt;
digitosHasta&amp;#039; :: Int -&amp;gt; Int&lt;br /&gt;
digitosHasta&amp;#039; n = (length.head) $ dropWhile p (inits raizDeDos)&lt;br /&gt;
  where p = not . (\xss -&amp;gt; length xss == 10 &amp;amp;&amp;amp; all (&amp;gt;=n) (map length xss)) . group . sort&lt;br /&gt;
&lt;br /&gt;
-- &amp;gt; digitosHasta 500 &lt;br /&gt;
-- 5328&lt;br /&gt;
-- (0.09 secs, 169,311,552 bytes)&lt;br /&gt;
-- &amp;gt; digitosHasta&amp;#039; 500&lt;br /&gt;
-- 5328&lt;br /&gt;
-- (5.22 secs, 13,704,382,352 bytes)&lt;br /&gt;
-- La primera solución es más eficiente en tiempo y memoria&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
</feed>