motherload
CopyrightALUNO_1_NOME <ALUNO_1_NUMERO@alunos.uminho.pt>
ALUNO_2_NOME <ALUNO_2_NUMERO@alunos.uminho.pt>
Safe HaskellNone
LanguageGHC2021

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

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.

type Dimensao = (Int, Int) Source #

Dimensão de uma matriz: (número de linhas, número de colunas).

data Direcao Source #

Direção de um movimento numa matriz: Cima e Baixo mudam a linha, Esquerda e Direita mudam a coluna.

Constructors

Cima 
Baixo 
Esquerda 
Direita 

Instances

Instances details
Bounded Direcao Source # 
Instance details

Defined in Tarefa0_geral

Enum Direcao Source # 
Instance details

Defined in Tarefa0_geral

Read Direcao Source # 
Instance details

Defined in Tarefa0_geral

Show Direcao Source # 
Instance details

Defined in Tarefa0_geral

Eq Direcao Source # 
Instance details

Defined in Tarefa0_geral

Methods

(==) :: Direcao -> Direcao -> Bool #

(/=) :: Direcao -> Direcao -> Bool #

Ord Direcao Source # 
Instance details

Defined in Tarefa0_geral

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