| Copyright | ALUNO_1_NOME <ALUNO_1_NUMERO@alunos.uminho.pt> ALUNO_2_NOME <ALUNO_2_NUMERO@alunos.uminho.pt> |
|---|---|
| Safe Haskell | None |
| Language | GHC2021 |
Tarefa0_geral
Description
Módulo que define funções genéricas sobre listas e matrizes, úteis na realização do projeto de LI1/LP1 em 2026/27.
NB: Nenhuma função deste módulo conhece as regras do jogo. As funções específicas do jogo vivem no módulo Tarefa0_2026.
Synopsis
- type Matriz a = [[a]]
- type Posicao = (Int, Int)
- type Dimensao = (Int, Int)
- data Direcao
- eIndiceListaValido :: Int -> [a] -> Bool
- dimensaoMatriz :: Matriz a -> Dimensao
- ePosicaoMatrizValida :: Posicao -> Matriz a -> Bool
- movePosicao :: Direcao -> Posicao -> Posicao
- distanciaChebyshev :: Posicao -> Posicao -> Int
- vizinhancaPosicao :: Int -> Posicao -> [Posicao]
- encontraIndiceLista :: Int -> [a] -> Maybe a
- atualizaIndiceLista :: Int -> a -> [a] -> [a]
- encontraPosicaoMatriz :: Posicao -> Matriz a -> Maybe a
- atualizaPosicaoMatriz :: Posicao -> a -> Matriz a -> Matriz a
- eMatrizValida :: Matriz a -> Bool
Tipos de dados
type Matriz a = [[a]] Source #
Uma matriz é um conjunto de elementos a duas dimensões.
Em notação matemática, é geralmente representada por:

O Mapa do jogo, em Labs2026, é precisamente uma matriz de blocos.
type Posicao = (Int, Int) Source #
Uma posição numa matriz é dada como um par (linha,colunha). As coordenadas são dois números naturais e começam com (0,0) no canto superior esquerdo, com as linhas incrementando para baixo e as colunas incrementando para a direita.

Instances
| Bounded Direcao Source # | |
| Enum Direcao Source # | |
| Read Direcao Source # | |
| Show Direcao Source # | |
| Eq Direcao Source # | |
| Ord Direcao Source # | |
Funções não-recursivas
eIndiceListaValido :: Int -> [a] -> Bool Source #
Verifica se o índice pertence à lista.
>>>eIndiceListaValido 2 "abc"True>>>eIndiceListaValido (-1) "abc"False
dimensaoMatriz :: Matriz a -> Dimensao Source #
Calcula a dimensão de uma matriz.
NB: Não existem matrizes de dimensão m * 0 ou 0 * n; qualquer matriz vazia tem dimensão 0 * 0.
>>>dimensaoMatriz [[1,2,3],[4,5,6]](2,3)>>>dimensaoMatriz [[],[]](0,0)
ePosicaoMatrizValida :: Posicao -> Matriz a -> Bool Source #
Verifica se a posição pertence à matriz.
NB: Posições com coordenadas negativas nunca pertencem a uma matriz.
Vamos buscar a linha pedida e vemos se a coluna existe nessa linha, para que a função também dê a resposta certa se as linhas tiverem tamanhos diferentes.
movePosicao :: Direcao -> Posicao -> Posicao Source #
Move uma posição uma unidade no sentido de uma direção.
Recorde que a linha cresce para baixo: Cima decrementa a linha.
>>>movePosicao Cima (3,4)(2,4)>>>movePosicao Direita (3,4)(3,5)
distanciaChebyshev :: Posicao -> Posicao -> Int Source #
Distância de Chebyshev entre duas posições, ou seja, o número de passos necessários para ir de uma à outra podendo mover-se também na diagonal.
>>>distanciaChebyshev (0,0) (1,3)3
vizinhancaPosicao :: Int -> Posicao -> [Posicao] Source #
Todas as posições a uma distância de Chebyshev menor ou igual a um dado raio, incluindo a própria posição central.
NB: A lista pode conter posições fora de qualquer matriz, incluindo posições com coordenadas negativas. Cabe a quem usa esta função filtrá-las.
>>>vizinhancaPosicao 1 (0,0)[(-1,-1),(-1,0),(-1,1),(0,-1),(0,0),(0,1),(1,-1),(1,0),(1,1)]
Funções recursivas
encontraIndiceLista :: Int -> [a] -> Maybe a Source #
Devolve o elemento num dado índice de uma lista.
NB: Devolve Nothing se o índice não existir, incluindo quando é negativo.
>>>encontraIndiceLista 1 "abc"Just 'b'>>>encontraIndiceLista 5 "abc"Nothing
atualizaIndiceLista :: Int -> a -> [a] -> [a] Source #
Modifica um elemento num dado índice.
NB: Devolve a própria lista se o índice não existir.
>>>atualizaIndiceLista 0 'z' "abc""zbc"
encontraPosicaoMatriz :: Posicao -> Matriz a -> Maybe a Source #
Devolve o elemento numa dada posição de uma matriz.
NB: Devolve Nothing se a posição não existir.
atualizaPosicaoMatriz :: Posicao -> a -> Matriz a -> Matriz a Source #
Modifica um elemento numa dada posição de uma matriz.
NB: Devolve a própria matriz se a posição não existir.
eMatrizValida :: Matriz a -> Bool Source #
Verifica se uma matriz é válida, no sentido em que modela um retângulo.
NB: Todas as linhas devem ter o mesmo número de colunas, e esse número não pode ser 0.
>>>eMatrizValida [[1,2],[3,4]]True>>>eMatrizValida [[1,2],[3]]False