Files
freeCodeCamp/curriculum/challenges/russian/08-coding-interview-prep/project-euler/problem-17-number-letter-counts.russian.md

133 lines
3.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
id: 5900f37d1000cf542c50fe90
challengeType: 5
title: 'Problem 17: Number letter counts'
forumTopicId: 301804
localeTitle: 'Проблема 17: Количество букв'
---
## Description
<section id='description'>
Если числа от 1 до 5 записаны словами: один, два, три, четыре, пять, то есть 3 + 3 + 5 + 4 + 4 = 19 букв, используемых в общей сложности. Если все числа от 1 до заданного <code>limit</code> включительно были записаны на словах, сколько букв будет использовано? <b>ПРИМЕЧАНИЕ.</b> Не считайте пробелы или дефисы. Например, 342 (триста сорок два) содержит 23 буквы и 115 (сто пятнадцать) содержит 20 букв. Использование «и» при написании номеров соответствует британскому использованию.
</section>
## Instructions
<section id='instructions'>
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: <code>numberLetterCounts(5)</code> should return 19.
testString: assert.strictEqual(numberLetterCounts(5), 19);
- text: <code>numberLetterCounts(150)</code> should return 1903.
testString: assert.strictEqual(numberLetterCounts(150), 1903);
- text: <code>numberLetterCounts(1000)</code> should return 21124.
testString: assert.strictEqual(numberLetterCounts(1000), 21124);
```
</section>
## Challenge Seed
<section id='challengeSeed'>
<div id='js-seed'>
```js
function numberLetterCounts(limit) {
// Good luck!
return true;
}
numberLetterCounts(5);
```
</div>
</section>
## Solution
<section id='solution'>
```js
function numberLetterCounts(limit) {
const dictionary = {
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',
1000: 'onethousand'
};
let numString = '';
function convertToString(num) {
// check dictionary for number
if (dictionary[num]) {
return dictionary[num];
} else {
const hundreds = Math.floor(num / 100);
const tens = Math.floor((num / 10) % 10) * 10;
const remainder = num % 10;
let tempStr = '';
if (hundreds === 0) {
tempStr += dictionary[tens] + dictionary[remainder];
} else {
tempStr += dictionary[hundreds] + 'hundred';
if (tens !== 0 || remainder !== 0) {
tempStr += 'and';
}
if (tens < 20) {
const lessThanTwenty = tens + remainder;
tempStr += dictionary[lessThanTwenty];
} else {
tempStr += dictionary[tens] + dictionary[remainder];
}
}
// console.log(num, hundreds, tens, remainder);
return tempStr;
}
}
for (let i = 1; i <= limit; i++) {
numString += convertToString(i);
}
return numString.length;
}
```
</section>