<?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_28%2F04%2F21</id>
	<title>Examen 28/04/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_28%2F04%2F21"/>
	<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Examen_28/04/21&amp;action=history"/>
	<updated>2026-07-19T23:54:31Z</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_28/04/21&amp;diff=441&amp;oldid=prev</id>
		<title>Mdelamor: Protegió «Examen 28/04/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_28/04/21&amp;diff=441&amp;oldid=prev"/>
		<updated>2021-11-17T22:16:18Z</updated>

		<summary type="html">&lt;p&gt;Protegió «&lt;a href=&quot;/WIKIS/I1M2021G2/index.php/Examen_28/04/21&quot; title=&quot;Examen 28/04/21&quot;&gt;Examen 28/04/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:16 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_28/04/21&amp;diff=440&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, Turno 1 -- 3er exam…»</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Examen_28/04/21&amp;diff=440&amp;oldid=prev"/>
		<updated>2021-11-17T22:16:09Z</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, Turno 1 -- 3er exam…»&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, Turno 1&lt;br /&gt;
-- 3er examen de evaluación continua (28 de abril 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: 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;
-- Nota 3: Todos los ejercicios valen igual. Se recomienda leer primero&lt;br /&gt;
-- todos los enunciados para planificar mejor el examen.&lt;br /&gt;
&lt;br /&gt;
import Data.List&lt;br /&gt;
import Data.Matrix&lt;br /&gt;
import qualified Data.Vector as V&lt;br /&gt;
import I1M.Cola&lt;br /&gt;
--import ColaConListas&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1&lt;br /&gt;
-- ----------------------------------------------------------------------&lt;br /&gt;
-- Un bosque es una lista de árboles binarios. Representaremos los árboles&lt;br /&gt;
-- y los bosques mediante los siguientes tipos de datos&lt;br /&gt;
&lt;br /&gt;
data Arbol  a = H a | N a (Arbol a) (Arbol a) deriving Show&lt;br /&gt;
data Bosque a = B [Arbol a] deriving Show&lt;br /&gt;
&lt;br /&gt;
-- Define la función (hojasBosque b) tal que devuelva las hojas más&lt;br /&gt;
-- profundas de cada árbol del bosque, en el mismo orden. Por ejemplo:&lt;br /&gt;
-- &amp;gt; hojasBosque (B [t1,t2])  &lt;br /&gt;
-- [7,6,9,0]&lt;br /&gt;
-- &amp;gt; hojasBosque (B [t3,t2,t1])&lt;br /&gt;
-- [1,5,9,0,7,6]&lt;br /&gt;
&lt;br /&gt;
t1,t2,t3 :: Arbol Int &lt;br /&gt;
t1 = N 7 (N 9 (H 1) (N 5 (H 7) (H 6))) (H 5)&lt;br /&gt;
t2 = N 7 (N 9 (N 5 (H 9) (H 0)) (H 1)) (H 5)&lt;br /&gt;
t3 = N 7 (H 5) (N 9 (H 1) (H 5))&lt;br /&gt;
&lt;br /&gt;
hojasBosque :: Bosque a -&amp;gt; [a]&lt;br /&gt;
hojasBosque (B as) = concatMap hojasProfundas as&lt;br /&gt;
  where&lt;br /&gt;
    hojasProfundas a = hojasP a (profundidad a) 0&lt;br /&gt;
    profundidad (H _) = 0&lt;br /&gt;
    profundidad (N _ i d) = 1 + max (profundidad i) (profundidad d)&lt;br /&gt;
    hojasP (H v) p n  &lt;br /&gt;
      | p == n = [v]&lt;br /&gt;
      | otherwise = []&lt;br /&gt;
    hojasP (N v i d) p n = (hojasP i p (n+1)) ++ (hojasP d p (n+1))&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    anterior :: Eq a =&amp;gt; a -&amp;gt; Cola a -&amp;gt; Maybe a&lt;br /&gt;
-- tal que (anterior x cs) es justo el elemento anterior a la primera &lt;br /&gt;
-- ocurrencia de x en la cola cs o Nothing si x no pertenece a ys o si &lt;br /&gt;
-- x es el primero de la cola. Usar solo funciones del TAD de colas&lt;br /&gt;
-- para resolver el ejercicio (es decir, no vale convertir la cola en&lt;br /&gt;
-- una lista). Por ejemplo,&lt;br /&gt;
&lt;br /&gt;
c1 = foldl (flip inserta) vacia [3,5,2,5,7]&lt;br /&gt;
c2 = foldl (flip inserta) vacia &amp;quot;afdegdb&amp;quot;&lt;br /&gt;
c3 = foldl (flip inserta) vacia [&amp;quot;En&amp;quot;,&amp;quot;todo&amp;quot;,&amp;quot;la&amp;quot;,&amp;quot;medida&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
--    anterior 5 c1       ==  Just 3&lt;br /&gt;
--    anterior 9 c1       ==  Nothing&lt;br /&gt;
--    anterior &amp;#039;d&amp;#039; c2     ==  Just &amp;#039;f&amp;#039;&lt;br /&gt;
--    anterior &amp;quot;todo&amp;quot; c3  ==  Just &amp;quot;En&amp;quot;&lt;br /&gt;
--    anterior &amp;quot;En&amp;quot; c3    ==  Nothing&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
anterior :: Eq a =&amp;gt; a -&amp;gt; Cola a -&amp;gt; Maybe a&lt;br /&gt;
anterior x c = aux c Nothing &lt;br /&gt;
  where aux q v &lt;br /&gt;
          | esVacia q = Nothing &lt;br /&gt;
          | x == primero q = v &lt;br /&gt;
          | otherwise = aux (resto q) (Just (primero q))&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3&lt;br /&gt;
-- ----------------------------------------------------------------------&lt;br /&gt;
-- Un tablero de Sudoku es aquel con 9x9 elementos dispuestos de la &lt;br /&gt;
-- siguiente forma:&lt;br /&gt;
--  * Los valores son los números del 0 al 9&lt;br /&gt;
--  * Un valor del 1 al 9 no puede estar repetido en la misma fila ni en&lt;br /&gt;
--    la misma columna&lt;br /&gt;
--  * Un valor del 1 al 9 no puede estar repetido en el mismo cuadrante de &lt;br /&gt;
--    3x3, siendo un cuadrante las submatrices de 3x3 del tablero, sin&lt;br /&gt;
--    solapamiento.&lt;br /&gt;
-- Define (valido m), tal que reciba una matriz m y compruebe si el &lt;br /&gt;
-- tablero representado es un sudoku válido. Por ejemplo,&lt;br /&gt;
--   &amp;gt; valido sudoku0 == True&lt;br /&gt;
--   &amp;gt; valido sudoku1 == False&lt;br /&gt;
--   &amp;gt; valido sudoku2 == False&lt;br /&gt;
--   &amp;gt; valido sudoku3 == False&lt;br /&gt;
&lt;br /&gt;
sudoku0, sudoku1, sudoku2, sudoku3 :: Matrix Int&lt;br /&gt;
sudoku0 = fromLists [[9,2,0,8,0,0,0,4,0],[0,0,1,3,4,0,0,0,6],[4,0,3,0,5,6,8,0,0],[2,1,0,0,6,4,5,0,0],[0,0,4,5,0,0,0,0,0],[6,0,5,1,0,2,4,7,0],[0,0,8,0,2,0,0,1,3],[0,4,0,0,1,0,0,0,0],[0,9,7,6,0,3,2,0,4]]&lt;br /&gt;
sudoku1 = fromLists [[9,2,0,8,0,0,0,4,0],[0,0,1,3,4,0,0,0,6],[4,0,3,0,5,6,8,0,0]]&lt;br /&gt;
sudoku2 = fromLists [[9,2,0,8,0,0,9,4,0],[0,0,1,3,4,0,0,0,6],[4,0,3,0,5,6,8,0,0],[2,1,0,0,6,4,5,0,0],[0,0,4,5,0,0,0,0,0],[6,0,5,1,0,2,4,7,0],[0,0,8,0,2,0,0,1,3],[0,4,0,0,1,0,0,0,0],[0,9,7,6,0,3,2,0,4]]&lt;br /&gt;
sudoku3 = fromLists [[9,2,0,8,0,0,0,4,0],[0,0,1,3,4,0,0,0,6],[4,0,3,0,5,6,8,0,0],[2,1,0,0,6,4,5,0,0],[0,0,4,5,0,0,0,0,0],[6,0,5,1,0,2,4,7,0],[0,0,8,0,2,0,0,1,3],[0,4,0,0,1,0,0,2,0],[0,9,7,6,0,3,2,0,4]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
valido :: Matrix Int -&amp;gt; Bool&lt;br /&gt;
valido m &lt;br /&gt;
  | nr /= 9 || nc /= 9 = False -- Tamano no valido&lt;br /&gt;
  | all (\x -&amp;gt; notElem x [0..9]) (toList m) = False -- Hay elementos no en [0..9]&lt;br /&gt;
  | or [ valRepetidoSudo (V.toList (getRow i m)) | i &amp;lt;- [1..nr]] = False -- Hay elementos repetidos en una fila&lt;br /&gt;
  | or [ valRepetidoSudo (V.toList (getCol j m)) | j &amp;lt;- [1..nc]] = False -- Hay elementos repetidos en una columna&lt;br /&gt;
  | or [ valRepetidoSudo (toList (submatrix i (i+2) j (j+2) m)) | i &amp;lt;- [1,4,7], j &amp;lt;- [1,4,7]] = False -- Hay elementos repetidos en un cuadrante&lt;br /&gt;
  | otherwise = True -- Tablero correcto&lt;br /&gt;
  where nr = nrows m&lt;br /&gt;
        nc = ncols m&lt;br /&gt;
&lt;br /&gt;
valRepetidoSudo :: [Int] -&amp;gt; Bool    &lt;br /&gt;
valRepetidoSudo xs = ys /= nub ys&lt;br /&gt;
  where ys = filter (/=0) xs  -- el cero no cuenta puesto que son casillas vacías&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4&lt;br /&gt;
-- ----------------------------------------------------------------------&lt;br /&gt;
-- Define un programa interactivo en el que:&lt;br /&gt;
--   1. Se le pida al usuario una fila f, una columna c y un valor v. &lt;br /&gt;
--   2. Mostrar un mensaje que indique si los valores introducidos por&lt;br /&gt;
--   el usuario son correctos o no. Es decir:&lt;br /&gt;
--      * f, c y v son números entre el 1 y el 9&lt;br /&gt;
--      * en la posición (f,c) de la matriz sudoku0 (ejercicio 3) hay un 0.&lt;br /&gt;
&lt;br /&gt;
-- Por ejemplo, el primer intento es inválido por los valores, el segundo&lt;br /&gt;
-- porque no hay un 0 en la posición (1,1), y el tercero es correcto.&lt;br /&gt;
-- &amp;gt; main&lt;br /&gt;
-- Indica una fila&lt;br /&gt;
-- 0&lt;br /&gt;
-- Indica una columna&lt;br /&gt;
-- 6&lt;br /&gt;
-- Indica un valor&lt;br /&gt;
-- -1&lt;br /&gt;
-- Incorrecto&lt;br /&gt;
-- &amp;gt; main&lt;br /&gt;
-- Indica una fila&lt;br /&gt;
-- 1&lt;br /&gt;
-- Indica una columna&lt;br /&gt;
-- 1&lt;br /&gt;
-- Indica un valor&lt;br /&gt;
-- 1&lt;br /&gt;
-- Incorrecto&lt;br /&gt;
-- &amp;gt; main&lt;br /&gt;
-- Indica una fila&lt;br /&gt;
-- 1&lt;br /&gt;
-- Indica una columna&lt;br /&gt;
-- 3&lt;br /&gt;
-- Indica un valor&lt;br /&gt;
-- 1&lt;br /&gt;
-- Correcto&lt;br /&gt;
&lt;br /&gt;
main :: IO()&lt;br /&gt;
main = do&lt;br /&gt;
  putStrLn &amp;quot;Indica una fila&amp;quot;&lt;br /&gt;
  f&amp;#039; &amp;lt;- getChar&lt;br /&gt;
  getChar&lt;br /&gt;
  putStrLn &amp;quot;Indica una columna&amp;quot;&lt;br /&gt;
  c&amp;#039; &amp;lt;- getChar&lt;br /&gt;
  getChar&lt;br /&gt;
  putStrLn &amp;quot;Indica un valor&amp;quot;&lt;br /&gt;
  v&amp;#039; &amp;lt;- getChar&lt;br /&gt;
  getChar&lt;br /&gt;
  let f = convierte f&amp;#039; &lt;br /&gt;
      c = convierte c&amp;#039; &lt;br /&gt;
      v = convierte v&amp;#039; &lt;br /&gt;
  if (valorNum f &amp;amp;&amp;amp; valorNum c &amp;amp;&amp;amp; valorNum v &amp;amp;&amp;amp; sudoku0!(f,c) == 0) then do&lt;br /&gt;
      putStrLn &amp;quot;Correcto&amp;quot;&lt;br /&gt;
    else &lt;br /&gt;
      putStrLn &amp;quot;Incorrecto&amp;quot;&lt;br /&gt;
  where valorNum c = elem c [1..9]    -- incluyendo Data.Char podríamos usar isDigit  y c/=&amp;#039;0&amp;#039;&lt;br /&gt;
        convierte c = read [c]::Int   -- incluyendo Data.Char podríamos usar digitToInt&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>