Tema

P8, ej 4 + Módulo para testear

1 respuestas 4659 visitas

Acá va el de Pirámides...

Ejercicio + Módulo (para bajar)

Ejercicio:

import Piramide

pirr = crearPir 4 [39,22,17,13,9,8,5,8,1,7]

bienFormada :: Piramide -> Bool
bienFormada pir = auxBF pir 1

fila :: Int -> Piramide -> [Int] --devuelve una [Int] con los valores de la n-esima fila.
fila n pir = auxFila n pir 1

auxFila :: Int -> Piramide -> Int -> [Int]
auxFila n pir i
	| i == n = [valor pir n n]
	| otherwise = (valor pir n i):(auxFila n pir (i+1))
	
	
filaDeArriba :: [Int] -> [Int] --dada una fila construye la que tendría que ser  la que va arriba para que sea bien formada.
filaDeArriba f = auxFArr f 0

auxFArr :: [Int] -> Int -> [Int]
auxFArr f i
	| i==((length f)-2) = [(f!!i)+(f!!(i+1))]
	| otherwise = ((f!!i)+(f!!(i+1))):(auxFArr f (i+1))

auxBF :: Piramide -> Int -> Bool --Chequea desde la n-esima fila hasta la anteultima si son "la fila de arriba" de la de abajo.
auxBF p n
	| n == (altura p) = True
	| otherwise = (fila n p) == (filaDeArriba (fila (n+1) p)) && (auxBF p (n+1))

Módulo:

module Piramide (Piramide(..), altura, valor,crearPir)
	where

data Piramide = Pir Int [Int]

altura :: Piramide -> Int
altura (Pir h _) = h

valor :: Piramide -> Int -> Int -> Int
valor (Pir h v) f c = v!!((auxIndFila f) + (c-1))

auxIndFila :: Int -> Int
auxIndFila 1 = 0
auxIndFila n = (n-1) + (auxIndFila (n-1))

crearPir :: Int -> [Int] -> Piramide
crearPir h v = Pir h v

Otra forma de hacerlo

import Piramide

bienFormada :: Piramide -> Bool
bienFormada p 
	| altura p < 1 	= True
	| otherwise		= estaBienFormada p 1 1
	

estaBienFormada :: Piramide -> Int -> Int -> Bool
estaBienFormada p i j
	|  i == altura p = True
	| j > i			 = estaBienFormada p (i+1) 1
	| otherwise		 = (v1 == v2+v3) && (estaBienFormada p i (j+1))
		where
			v1 = valor p i j
			v2 = valor p (i+1) j
			v3 = valor p (i+1) (j+1)

Saludos!