Hi,

hier meine Lösung des Coding Quizes. Leider habe ich aus Zeitgründen nur die erste Stufe geschafft, und davon auch nur den Algorithmus zum Finden der richtigen Positionen der Wörter. Die Position wird mit jedem Wort in einem Objekt gespeichert, dazu auch noch der Lösungshinweis. Der Algorithmus sieht wie folgt aus:

Die Methode createPuzzle nimmt eine Liste aus PuzzleWords entgegen. Ein PuzzleWord ist nichts anderes als ein Paket, indem Wort, Lösungshinweis und Position des Wortes vereint sind. Die erste Zeile im Rätsel hat Position 0. Der X-Wert bezieht sich auf das Lösungswort, welches den Wert 0 hat, sodass alle Wörter entweder einen negativen X-Wert oder 0 besitzen.
Das Puzzle wird generiert, in dem jedes Wort in der Liste durchlaufen wird und an die erste passende Stelle des Lösungswortes gesetzt wird. Diese Y-Position wird dann gespeichert. Wenn das nächste Wort keine passende Stelle findet, die noch frei ist, aber eine, die schon besetzt ist, dann wird probiert, ob dieses Wort, das die Stelle besetzt, noch woanders platziert werden kann. Dies passiert rekursiv. Wenn ein Wort nicht gesetzt werden kann, ist das ganze Rätsel mit diesen Worten nicht generierbar und der Algorithmus liefert ein false.

Code java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
public class SimplePuzzleGenerator {
 
    private int solutionLenght;
   
    private PuzzleWord[] puzzleList;
    
    private String solutionWord;
 
    public boolean createPuzzle(ArrayList<PuzzleWord> words, String solution, boolean keepOrder) {
        if(words.size() != solution.length()){
            return false;
        }
        solutionLenght = solution.length();
        puzzleList = new PuzzleWord[solutionLenght];
        solutionWord = solution;
        boolean isSuccesful = true;
        int wordIndex = 0;
        while(wordIndex < words.size() && isSuccesful){
            isSuccesful = setWord(words.get(wordIndex), 0);
            wordIndex++;
        }
        return isSuccesful;
    }
 
    private boolean setWord (PuzzleWord word, int startPosition){
        int charPlace = startPosition;
        boolean isSet = false;
        while(charPlace < solutionLenght && !isSet){
            if(word.getWord().indexOf(solutionWord.charAt(charPlace)) > -1){
                if(puzzleList[charPlace] == null){
                    puzzleList[charPlace] = word;
                    word.setPositionX(getPositionX(word, charPlace));
                    word.setPositionY(charPlace);
                    isSet = true;
                }else{
                    if(setWord(puzzleList[charPlace], charPlace+1)){
                        puzzleList[charPlace] = word;
                        word.setPositionX(getPositionX(word, charPlace));
                        word.setPositionY(charPlace);
                        isSet = true;
                    }
                }
            }
            charPlace++;
        }
        return isSet;
    }
 
  
    private int getPositionX(PuzzleWord word, int range){
        return -(word.getWord().indexOf(solutionWord.charAt(range)));
    }

Diese Liste mit den PuzzleWords wird an eine Klasse übergeben, die daraus ein Bild generiert. Oder, falls gewünscht, andere Export-Formen unterstützt. Wie gesagt, so weit bin ich leider nicht gekommen, wer Interesse daran hat, kann sich ja per PN oder hier im Thread bei mir melden.