diff --git a/DIRECTORY.md b/DIRECTORY.md index 8290405c9a..398de3ea2f 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -197,6 +197,7 @@ * [Problem014](https://github.com/TheAlgorithms/Javascript/blob/master/Project-Euler/Problem014.js) * [Problem015](https://github.com/TheAlgorithms/Javascript/blob/master/Project-Euler/Problem015.js) * [Problem016](https://github.com/TheAlgorithms/Javascript/blob/master/Project-Euler/Problem016.js) + * [Problem017](https://github.com/TheAlgorithms/Javascript/blob/master/Project-Euler/Problem017.js) * [Problem020](https://github.com/TheAlgorithms/Javascript/blob/master/Project-Euler/Problem020.js) * [Problem1](https://github.com/TheAlgorithms/Javascript/blob/master/Project-Euler/Problem1.js) * [Problem10](https://github.com/TheAlgorithms/Javascript/blob/master/Project-Euler/Problem10.js) diff --git a/Project-Euler/Problem017.js b/Project-Euler/Problem017.js new file mode 100644 index 0000000000..b546177e31 --- /dev/null +++ b/Project-Euler/Problem017.js @@ -0,0 +1,77 @@ +/* +https://projecteuler.net/problem=17 + +If the numbers 1 to 5 are written out in words: one, two, three, four, five, then there are 3 +たす 3 +たす 5 +たす 4 +たす 4 = 19 letters used in total. +If all the numbers from 1 to 1000 (one thousand) inclusive were written out in words, how many letters would be used? + +NOTE: Do not count spaces or hyphens. For example, 342 (three hundred and forty-two) contains 23 letters and 115 (one hundred and fifteen) contains 20 letters. The use of "and" when writing out numbers is in compliance with British usage. +*/ + +const numberToCharMap = { + 0: '', + 1: 'one', + 2: 'two', + 3: 'three', + 4: 'four', + 5: 'five', + 6: 'six', + 7: 'seven', + 8: 'eight', + 9: 'nine', + 10: 'ten', + 11: 'eleven', + 12: 'twelve', + 13: 'thirteen', + 14: 'fourteen', + 15: 'fifteen', + 16: 'sixteen', + 17: 'seventeen', + 18: 'eighteen', + 19: 'nineteen', + 20: 'twenty', + 30: 'thirty', + 40: 'forty', + 50: 'fifty', + 60: 'sixty', + 70: 'seventy', + 80: 'eighty', + 90: 'ninety', + 100: 'hundred', + 1000: 'onethousand' +} + +const getOnes = (n) => Math.floor(n % 10) +const getTens = (n) => Math.floor((n / 10) % 10) +const getHundreds = (n) => Math.floor((n / 100) % 10) + +const countNumberLetter = (n) => { + let numberLetter = '' + + for (let i = 1; i <= n; i++) { + const ones = getOnes(i) + const tens = getTens(i) + const hundreds = getHundreds(i) + + if (i <= 20 || (i < 100 && ones === 0) || i === 1000) + numberLetter += numberToCharMap[i] + else if (i < 100) + numberLetter += numberToCharMap[tens * 10] + numberToCharMap[ones] + else if (i < 1000) { + if (ones !== 0 || tens !== 0) numberLetter += 'and' + const tensPlusOnes = tens * 10 + ones + numberLetter += + tensPlusOnes < 20 + ? numberToCharMap[hundreds] + + numberToCharMap[100] + + numberToCharMap[tensPlusOnes] + : numberToCharMap[hundreds] + + numberToCharMap[100] + + numberToCharMap[tens * 10] + + numberToCharMap[ones] + } + } + + return numberLetter.length +} + +export { countNumberLetter } diff --git a/Project-Euler/test/Problem017.test.js b/Project-Euler/test/Problem017.test.js new file mode 100644 index 0000000000..8fde60bf1d --- /dev/null +++ b/Project-Euler/test/Problem017.test.js @@ -0,0 +1,13 @@ +import { countNumberLetter } from '../Problem017' + +describe('checkCountNumberLetter', () => { + it('Solves the problem statement example', () => { + const numberLetter = countNumberLetter(1000) + expect(numberLetter).toBe(21124) + }) + + it('Returns first five numbers count', () => { + const numberLetter = countNumberLetter(5) + expect(numberLetter).toBe(19) + }) +})

AltStyle によって変換されたページ (->オリジナル) /