Nur für Profis: Programmieraufgabe von meinem Prof

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Nur für Profis: Programmieraufgabe von meinem Prof

    Hallo zusammen,

    ich bin neue hier. Studiere im zweiten Semester Informatik und habe eine Hausarbeit im Bereich Logik von meinem Prof bekommen, die mir zu schaffen macht.

    Hier mal die Aufgabenstellung:

    ####

    -Textvarianten-
    Ein Text soll verschiedene Textvarianten beinhalen. Dazu gibt es die Steuerzeichen "[", "]" und das Trennzeichen "|".
    Diese Steuerzeichen im Text sollen wie Folgt interpretiert werden: Klammern bieten immer Optionen an, von denen später genau ein Element ausgewählt werden soll.

    Quellcode

    1. var bsp = "A B C [D|E]"; // Soll entweder A B C D ODER A B C E ausgeben!


    a) Geben Sie einen Algorithmus mit der Programmiersprache Ihrer Wahl an, der den eingegebenen String so ausgibt, dass dieser mit BELIEBIGER VERSCHACHTELUNG der Klammern funktioniert. Speichern Sie dazu das Ergebnis in einer Arraystruktur Ihrer Wahl zwischen.
    b) Zählen Sie die maximal möglichen Varianten
    c) Geben Sie eine zufällige Variante aus

    Weiteres Beispiel einer Eingabe:

    Quellcode

    1. var bsp = "A B C [D|E|F G H [I J |K ]|]";


    ####

    Könnt Ihr mir da helfen und mir den Algorithmus in Pseudocode, PHP oder Java posten?
    Das Problem habe ich mit der Verschachtelung... F G H [I J |K ] heißt ja im oberen Beispiel das F G H mit einer Variante I J O ODER K verknüpft wird. Diese & Verknüpfung kann ich aber in einer Arraystruktur nicht wirklich sichtbar machen.

    Wie gesagt, ist was für Profis... Ich hoffe ich finde hier Hilfe..

    Merci!

    Beste Grüße, Andre
  • Ich hätte es so gemacht, dass alle Möglichkeiten erstellt werden und diese einfach in einem Array gespeichert werden.
    Also "A [B | C] D" wird zu {"A B D", "A C D"}.
    Eine andere Arraystruktur fällt mir dazu nicht ein, interessant wären dann erst wieder Bäume oder Graphen.

    (Wenn die Arraystruktor so passend ist, kann ich mehr gerne Code überlegen :))
  • Hi,
    ja an die Möglichkeit alle Ergebnisse direkt in ein Array zu packen habe ich auch schon gedacht. Habe ich aber verworfen, weil dies extrem effizient ist. Folgendes Beispiel sind alleine 20 Varianten: "[A|B][C|D][E|F|G|H|I]"

    Die Idee mit Bäume oder Graphen ist mir noch nicht gekommen.
    Wie würdet du das mit einem Baum machen? Freue mich da sehr über Code!
    Merci!

    Andre
  • Quellcode

    1. // remove all spaces before !
    2. def parse(root: Node, text: String)
    3. if text.length == 0 then return
    4. if text[0] == '[' then
    5. val poss = text.substring(1).split(']')[0].split('|') // just getting all the possibilities
    6. foreach pos in poss
    7. parse(root, text.replaceFirst('[.*]', pos))
    8. else
    9. val newRoot = root.addNode(text[0])
    10. parse(newRoot, text.substring(1))


    Die Funktion setzt einen mutable Tree voraus (Könnte man aber sicherlich auch für immutable collections umschreiben).
    Keine Ahnung ob das so funktioniert, aber ich denke, dass es von der Idee schon funktionieren sollte.
  • Hey MrSpider,

    ich habe deinen Pseudocode mal mit PHP ausprobiert. Da funktioniert aber einiges nicht. Vielleicht habe ich da deinen Pseudocode an manchen Stellen nicht richtig interpretiert.
    Hier ist mal mein Beispiel:

    Quellcode

    1. function createvariants($root, $text){
    2. $string = trim($text);
    3. $pattern = '/[[|]/';
    4. if (strlen($string) == 0 ) return $root;
    5. if ($string[0] == '['){
    6. $poss = preg_split( $pattern, substr($string, 1) );
    7. foreach ($poss as $value){
    8. $root = createvariants($root, $value);
    9. }
    10. }
    11. else{
    12. $root = createvariants($string[0], substr($string, 1));
    13. }
    14. return $root;
    15. }
    Alles anzeigen


    Besten Dank für die Hilfe :)
  • Ich hab das ganze mal in Java geschrieben. Sind vermutlich noch ein paar kleine Fehler drin. Außerdem ist der Code nicht so schön .... (eher "quick & dirty")

    Quellcode

    1. import java.util.Collections;
    2. import java.util.LinkedList;
    3. public class LogicParser {
    4. private static class Node<T> {
    5. private T data;
    6. private LinkedList<Node<T>> children;
    7. public Node(T data) {
    8. this.data = data;
    9. children = new LinkedList<LogicParser.Node<T>>();
    10. }
    11. public Node<T> addNode(T data) {
    12. return addNode(new Node<T>(data));
    13. }
    14. public Node<T> addNode(Node<T> node) {
    15. children.add(node);
    16. return node;
    17. }
    18. public LinkedList<LinkedList<T>> getAll(){
    19. LinkedList<LinkedList<T>> result = new LinkedList<LinkedList<T>>();
    20. for(Node<T> node : children){
    21. LinkedList<LinkedList<T>> list = node.getAll();
    22. for(LinkedList<T> listInner : list){
    23. listInner.addFirst(data);
    24. }
    25. result.addAll(list);
    26. }
    27. if(children.size() == 0){
    28. LinkedList<T> add = new LinkedList<T>();
    29. add.add(data);
    30. result.add(add);
    31. }
    32. return result;
    33. }
    34. @Override
    35. public String toString() {
    36. StringBuilder result = new StringBuilder();
    37. result.append(data).append("\n");
    38. for(Node<T> node : children){
    39. result.append(node.toString().replace("\n", "\n\t"));
    40. }
    41. return result.toString();
    42. }
    43. }
    44. private static int getClosingBracket(String text){
    45. int result = 0, i = text.indexOf('[') + 1, bracketCount = 0;
    46. while(result == 0 && i < text.length()){
    47. if(text.charAt(i) == '[') ++bracketCount;
    48. else if(text.charAt(i) == ']' && bracketCount == 0) result = i;
    49. else if(text.charAt(i) == ']') --bracketCount;
    50. ++i;
    51. }
    52. return result;
    53. }
    54. private static String[] getPoss(String text) {
    55. if (text.charAt(0) != '[' || text.charAt(text.length()-1) != ']')
    56. return null;
    57. LinkedList<String> result = new LinkedList<String>();
    58. String currentText = text.substring(1);
    59. while (currentText.length() > 1) {
    60. int nextBracketO = currentText.indexOf('[');
    61. int nextBracketC = currentText.indexOf(']');
    62. int nextOpt = currentText.indexOf('|');
    63. if ((nextOpt < nextBracketO || nextBracketO == -1) && nextOpt != -1) {
    64. result.add(currentText.substring(0, nextOpt));
    65. currentText = currentText.substring(nextOpt + 1);
    66. } else if(nextBracketO != -1 && nextBracketC != -1) {
    67. result.add(currentText.substring(0, nextBracketC + 1));
    68. currentText = currentText.substring(nextBracketC + 1);
    69. } else if(nextBracketC == currentText.length() - 1){
    70. result.add(currentText.substring(0, currentText.length() - 1));
    71. currentText = "";
    72. }
    73. }
    74. return result.toArray(new String[result.size()]);
    75. }
    76. public static void parse(Node<String> node, String text){
    77. if(text.length() == 0) return;
    78. if(text.charAt(0) == '['){
    79. int split = getClosingBracket(text);
    80. String[] poss = getPoss(text.substring(0, split + 1));
    81. for(String pos : poss){
    82. parse(node, pos + text.substring(split + 1));
    83. }
    84. }
    85. else {
    86. int start = (text.indexOf('[') == -1) ? text.length() : text.indexOf('[');
    87. parse(node.addNode(text.substring(0, start)), text.substring(start));
    88. }
    89. }
    90. public static void main(String[] args) {
    91. Node<String> root = new Node<String>("");
    92. parse(root, "ABC[D|E|FGH|B[IJ|K]]XYZ");
    93. for(LinkedList<String> list : root.getAll()){
    94. list.removeFirst();
    95. System.out.println(list);
    96. }
    97. }
    98. }
    Alles anzeigen


    Ausgabe

    Quellcode

    1. [ABC, DXYZ]
    2. [ABC, EXYZ]
    3. [ABC, FGHXYZ]
    4. [ABC, B, IJXYZ]
    5. [ABC, B, KXYZ]