Desafio vogais:

47 respostas
pedroroxd
Pessoal, um cara de um outro tópico fez uma pergunta de como transformar as vogais de uma frase digitada pelo usuário em "X". (Eu só troquei o X por *) Eu respondi:
public class TrocaVogal {

	public static void main(String[] args) {
        String[] lista = new String[]{ "A","E", "I", "O", "U",};
        
				Scanner scn = new Scanner(System.in);
				System.out.println("Digite a Palavra ou Frase: ");
		        String palavra = scn.nextLine().toUpperCase();  //passa pra maiúsculo para nao ter diferença		  
		        
		         for (int cont=0;cont<lista.length;cont++) {
		        	 palavra = palavra.replace(lista[cont],"*");
		         }
		           
		         System.out.println("Palavra com substituição: " + palavra);  
	}
}
Bom, o desafio é o seguinte Eu digitei a frase, e obtive a seguinte saída: [color=red]Palavra com substituição:[/color] D*S*F** P*R* *S G*J**N*S. T*NT*M D*SC*BR*R * S*GN*F*C*D* R**L D*SS* FR*S*. Proponho um algoritimo, que teste as possibilidades, assim descubrindo qual é a frase "escondida"... Não é para sair chutando não... O algorítimo vai "xutar" para você, e você vai pegar a frase que tiver sentido... Ex.: Palavra com substituição: F*C* Saída:
FICI
FICO
FACA
FOCI
FICA
FAFI
E muitas outras combinações Vão ser muitas saídas... Se quiserem usar um arquivo .txt com um dicionário, para se não tiver sentido uma palavra, não ser impressa pode usar Ex.: Nesse caso, as unicas saída seriam FICA e FACA

Ou fassam no brutal force mesmo, com todas as possiveis combinações (que são muitas).
Antes estava com "X", mas por sugestão do marky, passei para *, para não confundir com a letra *.

Um espírito de porco já falou o que é a frase, mas o desafio continua, de um algorítimo feito para descubrir (e não a mente humana)

Boa sorte ae =D

47 Respostas

rogelgarcia

Se eu nao estiver enganado… o número de respostas possíveis… tem mais de 20 algarismos

N

A resposta seria “Desafio para os gujaanes. Tentem descobrir o significado real dessa frase.”

Estou em dúvida que palavra seria GXJXXNXS, mas acho que é isso, fiz de cabeça mesmo.

rogelgarcia

Acho que ele escreveu errado…

Talvez o certo seria GUJEIROS

ichi… o desafio tá furado

rogelgarcia

Esse desafio tá muito complexo… vou deixar pro autor dele postar a resposta…

rogelgarcia

Refiz os calculos… o número de possibilidades nao tem mais de 20 algarismos…

N

Fiz o código aqui e testei, ta meio gambiarrado e da pra melhorar mais funciona.

public void Desvendar(String mensagem) {
        char[] vogais = {'A', 'E', 'I', 'O', 'U'};
        char[] nova = mensagem.toUpperCase().toCharArray();
        List<Integer> pos = new ArrayList<Integer>();
        for (int i = 0; i < nova.length; i++) {
            if (nova[i] == 'X') {
                pos.add(i);
            }
        }
        if (!pos.isEmpty()) {
            for (Iterator it = pos.iterator(); it.hasNext();) {
                Integer elem = (Integer) it.next();
                for (char v : vogais) {
                    nova[elem]=v;                    
                    Desvendar(String.copyValueOf(nova));
                    if (!String.copyValueOf(nova).contains("X"))
                    System.out.println(String.copyValueOf(nova));
                }             
            }

        }
    }

A frase que você passou levaria muitooooo tempo no programa ^^. Se não me engano será 17210368 saídas.

rogelgarcia

Poxa… começei uma solução aqui… já tá dando muito mais linhas… :shock:

rogelgarcia

A minha solucao nao é recursiva…

Bem bolada essa solução…

rogelgarcia

Uma observaçao em relaçao ao algoritmo… estao sendo apresentados valores repetidos… (mas todos aparecem)

