weil der Dozent seine durchfallquote erfüllen will und deswegen dich ran lässt.
du siehst das falsch, es sind doch immer die anderen niemals ist es CB
Fertig.
Hier ist eine Herausforderung für das geübte Auge:
In der huegeitn Ilfslaergsfiaoshmnntoect gwenenin Krmouitunkearmsunioktstn und Encsguseftrhednionsigusspzdne eine zenhnmudee Benteuudg für die gtlesehcliclafhse Wgreitcnitewulnek. Itdiitsnpaäleriitnrz, Ncakssttlgeihrheiaigaettn swoie Znvskeukpirutfetspen sind enhisdteencde Ftnraeok, wenn es draum ghet, goballe Hrseraroungudeefn wie Kwnmidleaal, Rnurnsckvnuesarppeoeg oder Dktigslueprsiiamxgiiänoetlt zu btwileägen.
import java.util.*;
import java.util.stream.Collectors;
public class Main {
private static final int SEED = 42; // Fixed seed for encoding/decoding consistency
public static void main(String[] args) {
String test = "In der heutigen Informationsgesellschaft gewinnen Kommunikationsstrukturen und Entscheidungsfindungsprozesse eine zunehmende Bedeutung für die gesellschaftliche Weiterentwicklung. Interdisziplinarität, Nachhaltigkeitsstrategien sowie Zukunftsperspektiven sind entscheidende Faktoren, wenn es darum geht, globale Herausforderungen wie Klimawandel, Ressourcenverknappung oder Digitalisierungskomplexität zu bewältigen.";
String encoded = encode(test);
String decoded = decode(encoded);
System.out.println(test);
System.out.println(encoded);
System.out.println(decoded);
}
private static <T> void shuffle(List<T> list) {
Random rnd = new Random(SEED);
int[] seq = new int[list.size()];
for (int i = seq.length; i >= 1; i--) {
seq[i - 1] = rnd.nextInt(i);
}
for (int i = seq.length - 1; i >= 0; i--) {
Collections.swap(list, i, seq[i]);
}
}
private static <T> void unshuffle(List<T> list) {
Random rnd = new Random(SEED);
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 encode1(String input) {
String toEncode = input.substring(1, input.length() - 1);
ArrayList<Character> toShuffle = new ArrayList<>(toEncode.chars().mapToObj(c -> (char) c).toList());
shuffle(toShuffle);
return input.charAt(0) + toShuffle.stream().map(Object::toString).collect(Collectors.joining()) + input.charAt(input.length() - 1);
}
private static String decode1(String input) {
String toDecode = input.substring(1, input.length() - 1);
ArrayList<Character> toUnshuffle = new ArrayList<>(toDecode.chars().mapToObj(c -> (char) c).toList());
unshuffle(toUnshuffle);
return input.charAt(0) + toUnshuffle.stream().map(Object::toString).collect(Collectors.joining()) + input.charAt(input.length() - 1);
}
private static String encode(String input) {
String[] parts = input.split(" ");
StringBuilder encoded = new StringBuilder();
for (String part : parts) {
if (part.length() > 3) {
encoded.append(encode1(part)).append(" ");
} else {
encoded.append(part).append(" ");
}
}
return encoded.toString().trim();
}
private static String decode(String input) {
String[] parts = input.split(" ");
StringBuilder decoded = new StringBuilder();
for (String part : parts) {
if (part.length() > 3) {
decoded.append(decode1(part)).append(" ");
} else {
decoded.append(part).append(" ");
}
}
return decoded.toString().trim();
}
}
Ja, ich weiß, da fehlen Java-Docs …
hier, und hier
bitte noch i+1
einfügen, damit auch 4-stellige Wörter gemischt werden.
Diesen Index/Bounds Fehler hatte ich übersehen … Ja, schlaue JUnit-Tests können tatsächlich hilfreich sein (zumindest in der Theorie), um Fehler zu finden, die man leicht übersieht. „Brauch ich alles nicht …“, ist also nicht der optimale Ansatz.
@Marco13 Liest du noch mit?
Bonusaufgaben für den Schlaukopf vom Dienst:
- Aufgabe A (50 Bonuspunkte): Erkläre in 30 bis 50 Worten, welchen Zweck die Unterscheidung zwischen Vokalen und Konsonanten im ursprünglichen Code hatte
- Aufgabe B (50 Bonuspunkte): Erkläre mit 50 bis 70 Worten, was eine Permutation ist, was eine Gruppe ist, und was es bedeutet, dass die Menge aller Permutationen eine Gruppe ist
- Aufgabe C (50 Bonuspunkte): Passe das folgende Programm so an, dass Zeichensetzung berücksichtigt wird und tatsächlich die Worte mit den Buchstaben anfangen und aufhören, mit denen sie ursprünglich angefangen und aufgehört haben
package bytewelt;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;
public class CBEncodingCrapPartTwo
{
private static final int SEED = 42;
public static void main(String[] args)
{
String test =
"In der heutigen Informationsgesellschaft gewinnen Kommunikationsstrukturen und Entscheidungsfindungsprozesse eine zunehmende Bedeutung für die gesellschaftliche Weiterentwicklung. Interdisziplinarität, Nachhaltigkeitsstrategien sowie Zukunftsperspektiven sind entscheidende Faktoren, wenn es darum geht, globale Herausforderungen wie Klimawandel, Ressourcenverknappung oder Digitalisierungskomplexität zu bewältigen. Unter anderem muss man dabei erkennen, ob irgendwelcher Code, den jemand in einem Forum hinrotzt, absoluter Müll ist, oder nicht.";
String encoded = encode(test);
String decoded = decode(encoded);
System.out.println(test);
System.out.println(encoded);
System.out.println(decoded);
}
private static String encode(String input)
{
return Stream.of(input.split(" ")).map(s -> shuffle(s))
.collect(Collectors.joining(" "));
}
private static String decode(String input)
{
return Stream.of(input.split(" ")).map(s -> unshuffle(s))
.collect(Collectors.joining(" "));
}
private static String shuffle(String s)
{
if (s.length() < 3)
{
return s;
}
int a[] = p(s.length() - 2);
StringBuilder sb = new StringBuilder(s);
for (int i = 0; i < a.length; i++)
{
sb.setCharAt(i + 1, s.charAt(a[i]));
}
return sb.toString();
}
private static String unshuffle(String s)
{
if (s.length() < 3)
{
return s;
}
int a[] = p(s.length() - 2);
StringBuilder sb = new StringBuilder(s);
for (int i = 0; i < a.length; i++)
{
sb.setCharAt(a[i], s.charAt(i + 1));
}
return sb.toString();
}
private static int[] p(int n)
{
Random rnd = new Random(SEED);
int a[] = IntStream.range(1, n).toArray();
for (int i = 0; i < a.length; i++)
{
int j = rnd.nextInt(a.length);
int v = a[i];
a[i] = a[j];
a[j] = v;
}
return a;
}
}
Um zu bestehen und eine zweiwöchige Sperre zu vermeiden, sind 151 Bonuspunkte notwendig.
Einverstanden? Zumindest SpotBugs meckert nicht mehr:
import java.awt.*;
import java.util.*;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import javax.swing.*;
public class Main {
private static final long SEED = 7; // Fixed seed for (un)shuffling consistency
private static final Random RND = new Random(SEED);
public static void main(String[] args) {
String test =
"In der heutigen Informationsgesellschaft gewinnen Kommunikationsstrukturen und Entscheidungsfindungsprozesse eine zunehmende Bedeutung für die gesellschaftliche Weiterentwicklung. Interdisziplinarität, Nachhaltigkeitsstrategien sowie Zukunftsperspektiven sind entscheidende Faktoren, wenn es darum geht, globale Herausforderungen wie Klimawandel, Ressourcenverknappung oder Digitalisierungskomplexität zu bewältigen.";
String encoded = encode(test);
String decoded = decode(encoded);
System.out.println(test);
System.out.println(encoded);
System.out.println(decoded);
SwingUtilities.invokeLater(Main::showGui);
}
private static <T> void shuffle(List<T> list) {
RND.setSeed(SEED); // Reset seed to ensure consistent shuffling
int[] seq = new int[list.size()];
for (int i = seq.length; i >= 1; i--) {
seq[i - 1] = RND.nextInt(i + 1);
}
for (int i = seq.length - 1; i >= 0; i--) {
Collections.swap(list, i, seq[i]);
}
}
private static <T> void unshuffle(List<T> list) {
RND.setSeed(SEED); // Reset seed to ensure consistent unshuffling
int[] seq = new int[list.size()];
for (int i = seq.length; i >= 1; i--) {
seq[i - 1] = RND.nextInt(i + 1);
}
for (int i = 0; i < seq.length; i++) {
Collections.swap(list, i, seq[i]);
}
}
private static String encode1(String input) {
String toEncode = input.substring(1, input.length() - 1);
ArrayList<Character> toShuffle =
new ArrayList<>(toEncode.chars().mapToObj(c -> (char) c).toList());
shuffle(toShuffle);
return input.charAt(0)
+ toShuffle.stream().map(Object::toString).collect(Collectors.joining())
+ input.charAt(input.length() - 1);
}
private static String decode1(String input) {
String toDecode = input.substring(1, input.length() - 1);
ArrayList<Character> toUnshuffle =
new ArrayList<>(toDecode.chars().mapToObj(c -> (char) c).toList());
unshuffle(toUnshuffle);
return input.charAt(0)
+ toUnshuffle.stream().map(Object::toString).collect(Collectors.joining())
+ input.charAt(input.length() - 1);
}
private static String encode(String input) {
Pattern pattern = Pattern.compile("[\\wäöüßÄÖÜ-]+");
Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
String word = matcher.group();
if (word.length() > 3) {
String encodedWord = encode1(word);
input = input.replace(word, encodedWord);
}
}
return input;
}
private static String decode(String input) {
Pattern pattern = Pattern.compile("[\\wäöüßÄÖÜ-]+");
Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
String word = matcher.group();
if (word.length() > 3) {
String decodedWord = decode1(word);
input = input.replace(word, decodedWord);
}
}
return input;
}
private static void showGui() {
JTextArea a1 = new JTextArea(30, 60);
JTextArea a2 = new JTextArea(30, 60);
a1.setLineWrap(true);
a1.setWrapStyleWord(true);
a2.setLineWrap(true);
a2.setWrapStyleWord(true);
a1.getDocument()
.addDocumentListener(
new javax.swing.event.DocumentListener() {
@Override
public void insertUpdate(javax.swing.event.DocumentEvent e) {
String text = a1.getText();
String encoded = encode(text);
a2.setText(encoded);
}
@Override
public void removeUpdate(javax.swing.event.DocumentEvent e) {
String text = a1.getText();
String encoded = encode(text);
a2.setText(encoded);
}
@Override
public void changedUpdate(javax.swing.event.DocumentEvent e) {
// This method is not used for plain text areas
}
});
JFrame frame = new JFrame("Weird Text Encoder/Decoder");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new GridLayout(1, 2));
frame.add(new JScrollPane(a1));
frame.add(new JScrollPane(a2));
frame.pack();
frame.setVisible(true);
}
}
Der Zweck der Unterscheidung war, dass ich alle Vokale in einem Wort gemischt vor den Konsonanten (gemischt) einfügen wollte, um so die Leseschwierigkeit zu erhöhen. Dabei sollte die gemischten Vokale und Konsonanten nach einem bestimmten Verfahren eingefügt werden. Das Problem war aber, dass diese Operationen nicht rückgängig gemacht werden konnten.
Ich verzichte, weil ich 151 Punkte eh nicht erreichen kann.
Hm, den regulären Ausdruck könnte man noch anpassen, dass keine Zahlen gematched werden … das ist sonst fies.
Hat es eigentlich einen Grund, weshalb Kommentare in Code-Snippets Serifen haben?
Ich glaube, das ist neu. Alles mit Serifen kann ich nicht so gut lesen.
Doch, wenn man’s richtig macht, schon. („Richtig“ ist halt schwierig, aber … manchmal kann man sich auch selbst eine Herausforderung stellen…)
Es kann unterschiedlich viele Vokale und Konsonanten geben. Wenn du alle Vokale nach vorne ziehst, wie willst du dann wissen, an welcher Position sie im ursprünglichen Wort standen?
Vereinfachen wir das mal auf gerade und ungerade Zahlen (bzw. Ziffern):
135249768 → 2468 13597
Wie willst du von 2468 13597 auf 135249768 kommen? Es fehlen Informationen.
Man merkt sich, wie man von 135249768 auf 246813597 gekommen ist, und macht das rückgängig.
Das kann der Empfänger aber nicht wissen. Dieser kennt nur den Seed. → nicht rekonstruierbar
package bytewelt;
public class CBEncodingCrapPartFour
{
public static void main(String[] args)
{
String s = "Verstanden";
int seed = 24513;
int[] a = q(8, seed);
String t = shuffle(s, a);
String u = unshuffle(t, a);
System.out.println(s);
System.out.println(t);
System.out.println(u);
}
private static String shuffle(String s, int a[])
{
if (s.length() < 3)
{
return s;
}
StringBuilder sb = new StringBuilder(s);
for (int i = 0; i < a.length; i++)
{
sb.setCharAt(i + 1, s.charAt(a[i]));
}
return sb.toString();
}
private static String unshuffle(String s, int a[])
{
if (s.length() < 3)
{
return s;
}
StringBuilder sb = new StringBuilder(s);
for (int i = 0; i < a.length; i++)
{
sb.setCharAt(a[i], s.charAt(i+1));
}
return sb.toString();
}
static int[] q(int ì, int i)
{
int I, í = 0;
int l = i;
int î[] = new int[ì];
int J[] = new int[ì];
î[í] = 1;
while (++í < ì)
î[í] = î[í - 1] * í;
for (í = 0; í < ì; ++í)
{
J[í] = l / î[ì - 1 - í];
l = l % î[ì - 1 - í];
}
for (í = ì - 1; í > 0; --í)
for (I = í - 1; I >= 0; --I)
if (J[I] <= J[í])
J[í]++;
for (int c = 0; c < J.length; c++)
{
J[c]++;
}
return J;
}
}
Nimm doch gleich Charcoal. Es geht hier nicht darum, unverständlichen Code zu schreiben.
Dein Fehler ist aber leider, dass du für das Ver- und Entschlüsseln das gleiche Array verwendest - eine Information, die der Empfänger nicht hat.
Zudem sehe ich nicht, wo du zwischen Vokalen und Konsonanten unterscheidest.
Also insgesamt nicht gut.
und hier bewusst keine Klammern zu setzen, hatte ein Kollege auch mal versucht, als ich noch mit ihm zusammengearbeitet hatte… Aber manche Leute wollen halt keine Freunde haben.^^
Der Array ist direkt aus dem „seed“ erstellt. Alles gut. Und die Vokale stehen am Anfang. Alles gut. Und warum sollte man Klammern setzen, wenn sie nicht notwendig sind? Wenn’s läuft, läuft’s. Alles gut.
Für das eine Wort, ja. Aber nicht im Allgemeinen.
Wie gesagt, du prüfst ja nicht, ob ein Vokal/Konsonant vorliegt.
Dient der Lesbarkeit und späteren Anpassbarkeit.
Von CB sind wir ja den Müll gewohnt und es wird auch zur Sicherheit regelmäßig drauf hingewiesen, aber von dir - vor allem als Mod - hat sowas ein komplett anderes Gewicht.
Will sagen: das was du hier gerade postest um CB zu trollen wird von manchem (neuen) Leser mitunter für einen ernsten Vorschlag gehalten. Während dein erster noch sehr offensichtlich war, ist das hier nicht mehr der Fall. Und um das mal zu betonen:
Klammern setzen die nicht notwendig sind ist nicht verkehrt und gerade jedem der neu ist sollte das unbedingt tun weil sich ansonsten leicht Fehler einschleichen können!
Um weiteres ausarten hier zu verhindern, werde ich den Thread an dieser Stelle dicht machen.
Wenn das hier jemand läse, dann sähe er hoffentlich den Klassennamen…
Da hier nichts sinnvolles rumkommen kann, war schon nach dem ersten Post klar. Ansonsten kann ruhig zu bleiben.