kostumブログ

勉強したことやノート代わりのアウトプットに使っています。

project Euler 022

環境

問題

5000個以上の名前が書かれている46Kのテキストファイル names.txt を用いる. まずアルファベット順にソートせよ.

のち, 各名前についてアルファベットに値を割り振り, リスト中の出現順の数と掛け合わせることで, 名前のスコアを計算する.

たとえば, リストがアルファベット順にソートされているとすると, COLINはリストの938番目にある. またCOLINは 3 + 15 + 12 + 9 + 14 = 53 という値を持つ. よってCOLINは 938 × 53 = 49714 というスコアを持つ.

ファイル中の全名前のスコアの合計を求めよ.

考え方

  1. アルファベットに対する値を変数に設定する。
  2. 5000個以上の名前を配列に格納し、アルファベット順にソートする
  3. 2.の名前からスコア数を算出する
  4. スコアの合計を算出する

コード

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文字ずつに分割し、アルファベットに対応した数に変換する
  • それらの和を算出し、配列に格納しておく
  • 最後に和の配列内の和を算出する