[プログラマー]模擬試験


模擬試験関数式プログラミングで問題を解決します.
トラブルシューティングを開始する前に、必要な配列と関数を確認します.

必要だ!

  • students:1名の学生nameおよびpatternを1つのオブジェクトとする配列
  • const students = [
        {name: 1, pattern: [1, 2, 3, 4, 5]},
        {name: 2, pattern: [2, 1, 2, 3, 2, 4, 2, 5]},
        {name: 3, pattern: [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]},
    ];
  • repeat:無限反復ジェネレータオブジェクトのジェネレータ関数
  • function* repeat(a) {
        while (true) yield a;
    }

    トラブルシューティング

    const solution = (answers) =>
        go(
            students,
            map(scoring(answers)),
            groupBy(({score}) => score),
            Object.values,
            last,
            map(({name}) => name),
            (_) => [..._]
        );
    1行1行見てみよう

    1. map(scoring(answers))

    mapを使用して、scoring関数を呼び出した結果を収集し、新しい配列を返します.
    const scoring =
        (answers) =>
        ({name, pattern}) => ({
            name,
            score: go(
                randomAnswers(pattern, answers.length),
                zip(answers),
                countBy(([a, b]) => (a === b ? 'o' : 'x')),
                (counted) => counted.o || 0
            ),
        });
    scoring関数はanswerを受信し、関数を返します.
    この関数は、nameおよびpatternをパラメータとして受け入れ、nameを返し、最終スコアscoreを作成する関数を返します.
    ここで、scoreを作成するrandomAnswers関数がコアとなる.
    const randomAnswers = (pattern, length) => go(
      						pattern, 
      						repeat, 
      						flat, 
      						take(length)
    						);
    入力した生徒のpatternrepeat関数で無限に繰り返す. [[1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5], ...]次にflatは、関数によって展開されます.[1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, ...] take関数により長さanswerの値のみが抽出される.randomAnswer生成された答えanswerおよびzipである.
    正解の個数を求める.
    countBy(([a, b]) => (a === b ? 'o' : 'x')),
                (counted) => counted.o || 0
    countBy関数
  • zipで得られた学生の答えと正解を比較する.
  • 正解がoの場合、誤答がxの場合.
  • oの個数.
  • 2. groupBy(({score}) => score)


    1番で得られた配列グループを点数に合成します.groupByオブジェクトのキーが数字である場合、数字が大きいほどキーが後ろになるという特徴が利用されている.

    3. Object.values


    オブジェクトが持つ属性値からなる配列を返します.

    4. last

    groupBy使用フィーチャーの最後の値が最大のポイントです.last:arrアレイの最後の値
    const last = (arr) => arr[arr.length - 1];

    5. map(({name}) => name)

    name値のみ収集し、新しいオブジェクトを返します.

    6. (_) => [..._]

    nameは配列形式です.