AA
AE
[color=red]EA[/color]
[color=darkblue]EE[/color]
[color=red]EA[/color]
[color=darkblue]EE[/color]

Tem algum detalhe pra resolver…

rogelgarcia

Acho que é pela caracteristica recursiva dele…

se monta uma arvore… aí aparecem esses valores duplos…

Tentei mecher aqui… mas nao deu muito certo…

rogelgarcia

Acho que agora.. tá mais otimizado

public void desvendar(String mensagem) {
		char[] vogais = { 'A', 'E', 'I', 'O', 'U' };
		char[] nova = mensagem.toUpperCase().toCharArray();
		for (int i = 0; i < nova.length; i++) {
			if (nova[i] == 'X') {
				for (char v : vogais) {
					nova[i] = v;
					if (!String.copyValueOf(nova).contains("X"))
						System.out.println(String.copyValueOf(nova));
					else
						desvendar(String.copyValueOf(nova));

				}
				break;
			}
		}
	}
evertonsilvagomesjav

rogel eu to rindo de mais disso cara, vc nao tem ideia kkkk

É porque ele também nao entende de static... 

Vejam: 

http://www.guj.com.br/posts/list/201867.java 

 

Já que é pra por fogo.. vamos por...
rogelgarcia
evertonsilvagomesjava:
rogel eu to rindo de mais disso cara, vc nao tem ideia kkkk
É porque ele também nao entende de static... 

Vejam: 

http://www.guj.com.br/posts/list/201867.java 

 

Já que é pra por fogo.. vamos por...
hahahah.. mas num é?
evertonsilvagomesjav

kkkkk, eu ri de mais hauahu

N

Como eu disse 1h da manhã, sono danado, rs, seu algoritmo ficou melhor mesmo, a idéia seria não usar a recursividade já que, dizem, ser um método lento, a propósito como você montou em árvore os resultados?

off: Legal este post do static, o cara realmente foi infeliz em criticar.

pedroroxd

Seria GUJIANOS, e nao GUJAANOS!..
Mas era pra fazer com algoritimo, e não de cabeça =P

rogelgarcia

nephestos:
Como eu disse 1h da manhã, sono danado, rs, seu algoritmo ficou melhor mesmo, a idéia seria não usar a recursividade já que, dizem, ser um método lento, a propósito como você montou em árvore os resultados?

O negócio a árvore é que achei que pela recursividade essa arvore seria montada tipo… (mas nao montei os resultados para serem impressos em forma de arvore nao…)

XX  -AX  - AA
             - AE
      -EX  - EA
             - EE

E por aí vai… causando resultados duplicados… mas acho que nao era esse o problema nao…

Mas o algoritmo nao é meu nao… é o seu… só que dei uma ajustada :smiley:

Depois eu posto que eu tava montando… terminei ainda nao…

Mas o simples fato da recursividade nao causa lentidao nao… o que pode acontecer… é que se houver muitas chamadas recursivas dá StackOverflowError

peczenyj

Acho o desafio interessante porem seria bom ter um dicionario :wink:

rogelgarcia

Ichi… é amigo do cara do static

pedroroxd

vlw…
mas agora o espírito de porco fez pela mente…
mas o desafio continua…
não é só achar a frase, mas sim bolar um algorítimo…
Quando ao dicionário em extenção .txt tem vários, é só baixar!

peczenyj

Não, eu quis dizer um dicionario de palavras para procurar as palavras e classificar pelas mais provaveis.

rogelgarcia

Há só… heheheh

De qualquer maneira eu tava só zuando um tikim… vlw

Marky.Vasconcelos

Hmm… interessante… segunda feira eu desenvolvo um algoritmo que adivinhe de acordo com um dicionario.

Só tem um pequeno problema, se X é qualquer vogal então a letra X é o que?

Para meu algoritmo vou considerar x minusculo a consoante X e maisculo sendo qualquer vogal.

pedroroxd

Mark_Ameba:
Hmm… interessante… segunda feira eu desenvolvo um algoritmo que adivinhe de acordo com um dicionario.

