kostumブログ

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

project Euler 017

環境

問題

1 から 5 までの数字を英単語で書けば one, two, three, four, five であり, 全部で 3 + 3 + 5 + 4 + 4 = 19 の文字が使われている.

では 1 から 1000 (one thousand) までの数字をすべて英単語で書けば, 全部で何文字になるか.

: 空白文字やハイフンを数えないこと. 例えば, 342 (three hundred and forty-two) は 23 文字, 115 (one hundred and fifteen) は20文字と数える. なお, "and" を使用するのは英国の慣習.

考え方

  1. 1(one) ~ 10(ten), eleven, twelve, thirteen, fourteen, fifteen, sixteen, seventeen, eighteen, nineteen, twenty, thirty, forty, fifty, sixty, seventy, eighty, ninety, hundred, thousand, and を文字数化する
  2. 1から1000までを数え上げる
  3. 数え上げ数を分解して、英単語で表す
  4. 英単語を文字数に変換する
  5. 合計値を計算する

コード

let eitangoList = [
  {
    number: 0,
    eitango: ""
  },
  {
    number: 1,
    eitango: "one"
  },
  {
    number: 2,
    eitango: "two"
  },
  {
    number: 3,
    eitango: "three"
  },
  {
    number: 4,
    eitango: "four"
  },
  {
    number: 5,
    eitango: "five"
  },
  {
    number: 6,
    eitango: "six"
  },
  {
    number: 7,
    eitango: "seven"
  },
  {
    number: 8,
    eitango: "eight"
  },
  {
    number: 9,
    eitango: "nine"
  },
  {
    number: 10,
    eitango: "ten"
  },
  {
    number: 11,
    eitango: "eleven"
  },
  {
    number: 12,
    eitango: "twelve"
  },
  {
    number: 13,
    eitango: "thirteen"
  },
  {
    number: 14,
    eitango: "fourteen"
  },
  {
    number: 15,
    eitango: "fifteen"
  },
  {
    number: 16,
    eitango: "sixteen"
  },
  {
    number: 17,
    eitango: "seventeen"
  },
  {
    number: 18,
    eitango: "eighteen"
  },
  {
    number: 19,
    eitango: "nineteen"
  },
  {
    number: 20,
    eitango: "twenty"
  },
  {
    number: 30,
    eitango: "thirty"
  },
  {
    number: 40,
    eitango: "forty"
  },
  {
    number: 50,
    eitango: "fifty"
  },
  {
    number: 60,
    eitango: "sixty"
  },
  {
    number: 70,
    eitango: "seventy"
  },
  {
    number: 80,
    eitango: "eighty"
  },
  {
    number: 90,
    eitango: "ninety"
  },
  {
    number: 100,
    eitango: "hundred"
  },
  {
    number: 1000,
    eitango: "thousand"
  }
];

let sum = 0;
for (let i = 1; i <= 1000; i++) {
  let eitangosu: number | undefined = 0;

  let iStr = String(i);
  let niketa = String(i).substring(-2);
  let sanketa = String(i).substring(-3);

  // 一桁
  if (iStr.length === 1) {
    eitangosu = eitangoList.find(eigo => {
      return i === eigo.number;
    })?.eitango.length;
    if (eitangosu) {
      sum = sum + eitangosu;
    }
  }
  // 二桁
  if (iStr.length === 2) {
    if (i < 21) {
      eitangosu = eitangoList.find(eigo => {
        return i === eigo.number;
      })?.eitango.length;
      if (eitangosu) {
        sum = sum + eitangosu;
      }
    } else {
      let niketame = niketa.charAt(0);
      let hitoketame = niketa.charAt(1);
      let ninokurai = niketame + "0";
      let niketameeitango = eitangoList.find(eigo => {
        return eigo.number === Number.parseInt(ninokurai);
      });
      let hitoketameeitango = eitangoList.find(eigo => {
        return eigo.number === Number.parseInt(hitoketame);
      });
      if (!niketameeitango || !hitoketameeitango) return;

      sum =
        sum +
        niketameeitango.eitango.length +
        hitoketameeitango?.eitango.length;
    }
  }
  // 三桁
  if (iStr.length === 3) {
    let sanketame = sanketa.charAt(0);
    let niketame = niketa.charAt(1);
    let hitoketame = niketa.charAt(2);

    let sannokurai = sanketame;
    let ninokurai = niketame + "0";

    let sanketameeitango =
      eitangoList.find(eigo => {
        return eigo.number === Number.parseInt(sannokurai);
      })?.eitango + "hundredand";
    let niketameeitango = eitangoList.find(eigo => {
      return eigo.number === Number.parseInt(ninokurai);
    });
    let hitoketameeitango = eitangoList.find(eigo => {
      return eigo.number === Number.parseInt(hitoketame);
    });
    if (!niketameeitango || !hitoketameeitango) return;
    sum =
      sum +
      sanketameeitango.length +
      niketameeitango.eitango.length +
      hitoketameeitango?.eitango.length;
  }
  if (iStr.length === 4) {
    let yonnokurai = "onethousand";
    sum = sum + yonnokurai.length;
  }
}
return sum;

説明

  • 英単語に対応する数を連想配列として設定する。
  • 数え上げ数の1桁目、2桁目、3桁目の数字を文字に変換し、それぞれの長さを算出して、和を計算する