• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Nazgulled

[Haskell] Mais um problema... Como fazer isto?

16 mensagens neste tópico

Eu aqui não quero ajuda com código, apenas quero ajuda a pensar como vou resolver este problema para depois tentar programar eu prórpio, se futuramente tiver uma dúvida sobre isso, voltarei a colocar aqui.

O problema é o seguinte, eu tenho um determinado texto cifrado usando a cifra de cesar. O objectivo é tentar descobrir o seu conteúdo que nos é dito que apenas são digitos escritos por extenso. É suposto fazer isto por força bruta. O texto crifrado é: "RLWRGRLVGRLVCHURQRYHRLWRTXDWURXPCHURVHWH". E eu fiz o seguinte:

*TP1> [[a | a <- decryptCesar x "RLWRGRLVGRLVCHURQRYHRLWRTXDWURXPCHURVHWH"] | x <- [1..26]]
["QKVQFQKUFQKUBGTQPQXGQKVQSWCVTQWOBGTQUGVG",
"PJUPEPJTEPJTAFSPOPWFPJUPRVBUSPVNAFSPTFUF",
"OITODOISDOISZERONOVEOITOQUATROUMZEROSETE",
"NHSNCNHRCNHRYDQNMNUDNHSNPTZSQNTLYDQNRDSD",
"MGRMBMGQBMGQXCPMLMTCMGRMOSYRPMSKXCPMQCRC",
"LFQLALFPALFPWBOLKLSBLFQLNRXQOLRJWBOLPBQB",
"KEPKZKEOZKEOVANKJKRAKEPKMQWPNKQIVANKOAPA",
"JDOJYJDNYJDNUZMJIJQZJDOJLPVOMJPHUZMJNZOZ",
"ICNIXICMXICMTYLIHIPYICNIKOUNLIOGTYLIMYNY",
"HBMHWHBLWHBLSXKHGHOXHBMHJNTMKHNFSXKHLXMX",
"GALGVGAKVGAKRWJGFGNWGALGIMSLJGMERWJGKWLW",
"FZKFUFZJUFZJQVIFEFMVFZKFHLRKIFLDQVIFJVKV",
"EYJETEYITEYIPUHEDELUEYJEGKQJHEKCPUHEIUJU",
"DXIDSDXHSDXHOTGDCDKTDXIDFJPIGDJBOTGDHTIT",
"CWHCRCWGRCWGNSFCBCJSCWHCEIOHFCIANSFCGSHS",
"BVGBQBVFQBVFMREBABIRBVGBDHNGEBHZMREBFRGR",
"AUFAPAUEPAUELQDAZAHQAUFACGMFDAGYLQDAEQFQ",
"ZTEZOZTDOZTDKPCZYZGPZTEZBFLECZFXKPCZDPEP",
"YSDYNYSCNYSCJOBYXYFOYSDYAEKDBYEWJOBYCODO",
"XRCXMXRBMXRBINAXWXENXRCXZDJCAXDVINAXBNCN",
"WQBWLWQALWQAHMZWVWDMWQBWYCIBZWCUHMZWAMBM",
"VPAVKVPZKVPZGLYVUVCLVPAVXBHAYVBTGLYVZLAL",
"UOZUJUOYJUOYFKXUTUBKUOZUWAGZXUASFKXUYKZK",
"TNYTITNXITNXEJWTSTAJTNYTVZFYWTZREJWTXJYJ",
"SMXSHSMWHSMWDIVSRSZISMXSUYEXVSYQDIVSWIXI",
"RLWRGRLVGRLVCHURQRYHRLWRTXDWURXPCHURVHWH"]

Dá para ver que o que a gente quer, é o terceiro elemento da lista. Eu só não estou a conseguir pensar em como vou fazer isto por força bruta. Se todos os digitos tivessem o mesmo numero de caracteres (quando escritos por extenso), Eu sacava esses primeirso digitos de cada uma das listas geradas pelo decryptCesar e ia comparado, mas nem todos os digitos tem o mesmo numero de caracteres escritos por extenso e eu não estou a ver como vou fazer isto...

Ideias?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Viva pessoal. Ainda sou bastante novo aki pelo forum...

tb sou de lei 1º ano e tambem tou a fazer esse trabalho que ja ta kuase pronto..

