環境
問題
5000個以上の名前が書かれている46Kのテキストファイル names.txt を用いる. まずアルファベット順にソートせよ.
のち, 各名前についてアルファベットに値を割り振り, リスト中の出現順の数と掛け合わせることで, 名前のスコアを計算する.
たとえば, リストがアルファベット順にソートされているとすると, COLINはリストの938番目にある. またCOLINは 3 + 15 + 12 + 9 + 14 = 53 という値を持つ. よってCOLINは 938 × 53 = 49714 というスコアを持つ.
ファイル中の全名前のスコアの合計を求めよ.
考え方
- アルファベットに対する値を変数に設定する。
- 5000個以上の名前を配列に格納し、アルファベット順にソートする
- 2.の名前からスコア数を算出する
- スコアの合計を算出する
コード
const alphabet = [ { alphabet: "A", value: 1 }, { alphabet: "B", value: 2 }, { alphabet: "C", value: 3 }, { alphabet: "D", value: 4 }, { alphabet: "E", value: 5 }, { alphabet: "F", value: 6 }, { alphabet: "G", value: 7 }, { alphabet: "H", value: 8 }, { alphabet: "I", value: 9 }, { alphabet: "J", value: 10 }, { alphabet: "K", value: 11 }, { alphabet: "L", value: 12 }, { alphabet: "M", value: 13 }, { alphabet: "N", value: 14 }, { alphabet: "O", value: 15 }, { alphabet: "P", value: 16 }, { alphabet: "Q", value: 17 }, { alphabet: "R", value: 18 }, { alphabet: "S", value: 19 }, { alphabet: "T", value: 20 }, { alphabet: "U", value: 21 }, { alphabet: "V", value: 22 }, { alphabet: "W", value: 23 }, { alphabet: "X", value: 24 }, { alphabet: "Y", value: 25 }, { alphabet: "Z", value: 26 } ]; const names = [ ... ] const sortedNames = names.sort(); const scores: number[] = sortedNames.map((name, index) => { const nameList: string[] = []; for (let i = 0; i < name.length; i++) { nameList.push(name.charAt(i)); } const valueList = nameList.map(name => { return alphabet.find(alp => name === alp.alphabet)!.value * (index + 1); }); return valueList.reduce((a, b) => a + b); }); return scores.reduce((a, b) => a + b);
説明
- アルファベットに対応した数を設定する。
- 名前は、配列にして格納しておく
- まず、名前リストをソートする
- ソートした名前リストから名前を取り出し、1文字ずつに分割し、アルファベットに対応した数に変換する
- それらの和を算出し、配列に格納しておく
- 最後に和の配列内の和を算出する