JS: Das Orakel befragen


  • Gesperrt

    Hallo,

    ich bin mir nicht sicher, ob nachfolgende JS-Funktion richtig bzw. optimal ist ...

    Sagen wir, es gäbe ein Orakel (ja, ist albern, aber jetzt egal). Und dieses Orakel fragt nach einem Wort mit n Buchstaben (fest). Man kann wiederholt eins eingeben, und daraufhin gibt das Orakel zurück, ob das Wort gefunden wurde, oder welche Buchstaben vorkommen oder nicht.

    So weit, so gut. Ich bin gerade dabei, eine Funktion zu schreiben, die eine Liste möglicher Wörter und, welche Buchstaben bislang nicht vorkommen, bekommt, und anschließend die Wörter zurückgeben soll, die im nächsten Versuch möglichst viele andere Wörter ausschließen sollen.

          function getScores(words, removals) {
            let scores = [];
            for (let i = 0; i < words.length; i++) {
              let w = words[i];
              set1 = new Set(w.split(""));
              set2 = new Set([...w].filter((x) => !removals.includes(x)));
              scores.push([w, set1, set2, 0, i + 1]);
            }
            for (let i = 0; i < scores.length; i++) {
              for (let j = 0; j < scores.length; j++) {
                if (i != j) {
                  let c = 0;
                  scores[i][1].forEach((e) => {
                    if (scores[j][2].has(e)) {
                      c++;
                    }
                  });
                  if (c > 0) {
                    scores[i][3]++;
                  }
                }
              }
            }
            scores.sort((a, b) => {
              return b[3] - a[3];
            });
            return scores;
          }
    

    Ich bin mir in Zeile 18 bis 20 aber unsicher, ob es nicht besser wäre, anstatt den Score einfach nur um 1 zu erhöhen, den Score stattdessen um c zu erhöhen ...

    Dann hätten alle Scores einen höheren Wert und die Reihenfolge wäre auch anders ... Ideen?



  • @omggg

    Hääää????


  • Gesperrt

    Dieser Beitrag wurde gelöscht!

  • Gesperrt

    Schon gelöst:

    function getScores(words, removals) {
            let scores = [];
            for (let i = 0; i < words.length; i++) {
              let w = words[i];
              let array1 = [...w];
              let set2 = new Set(array1.filter((x) => !removals.includes(x)));
              scores.push([w, array1, set2, 0, i + 1]);
            }
            for (let i = 0; i < scores.length; i++) {
              for (let j = i + 1; j < scores.length; j++) {
                for (let k = 0; k < scores[i][1].length; k++) {
                  let e = scores[i][1][k];
                  if (scores[j][2].has(e)) {
                    scores[i][3]++;
                    scores[j][3]++;
                    break;
                  }
                }
              }
            }
            scores.sort((a, b) => {
              return b[3] - a[3];
            });
            return scores;
          }
    
    • Nur eine Set
    • Halbierung der Laufzeit
    • Verringerung der inneren Laufzeit
    • Geht jetzt unter 1 Sekunde

Anmelden zum Antworten