Só tem um pequeno problema, se X é qualquer vogal então a letra X é o que?

Para meu algoritmo vou considerar x minusculo a consoante X e maisculo sendo qualquer vogal.


Opa ameba… nao tinha penssado nisso! kkkk
Então eu editei o primeiro post, trocando por *

Marky.Vasconcelos

pedroroxd:
Mark_Ameba:
Hmm… interessante… segunda feira eu desenvolvo um algoritmo que adivinhe de acordo com um dicionario.

Só tem um pequeno problema, se X é qualquer vogal então a letra X é o que?

Para meu algoritmo vou considerar x minusculo a consoante X e maisculo sendo qualquer vogal.


Opa ameba… nao tinha penssado nisso! kkkk
Então eu editei o primeiro post, trocando por *

Hmm… agora faz mais sentido.

De qualquer modo, apenas segundo desenvolvo algo.

E plz… me chame de Marky ^^

pedroroxd

hihi
ok…
É pq tem outro mark tb =D

tgmarinho

pra mim isso não ta tão basico assim rsrs =(
mas vou tentar alguma coisa, bom q vcs sabem alguns métodos interessantes ae ^^

evertonsilvagomesjav

Ichi… é amigo do cara do static

kkkkkkk amigo do cara do static eh foda hashuhua

magocebolinha

eu então nem falo nada… cara esse foi o post do ano… mto bom…

magocebolinha

Ichi… é amigo do cara do static

huAHAuhAUHUAhuaHUHAuaHAUhAUAHuAHUAhaUHauhaUAhuaHUAhaUAhuaHAUhaUAhuaHAUhAUahuAHUAhaUHAuaHUAhaUHAuhaUAhauHAuhaUAhuaHauhuaHUahUAHauAHUahAUHauhAUahuAHauhAUahuahauhaUHAuaHUahAUHauAHuahaUHAuaHUAhauHAuhaUahuAHUAhaUHauaHUAhaUHAuaH… AFF… alguém me dá um copo de agua…

pedroroxd

Meu desafio ta virando chat -.-

rogelgarcia

Solução.. ficou grandinho.. mas tá bem eficiente... é na força bruta ele... são no total 4635 possibilidades:

package snippet;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class TrocaVogais {
	
	static String frase = "D*S*F** P*R* *S G*J**N*S. T*NT*M D*SC*BR*R * S*GN*F*C*D* R**L D*SS* FR*S*."; 

	public static void main(String[] args) {
		new TrocaVogais().doit();
	}
	
	private void doit() {
		String[] palavras = extrairPalavras(frase);
		int possibilidadeCounter = 0;
		for (int i = 0; i < palavras.length; i++) {
			String palavra = palavras[i];
			int[] posicoes = contarCaracteres('*', palavra);
			if(posicoes.length > 0){
				possibilidadeCounter += mostrarPossibilidades(palavra, posicoes);
			}
		}
		System.out.println(possibilidadeCounter);

	}
	
	private int mostrarPossibilidades(String palavra, int[] posicoes) {
		int possibilidadeCounter = 0;
		System.out.println("Possibilidades para "+palavra);
		CombinacoesIterator combinacoesIterator = new CombinacoesIterator(posicoes.length, new char[]{'A','E', 'I', 'O', 'U'});
		while(combinacoesIterator.hasNext()){
			char[] charsPossibilidade = combinacoesIterator.next();
			String possibilidade = merge(palavra, charsPossibilidade, posicoes);
			System.out.println(" >> "+possibilidade);
			possibilidadeCounter++;
		}
		return possibilidadeCounter;
	}



	private String merge(String palavra, char[] charsPossibilidade, int[] posicoes) {
		char[] charArray = palavra.toCharArray();
		for (int i = 0; i < posicoes.length; i++) {
			charArray[posicoes[i]] = charsPossibilidade[i];
		}
		return String.valueOf(charArray);
	}

	private int[] contarCaracteres(char c, String palavra) {
		List<Integer> counter = new ArrayList<Integer>();
		for (int i = 0; i < palavra.length(); i++) {
			char letra = palavra.charAt(i);
			if(letra == c){
				counter.add(i);
			}
		}
		return toIntArray(counter);
	}

	private int[] toIntArray(List<Integer> counter) {
		int[] resultado = new int[counter.size()];
		for (int i = 0; i < resultado.length; i++) {
			resultado[i] = counter.get(i);
		}
		return resultado;
	}

	public String[] extrairPalavras(String frase){
		return frase.split("\s+");
	}
}

class CombinacoesIterator implements Iterator<char[]>{
	
	int[] posicoes;
	char[] valores;
	
	int posicaoTrocaAtual = 0;
	
	double iteracoes;
	
	public CombinacoesIterator(int numeroPosicoes, char[] valores){
		this.valores = valores;
		posicoes = new int[numeroPosicoes];
		posicoes[0] = -1;
		
		iteracoes = Math.pow(valores.length, numeroPosicoes);
	}

	@Override
	public boolean hasNext() {
		return iteracoes > 0;
	}

	@Override
	public char[] next() {
		iteracoes -= 1;
		posicoes[posicaoTrocaAtual]++;
		boolean reset = false;
		while(posicoes[posicaoTrocaAtual] == valores.length){
			posicoes[posicaoTrocaAtual] = 0;
			posicaoTrocaAtual++;
			posicoes[posicaoTrocaAtual]++;
			reset = true;
		}
		if(reset){
			posicaoTrocaAtual = 0;
		}
		char[] result = new char[posicoes.length];
		for (int i = 0; i < result.length; i++) {
			result[i] = valores[posicoes[i]];
		}
		return result;
	}

	@Override
	public void remove() {
		throw new UnsupportedOperationException();
	}
	
}
pedroroxd

Legal…
O meu fico +/- assim também…
Mas axo que dá pra dar uma enxugada legal

Marky.Vasconcelos

Não rodei a solução do cara ai por que to sem compilador, ams a resposta é uma frase com sentido ou apenas todas as possibilidades?

rogelgarcia

Todas as possibilidades

Marky.Vasconcelos

Rlx… segunda meu algoritmo mostra uma possibilidade que existe.

pedroroxd

Blza…
Dei uma enxugada no meu aki, e to diminuindo 1 poko +

Marky.Vasconcelos

Alguém tem uma wordlist em portugues?

To procurando na internet e não acho, e o speedy também não ajuda.

Se alguém tiver uma e me passar já é um bom adianto.

pedroroxd

To sem aki…
Faz tempo que não uso… A minha tava desatualizada (reforma ortográfica) e deletei…
Agora ta foda de achar

Marky.Vasconcelos

Dificil mesmo, só falta isso para eu completar meu código.

rogelgarcia

Para um algorítmo que mostre apenas uma possibilidade… vai gastar umas 5 páginas do fórum :smiley:

Nao tem como saber se é DESAFIO ou DESAFIA

PARA ou PERA

GUJIANOS… ou seja lá o que o cara quis dizer aqui… já sambou tudo

E ou A ou O

DESSA DISSO DESSE

Mas umas 10 possibilidades até q dá…

Marky.Vasconcelos

Meu algoritmo vai pelo menos mostrar todas possibilidades reais de acordo com um dicionario.

Mas ainda falta o dicionario vou montar um copiando textos. Vou ter que fazer um programa primeiro só para criar a lista de palavras =/

Marky.Vasconcelos

Ta ai uma parte do código.

Esse é o que descobre a palavra de acordo com uma Lista.

EDITADO: Código completo no post abaixo.

Main pra ver como funciona. Só falta uma lista de palavras de verdade e o algoritmo que testa todas as palavras.

Marky.Vasconcelos

Terminei meu algoritmo e com a lista de palavras que encontrei o resultado foi. Pelo menos são todas palavras reais.

desafia/desafie/desafio para/pare/pari/paro/pera/peru/pira/poro/pura/puro as/os gujianos tentam/tentem descobrir a/e/o significada/significado real dessa/desse/disse/disso frase/fresa/frese/freso/frisa/frise/friso

Agora o algoritmo.

package word;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class WordList {
	private List<String> list;

	public WordList(List<String> list) {
		this.list = list;
	}

	public WordList(File file) throws FileNotFoundException {
		list = new ArrayList<String>();
		Scanner sc = new Scanner(new FileReader(file));
		while (sc.hasNext())
			list.add(sc.nextLine());
	}

	public WordList filter(String param) {
		param = param.toLowerCase();
		filterByLength(param.length());
		for (int i = 0; i < param.length(); i++) {
			char c = param.charAt(i);
			if (c == '*')
				filterByCharMatch(i, 'a', 'e', 'i', 'o', 'u');
			else
				filterByCharMatch(i, c);
		}
		return this;
	}

	private void filterByLength(int lght) {
		List<String> newList = new ArrayList<String>();
		for (String s : list)
			if (s.length() == lght)
				newList.add(s);
		list.clear();
		list.addAll(newList);
	}

	private void filterByCharMatch(int idx, char... criterias) {
		List<String> newList = new ArrayList<String>();
		main: for (String s : list) {
			s = s.toLowerCase();
			char c = s.charAt(idx);
			for (char crit : criterias)
				if (c == crit) {
					newList.add(s);
					continue main;
				}
		}
		list.clear();
		list.addAll(newList);
	}

	public String toString() {
		if (list.size() == 0)
			return "()";
		StringBuilder builder = new StringBuilder();
		for (String s : list)
			builder.append(s).append("/");
		builder.delete(builder.length() - 1, builder.length());
		return builder.toString();
	}

	public List<String> getResult() {
		return list;
	}

	public WordList clone() {
		return new WordList(new ArrayList<String>(list));
	}
}
package word;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;

public class Sentence {
	private WordList baseList;
	private List<String> sentence;

	{
		File wordsFile = new File("C:/wordlist.txt");
		try {
			baseList = new WordList(wordsFile);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}

	public Sentence(String s) {
		sentence = new ArrayList<String>();
		String[] ss = s.split(" ");
		for (String str : ss)
			sentence.add(str);
	}

	public String resolve() {
		StringBuilder builder = new StringBuilder();
		for (String s : sentence)
			builder.append(baseList.clone().filter(s).toString()).append(" ");
		return builder.toString();
	}

	public static void main(String[] args) {
		Sentence sentence = new Sentence(
				"D*S*F** P*R* *S G*J**N*S T*NT*M D*SC*BR*R * S*GN*F*C*D* R**L D*SS* FR*S*");
		System.out.println(sentence.resolve());
	}
}

E o arquivo de wordlist está anexado.

É… impossivel um algoritmo adivinhar exatamente que frase é. Mas cheguei perto ^^

PS: Adicionei a palavra Gujianos no dicionario por que ela não existia.

pedroroxd

HUAhuahuuha
legal mark!
Bem interessante…

Mark_Ameba:

E o arquivo de wordlist está anexado.

kd? O_o

Marky.Vasconcelos

Agora que reparei é que o arquivo é maior que 512Kb

Baixem desse link:
http://www.gustavoroberto.blog.br/wp-content/uploads/2008/01/wordlist_pt_br.txt
Abram e em Salvar Como… coloque wordlist.txt e no C: (Fiquei com preguiça de fazer código multi-plataforma, mas é só alterar no código)

PS:
Coma frase
“DSFO PAR S GJNS TNTEM DSCBRR O SGNFC*DO RL DSSA FRSE”
O resultado foi:
“desafio para/pare/pari/paro as/os gujianos tentem descobrir o significado real dessa frase/frese/frise”

pedroroxd

Legal maky! Vlw…
Vo ver se tá com a reforma ortográfica, e remover um tanto de palavras inuteis, do tipo “desnivelásseis
kkkkk
flws!

Criado 26 de março de 2010
Ultima resposta 30 de mar. de 2010
Respostas 47
Participantes 8