Ich versuche einen Lückentext automatisch zu lösen. Der Input sieht ungefähr so aus:
[CODE lang="java" title="Input"]__a _____n _______t _n _i___ _e_________ __s d__ _____e__ __d _i____ e__ __t___. _s _s_ __n_ ____e __n ______n ___e___, _i_ i_ _i_ ___h____ __________e __b_____ ___d__ s_____, _o __s_ s__ _i__ ___t___ _e________ _r_____. __________n _n_ _a_________ s____ e_____ _______b__ ___d ____n ______e___.
Es in in so aus der die die ein ist Opa sie und und von dass eine eine sind einer Liste schon sowie einige findet Jürgen Rätsel sollen werden ergeben gegeben lustige Wörtern Apotheke blättert gebracht richtige Buchstaben Geschichte vorgegeben Leerzeichen Reihenfolge Satzzeichen Zeitschrift[/CODE]
Die richtige Lösung ist logischerweise:
Das Programm gibt aber aus:
Es soll alle "Lücken" für jedes Wort durchgehen und nach 2 mit einer identischen und einmaligen Anzahl von Buchstaben suchen. Dies ist wichtig für "Lücken" ohne Buchstaben.
Anschließend vergleicht es wieder ein Wort und eine Lücke, sucht dann aber nach dem gleichen Buchstaben an der gleichen Stelle des Wortes.
Wenn es etwas findet, das passt, erhöht einen counter, um sicherzustellen, dass es die einzige Möglichkeit ist. Dann fügt sie das Wort dem output-string hinzu.
Das ganze wird oft wiederholt, in der Hoffnung, dass es alles findet.
Ein Problem ist, dass es nur Wörter einsetzt, wenn es keine andere Möglichkeit gibt, aber wenn ein Wort 2 Mal in der Liste steht, weiß es nicht, welches es nehmen soll. Ich weiß nicht, wie ich das umsetzen soll, und außerdem muss es noch ein anderes Problem geben.
Es wäre nett, wenn mir jemand weiterhelfen könnte.
Der Code:
[CODE lang="java" title="Das ist eigentlich unwichtig"]public class Main {
public static void main(String[] args) {
try {
BufferedReader ein = new BufferedReader(new InputStreamReader(System.in));
String s = ein.readLine();
String s2 = ein.readLine();
s = s.replace(",", "");
s = s.replace("!", "");
s = s.replace(".", "");
s = s.replace(":", "");
s = s.replace("?", "");
s = s.replace(";", "");
s = s.replace("&", "");
String[] stringResult = s.split(" ");
String[] stringResult2 = s2.split(" ");
System.out.println(Arrays.toString(stringResult));
System.out.println(Arrays.toString(stringResult2));
int[] charCount = new int [stringResult.length] ;
for(int i=0; i<stringResult.length; i++) {
charCount = stringResult.length();
}
int[] charCount2 = new int [stringResult2.length] ;
for(int i=0; i<stringResult.length; i++) {
charCount2 = stringResult2.length();
}
String[] Final = new String [stringResult.length];
Boolean[] used = new Boolean [stringResult2.length];
[/CODE]
[CODE lang="java" title="Input"]__a _____n _______t _n _i___ _e_________ __s d__ _____e__ __d _i____ e__ __t___. _s _s_ __n_ ____e __n ______n ___e___, _i_ i_ _i_ ___h____ __________e __b_____ ___d__ s_____, _o __s_ s__ _i__ ___t___ _e________ _r_____. __________n _n_ _a_________ s____ e_____ _______b__ ___d ____n ______e___.
Es in in so aus der die die ein ist Opa sie und und von dass eine eine sind einer Liste schon sowie einige findet Jürgen Rätsel sollen werden ergeben gegeben lustige Wörtern Apotheke blättert gebracht richtige Buchstaben Geschichte vorgegeben Leerzeichen Reihenfolge Satzzeichen Zeitschrift[/CODE]
Die richtige Lösung ist logischerweise:
Opa Jürgen blättert in einer Zeitschrift aus der Apotheke und findet ein Rätsel...
Das Programm gibt aber aus:
Opa, Jürgen, blättert, null, einer, Zeitschrift, aus, der, Apotheke, null, findet, null, Rätsel,...
Es soll alle "Lücken" für jedes Wort durchgehen und nach 2 mit einer identischen und einmaligen Anzahl von Buchstaben suchen. Dies ist wichtig für "Lücken" ohne Buchstaben.
Anschließend vergleicht es wieder ein Wort und eine Lücke, sucht dann aber nach dem gleichen Buchstaben an der gleichen Stelle des Wortes.
Wenn es etwas findet, das passt, erhöht einen counter, um sicherzustellen, dass es die einzige Möglichkeit ist. Dann fügt sie das Wort dem output-string hinzu.
Das ganze wird oft wiederholt, in der Hoffnung, dass es alles findet.
Ein Problem ist, dass es nur Wörter einsetzt, wenn es keine andere Möglichkeit gibt, aber wenn ein Wort 2 Mal in der Liste steht, weiß es nicht, welches es nehmen soll. Ich weiß nicht, wie ich das umsetzen soll, und außerdem muss es noch ein anderes Problem geben.
Es wäre nett, wenn mir jemand weiterhelfen könnte.
Der Code:
[CODE lang="java" title="Das ist eigentlich unwichtig"]public class Main {
public static void main(String[] args) {
try {
BufferedReader ein = new BufferedReader(new InputStreamReader(System.in));
String s = ein.readLine();
String s2 = ein.readLine();
s = s.replace(",", "");
s = s.replace("!", "");
s = s.replace(".", "");
s = s.replace(":", "");
s = s.replace("?", "");
s = s.replace(";", "");
s = s.replace("&", "");
String[] stringResult = s.split(" ");
String[] stringResult2 = s2.split(" ");
System.out.println(Arrays.toString(stringResult));
System.out.println(Arrays.toString(stringResult2));
int[] charCount = new int [stringResult.length] ;
for(int i=0; i<stringResult.length; i++) {
charCount = stringResult.length();
}
int[] charCount2 = new int [stringResult2.length] ;
for(int i=0; i<stringResult.length; i++) {
charCount2 = stringResult2.length();
}
String[] Final = new String [stringResult.length];
Boolean[] used = new Boolean [stringResult2.length];
[/CODE]
Code:
for(int i = 0; i<stringResult2.length; i++) {
used[i]= false;
}
for(int reps = 0; reps <(stringResult.length +1) ; reps++){
for(int i=0; i<charCount2.length; i++) {
// geht alle WÖRTER durch
int counter = 0;
int counter2 = 0;
int savej1 = 0;
int savej2 = 0;
String save4Output = null;
for(int j=0; j<charCount.length; j++) {
if(Final[j] != null) {
continue;
}
else {
//geht alle LÜCKEN durch
if (charCount2[i] == charCount[j] && Final[j] == null && used[i] == false){
counter ++;
savej1 = j;
}
}
}
if (counter == 1){
Final [savej1] = stringResult2[i];
used[i] = true;
}
else if(counter > 1) {
char[] letters =new char[stringResult2[i].length()];
letters = stringResult2[i].toCharArray();
//einzelne Buchstaben von Wörtern
for(int j = 0; j < charCount.length; j++) {
// geht alle LÜCKEN durch
if(Final[j] != null) {
continue;
}
else {
if(charCount2[i] == charCount[j]) {
char[] spaces =new char[stringResult[j].length()];
spaces = stringResult[j].toCharArray();
//einzelne Zeichen von Lücken
//int ja = 0;
for(int l = 0; l < spaces.length; l++) {
if(letters[l] == spaces[l] && used[i] == false) {
System.out.println("Jawollja");
savej2 = j;
save4Output =stringResult2[i];
counter2 ++;
//Final[j] = stringResult2[i];
System.out.println(Arrays.toString(Final));
break;
}
}
}
}
}
if(counter2 ==1) {
Final[savej2] = save4Output;
used[i] = true;
}
else { continue; }
//System.out.println(letters);
}
}
}
System.out.println(Arrays.toString(Final));
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}