環境
問題
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(one) ~ 10(ten), eleven, twelve, thirteen, fourteen, fifteen, sixteen, seventeen, eighteen, nineteen, twenty, thirty, forty, fifty, sixty, seventy, eighty, ninety, hundred, thousand, and を文字数化する
- 1から1000までを数え上げる
- 数え上げ数を分解して、英単語で表す
- 英単語を文字数に変換する
- 合計値を計算する
コード
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桁目の数字を文字に変換し、それぞれの長さを算出して、和を計算する