Como encurtar esse código?

	public void criptografa() {
		setTexto(ler.next());
	String resultado=""; 
	char[] traduza = getTexto().toCharArray();
	for( int i=0; i<traduza.length;i++) {
		
		switch(traduza[i]){
		
		case 'a' : traduza[i]= '1';break;	
		case 'b' : traduza[i]= '2';break;
		case 'c' : traduza[i]= '3';break;
		case 'd' : traduza[i]= '4';break;
		case 'e' : traduza[i]= '5';break;
		case 'f' : traduza[i]= '6';break;
		case 'g' : traduza[i]= '7';break;
		case 'h' : traduza[i]= '8';break;
		case 'i' : traduza[i]= '9';break;
		case 'j' : traduza[i]= 'a';break;
		case 'k' : traduza[i]= 'b';break;
		case 'l' : traduza[i]= 'c';break;
		case 'm' : traduza[i]= 'd';break;
		case 'n' : traduza[i]= 'e';break;
		case 'o' : traduza[i]= 'f';break;
		case 'p' : traduza[i]= '!';break;
		case 'q' : traduza[i]= '@';break;
		case 'r' : traduza[i]= '#';break;
		case 's' : traduza[i]= '$';break;
		case 't' : traduza[i]= '%';break;
		case 'u' : traduza[i]= '¬';break;
		case 'v' : traduza[i]= '&';break;
		case 'w' : traduza[i]= '*';break;
		case 'x' : traduza[i]= '(';break;
		case 'y' : traduza[i]= ')';break;
		case 'z' : traduza[i]= '0';break;
		}   
		resultado= resultado+traduza[i];
	}
	System.out.println(resultado+"\n numero de caracteres: "+traduza.length);
}

existe alguma forma de traduzir com o mesmo método?
por algum motivo quando tento dar return; no resultado, mesmo deixando o método como string ele diz que é um tipo incopativel, pq?

Mas o que tu tentou retornar? Foi avariável resultado o array traduza? Sobre otimizar o programa, dá para ‘encurtar’ se a conversão/tradução de um caractere para o outro for gerido por uma lei de formação (uma função matemática), um padrão.
Suponhamos a seguinte lei de formação: y = x - (x / 13). Então todo caractere de traduza será igual à subtração do valor informado no case pelo quociente inteiro do valor informado por 13.
Ex: ‘a’ vale 97 em decimal na tabela ASCII. Então traduza[0] = ‘Z’, pois y = 97 - (97 / 13) -> y = 97 - 7 -> y = 90 que é o valor decimal de ‘Z’ na tabela ASCII.

Daí tu poderia fazer algo como:

int valor = 0;

for(int i = 0; i < traduza.length; i++){
	valor = (int)traduza[i];
	traduza[i] = (char)(valor - valor / 13);
	
	resultado += traduza[i];
}

o resultado.

Funcionando o retorno e o que eu sugeri (modifiquei o seu código para poder testar):

import java.util.Scanner;

public class Criptografia {
	public static void main(String[] args){
		Criptografia criptografia = new Criptografia();
		String stringFormada = null;
		
		stringFormada = criptografia.criptografar();
		
		System.out.print("Resultado retornado: " + stringFormada);
	}
	
	public String criptografar(){
		Scanner leitor = new Scanner(System.in);
		System.out.print("\nInforme o texto: ");
		String texto = leitor.next();
		String resultado = ""; 
		char[] traduza = texto.toCharArray();
		int valor = 0;
		for(int i = 0; i < traduza.length; i++) {
			valor = (int)traduza[i];
			
			traduza[i] = (char)(valor - valor / 13);   
			resultado += traduza[i];
		}
		System.out.println("Resultado: " + resultado + "\nNúmero de caracteres: " + traduza.length);
		return resultado;
	}
}

Rodando…

image

Ou seja, se você criar uma lei de formação você consegue ‘enxugar’ o seu código drasticamente.

1 curtida

