Sieht hier vielleicht jemand, was falsch wäre? Die decode-Methode soll den Originaltext zurückgeben:
Original: Das ist ein Test um zu sehen ob es funktioniert.
Encoded: Das ist ein Tset um zu sheen ob es fterinonukit.
Decoded: Das ist ein Test um zu seehn ob es fuiioenrnttk.
„sehen“ und „funktioniert“ werden noch nicht wieder richtig decodiert.
Ich glaube inzwischen, die unshuffle-Methode könnte falsch sein.
import java.util.*;
public class Main {
private static final Random random = new Random(0);
public static void main(String[] args) {
String input = "Das ist ein Test um zu sehen ob es funktioniert.";
System.out.println("Original: " + input);
System.out.println("Encoded: " + encode(input));
System.out.println("Decoded: " + decode(encode(input)));
}
private static String encode(String input) {
HashSet<Character> vokale = new HashSet<>(Arrays.asList('a', 'e', 'i', 'o', 'u', 'ä', 'ö', 'ü'));
ArrayList<String> words = new ArrayList<>(Arrays.asList(input.split(" ")));
ArrayList<String> words2 = new ArrayList<>();
for (int i = 0; i < words.size(); i++) {
String word = words.get(i);
// if (word.length() <= 3 && i < words.size() - 1) {
// String word2 = words.get(++i).toLowerCase(Locale.ROOT);
// // word2 = word2.substring(0, 1).toUpperCase(Locale.ROOT) + word2.substring(1);
// word = word.toLowerCase(Locale.ROOT) + word2;
// }
words2.add(word);
}
StringBuilder encoded = new StringBuilder();
for (String word : words2) {
if (word.length() > 3) {
ArrayList<Character> vokaleInWord = new ArrayList<>();
ArrayList<Character> consonants = new ArrayList<>();
for (char c : word.substring(1, word.length() - 1).toCharArray()) {
if (vokale.contains(c)) {
vokaleInWord.add(c);
} else {
consonants.add(c);
}
}
Collections.shuffle(vokaleInWord, random);
Collections.shuffle(consonants, random);
double vokaleRatio = (double) vokaleInWord.size() / (vokaleInWord.size() + consonants.size());
double consonantsRatio = (double) consonants.size() / (vokaleInWord.size() + consonants.size());
int vokaleIndex = 0;
int consonantsIndex = 0;
ArrayList<Character> merged = new ArrayList<>();
merged.add(word.charAt(0));
for (int i = 0; i < word.length() - 2; i++) {
if ((double) vokaleIndex / vokaleRatio < (double) consonantsIndex / consonantsRatio) {
if (vokaleIndex < vokaleInWord.size()) {
merged.add(vokaleInWord.get(vokaleIndex++));
} else {
merged.add(consonants.get(consonantsIndex++));
}
} else {
if (consonantsIndex < consonants.size()) {
merged.add(consonants.get(consonantsIndex++));
} else {
merged.add(vokaleInWord.get(vokaleIndex++));
}
}
}
merged.add(word.charAt(word.length() - 1));
for (char c : merged) {
encoded.append(c);
}
encoded.append(" ");
} else {
encoded.append(word).append(" ");
}
}
return encoded.toString();
}
private static <T> void unshuffle(List<T> list, Random rnd) {
int[] seq = new int[list.size()];
for (int i = seq.length; i >= 1; i--) {
seq[i - 1] = rnd.nextInt(i);
}
for (int i = 0; i < seq.length; i++) {
Collections.swap(list, i, seq[i]);
}
}
private static String decode(String input) {
HashSet<Character> vokale = new HashSet<>(Arrays.asList('a', 'e', 'i', 'o', 'u', 'ä', 'ö', 'ü'));
ArrayList<String> words = new ArrayList<>(Arrays.asList(input.split(" ")));
StringBuilder encoded = new StringBuilder();
for (String word : words) {
if (word.length() > 3) {
ArrayList<Character> vokaleInWord = new ArrayList<>();
ArrayList<Character> consonants = new ArrayList<>();
String wordReversed = new StringBuilder(word).reverse().toString();
for (char c : wordReversed.substring(1, word.length() - 1).toCharArray()) {
if (vokale.contains(c)) {
vokaleInWord.add(c);
} else {
consonants.add(c);
}
}
double vokaleRatio = (double) vokaleInWord.size() / (vokaleInWord.size() + consonants.size());
double consonantsRatio = (double) consonants.size() / (vokaleInWord.size() + consonants.size());
int vokaleIndex = 0;
int consonantsIndex = 0;
ArrayList<Character> merged = new ArrayList<>();
for (int i = 0; i < word.length() - 2; i++) {
if ((double) vokaleIndex / vokaleRatio < (double) consonantsIndex / consonantsRatio) {
if (vokaleIndex < vokaleInWord.size()) {
merged.add(vokaleInWord.get(vokaleIndex++));
} else {
merged.add(consonants.get(consonantsIndex++));
}
} else {
if (consonantsIndex < consonants.size()) {
merged.add(consonants.get(consonantsIndex++));
} else {
merged.add(vokaleInWord.get(vokaleIndex++));
}
}
}
vokaleInWord = new ArrayList<>();
consonants = new ArrayList<>();
for (char c : merged) {
if (vokale.contains(c)) {
vokaleInWord.add(c);
} else {
consonants.add(c);
}
}
unshuffle(vokaleInWord, random);
unshuffle(consonants, random);
vokaleIndex = 0;
consonantsIndex = 0;
merged = new ArrayList<>();
merged.add(word.charAt(0));
for (int i = 0; i < word.length() - 2; i++) {
if ((double) vokaleIndex / vokaleRatio >= (double) consonantsIndex / consonantsRatio) {
if (vokaleIndex < vokaleInWord.size()) {
merged.add(vokaleInWord.get(vokaleIndex++));
} else {
merged.add(consonants.get(consonantsIndex++));
}
} else {
if (consonantsIndex < consonants.size()) {
merged.add(consonants.get(consonantsIndex++));
} else {
merged.add(vokaleInWord.get(vokaleIndex++));
}
}
}
merged.add(word.charAt(word.length() - 1));
for (char c : merged) {
encoded.append(c);
}
encoded.append(" ");
} else {
encoded.append(word).append(" ");
}
}
return encoded.toString();
}
}