Problema com lógica : Uma String "Progressiva"

6 respostas
Marky.Vasconcelos

Bem eu estou tentando fazer com que uma String vá progredindo, algo como:
Antes do progresso: ‘a’
Depois do progresso: ‘b’

Com um caractere eu consegui mas eu quero que quando ele chegar no ultimo char possivel : “((char) 255)”, ele aumente um caractere e aumente um do anterior e se o anterior atingir o maximo voltar ao (char) 0 e o anterior progredir.
Algo como:
Antes do progresso: ‘zaz’
Depois do progresso: ‘zbaa’

Eu até agora fiz isso:

package core.engine.reverse;

public class ProgressiveString {
	private char[] probly = new char[512];
	private int pos;

	public ProgressiveString() {
		probly[0] = (char) 1;
		pos = 0;
	}

	private void increase() {
		for (int i = 0; i <= pos; i++) {
			if (((int) probly[i]) == 255)
				probly[i] = (char) 1;
			else
				probly[i] = (char) (probly[i] + 1);
		}
		probly[++pos] = (char) 1;
	}

	public void upgrade() {
		if (((int) probly[pos]) % 255 == 0)
			increase();
		else
			probly[pos] = (char) (((int) probly[pos]) + 1);
		System.out.println("'"+getValue()+"':"+pos);
		try {
			Thread.sleep(100);
		} catch (Exception e) {
		}
	}

	public String getValue() {
		return String.valueOf(probly).trim();
	}
}

Varias tentativas antes dessa mas continua em vão.
Será que alguém sabe como é possível obter o efeito que eu quero?

6 Respostas

Marky.Vasconcelos

O teste que estou realizando:

ProgressiveString string = new ProgressiveString();
		while (!string.getValue().equals("aa"))
			string.upgrade();
System.out.println(string.getValue());

Nesse caso ele não para.

Mas nesse sim:

ProgressiveString string = new ProgressiveString();
		while (!string.getValue().equals("z"))
			string.upgrade();
System.out.println(string.getValue());
ViniGodoy

Use o operador de % para criar um contador circular.

Por exemplo:

int circular = 0; for (int i = 0; i < 30; i++) { circular = (circular + 1) % 10; //De 0 até 9 System.out.println(circular); }

PS: Talvez tenha que fazer umas continhas, já que ‘a’ não é zero. Mas envolve simplesmente subtrair e somar o valor de ‘a’ antes e depois da soma.

P

nao entendi … :?

Marky.Vasconcelos

Eu sei que ‘a’ não é zero é que quis exemplificar no meu exemplo, eu estou usando os caracteres de 30 a 230.
Mas vou usar sua dica e tentar fazer (denovo pela 3 vez)

Marky.Vasconcelos
Agora outro problema, vai só até 3 caracteres =/ Olha oque fiz:
package core.engine.reverse;

public class ProgressiveString {
	private char[] probly = new char[32];
	private int pos;
	private static final int LIMIT = 125, BEGIN = 30;

	public ProgressiveString() {
		probly[0] = BEGIN % LIMIT;
	}

	public int getNext(int charInt) {
		return 0;
	}

	private void increase() {
		int increaseNext = 0;
		loop: for (int i = pos; i >= 0; i--) {
			if (probly[i] >= LIMIT - 1) {
				probly[i] = BEGIN % LIMIT;
				increaseNext = 1;
			} else {
				if (increaseNext == 1) {
					probly[i] = (char) ((probly[i] + 1) % LIMIT);
					increaseNext = 0;
					break loop;
				}
			}
		}
		if (increaseNext == 1) {
			System.out.println("Increase: "+pos);
			pos++;
			probly[pos] = BEGIN % LIMIT;
		}
	}

	public void upgrade() {
		if (probly[pos] >= LIMIT - 1)
			increase();
		probly[pos] = (char) ((probly[pos] + 1) % LIMIT);
	}

	public String getValue() {
		return String.valueOf(probly).trim();
	}
}
Outra solução?
Marky.Vasconcelos

Depois de 6 meses um dia que meu modem queimou eu decedi fazer isso denovo (Falta do que fazer).

E aqui esta o resultado:

package br.com.brute.engine;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class ProgressiveString {
	private List<CharInterval> charsIntervals;
	private int charIntervalIndex;
	private int minChar;
	private int maxChar;
	private char[] string;

	public ProgressiveString(CharInterval... charIntervals) {
		this("", charIntervals);
	}

	public ProgressiveString(String original, CharInterval... charIntervals) {
		if (charIntervals.length == 0)
			throw new RuntimeException("CharIntervals can't be null!");
		string = original.toCharArray();
		charsIntervals = Arrays.asList(charIntervals);
		Collections.sort(charsIntervals);
		charIntervalIndex = 0;
		minChar = (int) charsIntervals.get(0).first;
		maxChar = (int) charsIntervals.get(charsIntervals.size() - 1).last;
	}

	private char[] copyChars(int start, char[] old) {
		char[] str = new char[start + old.length];
		for (int i = 0; i < old.length; i++)
			str[start + i] = old[i];
		return str;
	}

	public void increase() {
		char[] str = string.clone();
		for (int i = str.length - 1; i >= 0; i--) {
			IncreaseResult result = tryIncrease(str[i]);
			str[i] = result.newChar;
			if (result.result == IncreaseResult.INCREASED)
				break;
			if (result.result == IncreaseResult.DECREASED) {
				if (i - 1 == -1) {
					str = copyChars(1, str);
					str[0] = (char) minChar;
					break;
				}
			}
		}
		string = str.clone();
	}

	private IncreaseResult tryIncrease(char c) {
		if (((int) c) == maxChar) {
			charIntervalIndex = 0;
			return new IncreaseResult((char) minChar, IncreaseResult.DECREASED);
		} else
			return new IncreaseResult(nextChar(c), IncreaseResult.INCREASED);
	}

	private char nextChar(char c) {
		int i = (int) c;
		if (i == charsIntervals.get(charIntervalIndex).last) {
			charIntervalIndex++;
			return (char) charsIntervals.get(charIntervalIndex).first;
		}
		return (char) (((int) c) + 1);
	}

	@Override
	public String toString() {
		return new String(string);
	}

	public static void main(String[] args) {
		ProgressiveString str = new ProgressiveString(String.valueOf((char) 33),
				new CharInterval('a', 'z'), new CharInterval('A','Z'), new CharInterval('0','9'));
		JFrame frame = new JFrame("MutableString");
		JLabel label = new JLabel(" ");
		frame.add(label);
		frame.pack();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
		int loops = 2500;
		for (int i = 0; i < loops; i++) {
			str.increase();
			label.setText(str.toString());
		}
	}

	public static class CharInterval implements Comparable<CharInterval> {
		protected int first;
		protected int last;

		public CharInterval(int first, int last) {
			this.first = first;
			this.last = last;
		}

		public boolean canIncrease(char character) {
			int i = (int) character;
			return i >= first && i <= last;
		}

		@Override
		public int compareTo(CharInterval arg0) {
			if (first < arg0.first)
				return -1;
			if (first > arg0.first)
				return 1;
			return 0;
		}
	}

	private class IncreaseResult {
		protected char newChar;
		protected int result;

		public IncreaseResult(char newC, int result) {
			newChar = newC;
			this.result = result;
		}

		protected static final int INCREASED = 0;
		protected static final int DECREASED = 1;
	}
}

E agora como novidade eu fiz essa classe chamada CharInterval que ajuda a selecionar quais chars voce quer usar.

E se alguem quer saber o motivo que fiz isso é para usar em um sistema de quebra de senhas do estilo Brute Force sem dicionário.

Talvez outro dia que não tiver nada para fazer eu continue.

Criado 4 de dezembro de 2007
Ultima resposta 3 de jun. de 2008
Respostas 6
Participantes 3