obrigado, foi uma solução bem racional. Como eu poderia fazer a máquina traduzir de volta? tipo, pra transformar em inteiro ele exclui as casas decimais, então mesmo que eu faça o processo inverso (valor+valor/13) , ele não retorna o mesmo caractere. 97/13 = 7,46…, pra virar inteiro ele transforma em 7, mas ai 7*1, 91 que é h em ASCII. existe alguma forma de traduzir dnv chamando outro método?

Para encontrar o valor de x expressão y = x - x / 13, perceba que temos uma subtração de números fracionários. Para subtrair números fracionários, faz-se o RMDC - Redução ao Mesmo Denominador Comum:
-> Obtém-se o MMC (Mínimo Múltiplo Comum dos denominadores. Como x - x / 13 equivale a x / 1 - x / 13, então temos os denominadores 1 e 13. Como 1 é o fator trivial fator de qualquer número, na prática faz-se:

13 / 1 = 13 * x = 13x
13 / 13 = 1 * x = x

Então, em RMDC: y = (13x - x) / 13. Como queremos saber quanto vale x. Nós podemos fazer isso para todos o membros da equação. Logo:

13y / 13 = (13x - x) / 13

Daí tem uma propriedades das equações que, se os dois membros de uma equação são divididos ou multiplicados por um mesmo número, o resultado não se altera. Então, se pode descartar o fator ou divisor comum. Com efeito:

13y = 13x - x -> 13y = 12x. Resolvendo: x = 13y / 12

Logo, para ‘encriptar’ usa-se y = x - x / 13 e para decriptar usa-se x = 13y / 12.

Supondo 97 (a): y = 97 - 97 / 13 = 97 - 7 = 90
x = 13 * 90 / 12 -> 1.170 / 12 = 97,5, logo 97.

No entanto, isso foi só o exemplo, pois na decriptação acontece alguns problemas relacionados às cadas decimais ignoradas. Por exemplo:

Se x = 64, y = 64 - 64 / 13 -> 64 - 4 = 60.
x = 13y / 12 -> 13 * 60 / 12 -> 780 / 12 = 65. Isso acontece porque 64/13 é aproximadamente 4,92, muito próximo de 5.

Então, você deve usar uma outra lei de formação que simplifique a construção e a desconstrução, ou alterar a forma como as coisas funcionam. Veja:

import java.util.Scanner;

public class Criptografia {
	public static void main(String[] args){
		Criptografia criptografia = new Criptografia();
		String stringCriptografada = null;
		String stringDecriptografada = null;
		
		stringCriptografada = criptografia.criptografar();
		
		System.out.print("\nResultado retornado criptografado: " + stringCriptografada);
		
		stringDecriptografada = criptografia.decriptografar(stringCriptografada);
		
		System.out.print("\nResultado retornado decriptografado: " + stringDecriptografada);
	}
	
	public String criptografar(){
		Scanner leitor = new Scanner(System.in);
		System.out.print("\nInforme o texto: ");
		String texto = leitor.next();
		String resultado = ""; 
		char[] traduza = texto.toCharArray();
		int valor = 0;
		
		for(int i = 0; i < traduza.length; i++) {
			valor = traduza[i];
			
			traduza[i] = (char)(valor - valor / 13);   
			resultado += traduza[i];
		}
		System.out.println("\nResultado criptografado: " + resultado + "\nNúmero de caracteres: " + traduza.length);
		return resultado;
	}
	
	public String decriptografar(String cripta){
		char[] decriptado = cripta.toCharArray();
		String resultado = "";
		int valor = 0;
		
		for(int i = 0; i < decriptado.length; i++) {
			valor = decriptado[i];
			
			decriptado[i] = (char)(13 * valor / 12);
			resultado += decriptado[i];
		}
		System.out.println("\nResultado decriptografado: " + resultado + "\nNúmero de caracteres: " + decriptado.length);
		return resultado;
	}
}

Rodando…

1 curtida

Impressionante essa resposta. :scream: