[プログラマー]模擬試験
12696 ワード
模擬試験関数式プログラミングで問題を解決します.
トラブルシューティングを開始する前に、必要な配列と関数を確認します.
トラブルシューティング
正解が
1番で得られた配列グループを点数に合成します.
オブジェクトが持つ属性値からなる配列を返します.
トラブルシューティングを開始する前に、必要な配列と関数を確認します.
必要だ!
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)
);
入力した生徒のpattern
をrepeat
関数で無限に繰り返す. [[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
関数
const solution = (answers) =>
go(
students,
map(scoring(answers)),
groupBy(({score}) => score),
Object.values,
last,
map(({name}) => name),
(_) => [..._]
);
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
),
});
const randomAnswers = (pattern, length) => go(
pattern,
repeat,
flat,
take(length)
);
countBy(([a, b]) => (a === b ? 'o' : 'x')),
(counted) => counted.o || 0
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
は配列形式です.Reference
この問題について([プログラマー]模擬試験), 我々は、より多くの情報をここで見つけました https://velog.io/@yes3427/programmers-examテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol