0

これは私が取り組んでいる例です:

    let test =
  [("Andy", ["d"; "a"; "d"; "c"; "b"; "d"; "c"; "a"; "a"; "c"; "a"; "d"; "a"; "a"; "d"; "e"]);
   ("Harry", ["b"; "d"; "c"; "b"; "c"; "b"; "a"; "a"; "d"; "b"; "d"; "d"; "a"; "c"; "b"; "e"]);

let answers = ["b"; "a"; "a"; "c"; "d"; "d"; "c"; "a"; "a"; "d"; "a"; "d"; "a"; "a"; "d"; "e"]);

私はlist.mapを使用して、各人のテストを比較し、正解した回答の数を判断しようとしています。どんな助けでもいただければ幸いです。

4

3 に答える 3

5

回答のリストと正解を指定してスコアを計算する関数を作成し、それをリスト内の各タプルに適用します。

let getScore ans correct = List.map2 (=) ans correct |> List.filter id |> List.length
let getCorrect l = l |> List.map (fun (name, ans) -> (name, getScore ans answers))
于 2013-02-22T12:31:44.517 に答える
3

これでうまくいくはずです:

let test =
  [("Andy", ["d"; "a"; "d"; "c"; "b"; "d"; "c"; "a"; "a"; "c"; "a"; "d"; "a"; "a"; "d"; "e"]);
   ("Harry", ["b"; "d"; "c"; "b"; "c"; "b"; "a"; "a"; "d"; "b"; "d"; "d"; "a"; "c"; "b"; "e"]); ]

let answerKey = ["b"; "a"; "a"; "c"; "d"; "d"; "c"; "a"; "a"; "d"; "a"; "d"; "a"; "a"; "d"; "e"];

let score answerKey answers =
    List.zip answerKey answers
    |> List.sumBy (fun (key, answer) ->
        if key = answer then 1 else 0)

let results =
    test
    |> List.map (fun (name, answers) ->
        name, score answerKey answers)

これを F# Interactive に入れると、結果は次のようになります。

val results : (string * int) list = [("Andy", 12); ("Harry", 5)]
于 2013-02-22T13:50:49.580 に答える
0

これはうまくいくでしょう...

最初に結果をマッピングして、個々のスコアリストを処理します。次に、正しい awnserlist を使用して fold2 を実行して一致を見つけます(ここでは単純な if then を使用できます)。タプルの正解と不正解の数を数えます。show 関数は単純なiterを実行して、タプルから最初と 2 番目の項目を取得し値を出力します。

   let scores results corr = 
    results
    |> List.map ( 
        fun (name, score) -> 
            (name, List.fold2 (
                fun s rhs lhs ->  
                    match s with
                    | (good, wrong) when rhs=lhs -> ( good + 1 , wrong) 
                    | (good, wrong) -> ( good, wrong + 1)
                                ) (0, 0) score corr
            ) 
        )


let show scorelist = 
scorelist
|> List.iter 
    ( fun i -> 
         match i with
         | (name, score) -> 
            match score with
            | (good, wrong) ->
                    printf "%s correct: %d wrong: %d \r\n" 
                     name
                     good 
                     wrong
     )

F# インタラクティブから実行:

show (scores test answers);;
Andy correct: 12 wrong: 4 
Harry correct: 5 wrong: 11 
于 2013-02-22T15:27:30.017 に答える