2011-06-23 6 views
6

私は、2つの配列を比較することによってユーザーの応答を評価するスクリプトを作成しています。 (これは、彼らが情報を一語に一通りに知っているかどうかを知るためのクイズです。)私は既に、ユーザーの反応を小文字にして分割するようなコードをいくつか用意しています。私が必要とするのは、違いの数/間違いを見つけるものです。たとえば、ユーザが5つの誤りを犯したことを返すでしょう私が探している機能を実行しているこの特定の例ではJavaScriptを使用してユーザの応答を評価する(2つの配列を比較する)

var correctanswer = ["The","quick","brown","fox","jumped","over","the","lazy","dog"]; 
var useranswer = ["The","brown","fox","jumped","up","and","over","the","really","lazy","cat"]; 
alert(counterrors(correctanswer, useranswer)); 

、(彼らは省略「クイック」、は、を「アップ」を追加「と」「本当に」「犬」を「猫」に変更しました)。ご覧のとおり、2つの配列の長さが異なる場合があります。

これにアプローチする方法を知っている人はいますか?私はそれがおそらくループのようだと思っていた:

for (x in correctanswer) { 
    // compare correctanswer[x] to useranswer[x]... not sure how exactly. Seems tricky... 
} 

ありがとうございました!私はJohn Resigの差分解(http://ejohn.org/projects/javascript-diff-algorithm/)と他の同様のもの、さらには配列の比較もいくつか見てきましたが、見つかったものはすべての相違点を返すので、何も動作していないように見えました。もう一度、探していただきありがとうございました。私に質問があれば教えてください。

更新:答えはMagnarに感謝します。それは完璧に働いた。

答えて

6

あなたの後ろには、2つの配列のThe Levenshtein Distanceがあります。

加算の数を計算するアルゴリズム、欠失置換必要別に一つの配列を変換することです。

Wikipedia page I linkedには擬似コードが実装されています。私はあなたのためにJavaScriptにラインのためのラインの翻訳を行っている:

var correctanswer = ["The","quick","brown","fox","jumped","over","the","lazy","dog"]; 
var useranswer = ["The","brown","fox","jumped","up","and","over","the","really","lazy","cat"]; 

console.log(calculate_levenshtein_distance(correctanswer, useranswer)); 

function calculate_levenshtein_distance(s, t) { 
    var m = s.length + 1, n = t.length + 1; 
    var i, j; 

    // for all i and j, d[i,j] will hold the Levenshtein distance between 
    // the first i words of s and the first j words of t; 
    // note that d has (m+1)x(n+1) values 
    var d = []; 

    for (i = 0; i < m; i++) { 
    d[i] = [i]; // the distance of any first array to an empty second array 
    } 
    for (j = 0; j < n; j++) { 
    d[0][j] = j; // the distance of any second array to an empty first array 
    } 

    for (j = 1; j < n; j++) { 
    for (i = 1; i < m; i++) { 
     if (s[i - 1] === t[j - 1]) { 
     d[i][j] = d[i-1][j-1];   // no operation required 
     } else { 
     d[i][j] = Math.min(
        d[i - 1][j] + 1,  // a deletion 
        d[i][j - 1] + 1,  // an insertion 
        d[i - 1][j - 1] + 1 // a substitution 
       ); 
     } 
    } 
    } 

    return d[m - 1][n - 1]; 
} 

これは、コンソールに5を記録します。見ての通り、配列間の正確な距離です。学生はlazyを追加しませんでした。つまり、1つの削除、3つの追加、1つの置換です。

+0

マグナ - ありがとう!私はこれがそれだと思う...だから、記事のように文字列の代わりに配列の値を渡すだろうか? – Alex

+0

はい、文字の代わりに配列の値を使用します。言葉。 – Magnar

+0

ありがとうございました!私はまだJavaScriptでうまくいきませんが、私はここからそれを取ろうとします。実装方法に関するご提案がありましたら、お知らせください。私はこれを受け入れられた答えとしてマークします。 – Alex

0

私はあなたが望むものを完全に理解しているかどうかはわかりませんが、これは解決策だと思います。

function counterrors(a, b) { 
    var max = Math.max(a.length, b.length); 
    var min = Math.min(a.length, b.length); 
    var count = 0; 
    for (var i = 0; i < min; i+=1) { 
     if (a[i] !== b[i]) { 
      count += 1; 
     } 
    } 
    return count + max - min; // max - min for any extra things that don't match 
} 
var correctanswer = ["The", "quick", "brown", "fox", "jumped", "over", "the", "lazy", "dog"]; 
var useranswer = ["The", "brown", "fox", "jumped", "up", "and", "over", "the", "really", "lazy", "cat"]; 
alert(counterrors(correctanswer, useranswer)); 
+0

ジョン - 共有いただきありがとうございます。私はちょうどそれを試み、6の代わりに10のエラーを計算... – Alex

+0

10の順序で単語を入力する必要がある場合は、正しい値です。ユーザーが入力しなかった単語のうち、答えに含まれる単語の数を調べようとしていますか? Magnarにはあなたが探している解決策があると思います。 –

+0

私は、追加と削除の数と単語のバリエーション(「犬」と「猫」との交換など)の数を見つけようとしています。彼らがタイプしなかったものだけでなく、タイプした間違ったものも...他のアイデア?編集:ちょうどマグナーの答えを見た。 – Alex

関連する問題