Jump to content
angelicous

[Ajuda] Algoritmo para filtrar certas ocorrências

Recommended Posts

angelicous

Boa tarde,

Sou novo com haskell e programação em geral e estou com um pequeno "dilema" com uma função para um projecto que tenho que entregar.

Isto é um jogo simples, com tabuleiro e peças. Não vou entrar em grande detalhe mas neste momento o meu objectivo é ler informações e representar visualmente o tabuleiro com caracteres. Primeiro que tudo, o objectivo da minha função. Vamos chamar-lhe "compara" e a minha declaração é assim

compara :: (String,String,(String,String)) -> [string]

Aquele (String,String,(String,String)) são informações que retiro de um XML, e representam informações que estão contidas em peças num tabuleiro. Para ser mais fácil explicar vamos representar a estrutura por (tipo,orientação(numero jogador, tipof)). tipo e orientação vão ter que ser sempre preenchidos. tipo vai ter sempre valor "B","N","C" ou "E" e orientação vai ser sempre "N","S","E","W". numero jogador e tipof não são obrigatórios. Quando estes campos estão vazios são representados por ("",""). numero jogado é um número(representado por uma string) e tipof pode ter o valor "K","M" ou "F". Quando não existe peça nenhuma (no tabuleiro) o aspecto é este ("_","",("","")).

Agora o meu "dilema"

A minha função compara para completar os casos está assim neste momento:

compara :: (String,String,(String,String)) -> [string]
compara (p,o,(nj,tf))
 |(p,o,(nj,tf)) == ("B","N",("","")) = [".....","..O..",".OOO.","..O..","....."]
 |(p,o,(nj,tf)) == ("E","E",("","")) = ["....*","...**","..***","...**","....*"]
 |(p,o,(nj,tf)) == ("E","W",("","")) = ["*....","**...","***..","**...","*...."]
 |(p,o,(nj,tf)) == ("_","",("","")) = [" "," "," "," "," "]
 |otherwise = [" "," "," "," "," "]

Estes obviamente são só 4 casos(otherwise está lá para permitir a compilação e fazer testes). A minha questão é, será esta a melhor abordagem para caracterizar todas as peças? Existe uma infinidade de casos, e provavelmente esta não será a forma mais saudável de abordar

Outra questão, quando a informação do par, numero jogador e tipof não estão vazios, preciso representar o valor de numero jogador na string produzida. Imaginem a primeira comparação no código em cima.

|(p,o,(nj,tf)) == ("B","N",("","")) = [".....","..O..",".OOO.","..O..","....."]

Esta string seria representada no ghci por

.....
..O..
.OOO.
..O..
.....

Se o par não estiver vazio e estiver por exemplo assim:

|(p,o,(nj,tf)) == ("B","N",("1","F")) = ["..1..","..O..",".OOO.","..O..","....."]

a representação tem que alterar, e acrescentamos o número do jogador na primeira linha, como podem ver. O meu problema é que podem estar até 5 jogadores e esta representação só compara 1. Tenho que fazer uma representação para cada número de jogador diferente para todos os casos possíveis? Não existe uma forma mais simples de fazer isto?

Neste caso, o numero jogador é indiferente para mim, eu só preciso de o representar. O que define a sua localização na peça vai ser o tipof. Se o tipof em vez de "F" fosse por exemplo "K" o 1 ia por exemplo para o O do meio na 3º string do resultado.

Desde já obrigado pelo tempo perdido para tentarem ajudar :)

Edited by Rui Carlos
GeSHi

Share this post


Link to post
Share on other sites
Rui Carlos

Tens que tentar mecanizar a construção do resultado. O problema parece ter demasiados detalhes para te dar sugestões mais precisas, mas tenta pensar num parâmetro de input de cada vez, e em como é que ele afecta o resultado. Por exemplo, para a identificação do jogador, podes definir uma função que altera o resultado em função do valor do parâmetro do jogador.

Algo como:

idJogador :: String -> [string] -> [string]
idJogador "" res = res  -- jogador vazio
idJogador nj (resh:rest) = ((take 2 resh) ++ nj ++ (drop 3 resh)):rest

Adicionalmente, não deves fazer (p,o,(nj,tf)) == ("B","N",("","")), mas sim p == "B" && o == "N" && nj == "" && tf == "".

Com a mudança que sugeri, passavas para p == "B" && o == "N" && tf == "" = idJogador nj [".....","..O..",".OOO.","..O..","....."] (i.e., deixavas de testar o valor de nj, e em vez disso chamavas a função idJogador para alterar o resultado em função do seu valor).

O objectivo seria chegares ao fim com algo do género compara (p,o,(nj,tf)) = idJogador nj (processaTF tf (processaO o (processaP p ...))). Não sei se é possível uma função para cada parâmetro, mas esta deverá ser a linha a seguir.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.