Skip to content
Snippets Groups Projects
WordGenerator.java 2.48 KiB
Newer Older
package word_generator;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
Noah Heuser's avatar
Noah Heuser committed
import java.util.Random;

import type3.FiniteStateMachine;

Noah Heuser's avatar
Noah Heuser committed
public class WordGenerator {

	Random random = new Random();

	public String wordGenerator(int maxLength) {
		return wordGeneratorOverAlphabet(maxLength, 26);
	}

	public String wordGeneratorOverAlphabet(int maxLength, int alphaSize) {
Noah Heuser's avatar
Noah Heuser committed
		return random.ints(random.nextInt(maxLength + 1), 97, 97 + alphaSize)
				.collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append).toString();
	}

	public String wordGeneratorOverType2Grammar(int maxLength, Map<String, List<List<String>>> cnfGrammar) {
		String s = "";
		while (s.equals("") || !s.equals(s.toLowerCase())) {
			s = wordGeneratorOverType2GrammarTry(random.nextInt(maxLength - 1) + 1, cnfGrammar);
	private String wordGeneratorOverType2GrammarTry(int maxLength, Map<String, List<List<String>>> cnfGrammar) {
		List<String> sb = new ArrayList<>();
		sb.add(cnfGrammar.containsKey("S'") ? "S'" : "S");
		int i = 0;
		wordGeneratorOverType2GrammarTry(maxLength, sb, cnfGrammar, sb.size(), i);
		return sb.stream().collect(StringBuilder::new, StringBuilder::append, StringBuilder::append).toString();
	}

	private void wordGeneratorOverType2GrammarTry(int maxLength, List<String> sb,
			Map<String, List<List<String>>> cnfGrammar, int size, int i) {
		if (size <= maxLength && i < size) {
			if (cnfGrammar.containsKey(sb.get(i))) {
				List<List<String>> options = cnfGrammar.get(sb.get(i));
				List<String> option = options.get(random.nextInt(options.size()));
				sb.remove(i);
				for (int j = 0; j < option.size(); j++) {
					sb.add(i + j, option.get(j));
				}
				wordGeneratorOverType2GrammarTry(maxLength, sb, cnfGrammar, sb.size(), i);
			} else {
				wordGeneratorOverType2GrammarTry(maxLength, sb, cnfGrammar, size, ++i);
			}
		}
	}

	public String wordGeneratorOverType3Grammar(int maxLength, FiniteStateMachine fsm, int alphaSize) {
		String word;
		while (true) {
			word = wordGeneratorOverType3GrammarTry(random.nextInt(maxLength - 1) + 1, fsm, alphaSize);
			if (fsm.canStop()) {
				break;
			}
			fsm.resetStateMachine();
		}
		return word;
	}

	public String wordGeneratorOverType3GrammarTry(int maxLength, FiniteStateMachine fsm, int alphaSize) {
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < maxLength; i++) {
			String s = (char) (random.nextInt(alphaSize) + 97) + "";
			sb.append(s);
			fsm.switchStates(s);
		}
		return sb.toString();
	}