Em relação a esse exercicio, o que eu fiz foi sacar para fora da lista as strings e junta-las todas numa so. Depois disso é fácil, basta usar a função extrair que esta no enunciado fazendo com k ela procura na string palavras como: um, dois tres...... e tranforme em 1,2,3....

Mais complicado que isso é conseguir dizer depois de decifrar kual foi a chave usada :S

Aquele abraço, Pires

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

podias ir procurando números no topo das strings (usando Pattern matching, por exemplo)...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

viva amigo Rui Carlos.

Pois... acredito que sim mas isso ja é mta areia po meu camião :confused: ja agora.. o k significa isso de pattern matching assim resumidamente.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

pattern matching é concordância de padrões.

por exemplo quando fazes:

f []=1
f (x:xs)=2

estás a usar pattern matching, pois estás a testar quando o argumento está de acordo com o padrão '[]' (list vazia) ou com o padrão 'x:xs' (um elemento concatenado com uma lista).

para saberes qual foi a chave usada não acho muito boa ideia juntar as strings todos, acho que é melhor usar um 'map'.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pessoal, peço imenso desculpa... mas eu estava aqui a escrever um texto bastante detalhado sobre a forma como resolvi este exercício e o firefox crashou-me sem ter qualquer tipo de texto gravado e sinceramente não estou com paciência para voltar a escrever tudo o que tinha escrito (já ia num texto grande). Não vou aqui colocar o meu código por razões óbvias, estava a escrever a forma como resolvi o problema, mas isto crashou...

Muito resumidamente foi isto que fiz:

Tenho uma lista de números de 0 a 9 escritos por extenso, pega em cada um desses elementos e verifico se esta na cifra, se estiver passo a próxima posição da cifra e volto a verificar se tenho lá um numero, caso contrário sai fora. Se chegar ao fim e só encontrar-mos números, porreiro, encontramos a nossa mensagem desencriptada. E fazer isto isto para as 26 cifras possíveis da cifra de césar.

Esta foi a técnica que eu usei mais parecida com força bruta, que é isso que se pretende neste exercício. Esta não é bem a minha ideia de força bruta, mas é o mais parecido que arranjei segundo o que diz no enunciado:

Para isso, implemente uma função que faça um ataque à forçaa bruta, experimentando as chaves todas e procurando as palavras “UM”, “DOIS”, etc., no texto resultante da aplicação da funçãao de decifragem com cada chave.

@Rui Carlos

Não será um bocado complicado usar pattern matching e força bruta?

@[d-_-b]

E se nesta altura ainda não sabes o que é pattern matching... Já devias saber lol..

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

@Rui Carlos

Não será um bocado complicado usar pattern matching e força bruta?

numeros []=True
numeros ('u':'m':xs)=numeros xs
numeros ('d':'o':'i':'s':xs)=numeros xs
...
numeros _=False

esta função permitia-te saber se uma string era uma sequência de números.

com um 'map' aplicavas-la a todos os elementos da lista.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

hum... realmente... tenho de estudar o raio do map, nunca percebi lá muito bem como funciona...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É + critico não saber o que é pattern matching do que ter conhecimentos sobre a função map. Resolvi o problema sem o uso dela, deve querer significar alguma coisa... Se o uso dela simplificar alguma coisa, óptimo, mas se eu consegui sem ela... I rest my case!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ah ja percebi amigo rui carlos! nao conhecia isso por esse nome "pattern matching" pensei k pelo nome fosse outra coisa mais dificil. hehe

knt a ti nazgulled concordo inteiramente com o good_in_bed... o jbb ja explicou a função map ao pormenor n vezes e é mt simples e pratica.. nesta altura ja devia tar bem sabidinha. :thumbsup: lolol Quanto ao trabalho tou como tu... nao percebo bem o k kerem dizer com força bruta. eu arranjei uma maneira k resolver a tarefa mas n sei s é por força bruta.  :hmm:

Aquele abraço, Pires

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim é verdade, se eu de facto fosse as aulas todas era bem provável que eu já a soubesse...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois...Bem me parecia...por isso é que falei...É muito facil fazeres pattern matching sem o saberes...Já o map...tem o seu kê...Bom trabalho!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora