Answer
t.me/js_testОтвет:
const convertToDigits = (str) => {
let output = '';
var digits = Array.from({ length: 10 }, () => 0);
for (const sym of str) {
switch (sym) {
case 'z': // only zero contains 'z'
digits[0]++;
break;
case 'w': // only two contains 'w'
digits[2]++;
break;
case 'u': // only four contains 'u'
digits[4]++;
break;
case 'x': // only six contains 'x'
digits[6]++;
break;
case 'g': // only eight contains 'g'
digits[8]++;
break;
case 'f': // only four, five contains 'f'
digits[5]++;
break;
case 's': // only six, seven contains 's'
digits[7]++;
break;
case 'h': // only three, eight contains 'h'
digits[3]++;
break;
case 'i': // only nine, five, six, eight contains 'i'
digits[9]++;
break;
case 'o': // only one, zero, two, four contains 'o'
digits[1]++;
break;
default:
break;
}
}
// Вычитаем соот.значения из цифр, ктр определяются по нескольким буквам
digits[5] = digits[5] - digits[4];
digits[7] = digits[7] - digits[6];
digits[3] = digits[3] - digits[8];
digits[9] = digits[9] - digits[6] - digits[8] - digits[5];
digits[1] = digits[1] - digits[0] - digits[2] - digits[4];
// собираем получившиеся цифры
for (let i = 0; i < 10; i++) {
let digitCount = digits[i];
while (digitCount > 0) {
output += i.toString();
digitCount--;
}
}
return output;
};
Обьяснение:
Классический синтаксический разбор. Тот факт, что по условию гарантируется, что исходная строка “валидная”, т.е. буквы в ней точно образуют набор некоторых цифр, облегчает нам задачу.
Нам достаточно определить уникальные особенности в слове каждой цифры, чтобы понять какую именно цифру мы нашли в строке.
Итак: 0 — zero, 1 — one, 2 — two, 3 — three, 4 — four, 5 — five, 6 — six, 7 — seven, 8 — eight, 9 — nine
Можно заметить, что нектр буквы есть только в одних цифрах. Например,
- Zero — буква Z есть только в этом слове.
- tWo — W есть только в этом слове.
- foUr — U есть только здесь.
- siX — X есть только здесь.
- eiGht — G есть только здесь.
Теперь можно найти буквы, ктр содержатся в 2х словах.
Например,
- tHree, eigHt — буква H есть только в 3ке и 8ке.
Как можно это использовать?! Мы можем точно определить кол-во 8-ок, а кол-во 3-ек мы считаем по кол-ву букв ‘H’ за вычетом кол-ва 8-ок. Т.е. Count(3) = Count(‘H’) — Count(8).
Также можно заметить, что
- Four, Five — буква F есть только в 4ке и 5ке.
- Six, Seven — буква S есть только в 6ке и 7ке.
Теперь мы можем определить цифры 0, 2, 4, 6, 8 и 3, 5, 7.
Осталось определить цифры, 1, 9. Нам нужно найти какое то различие цифр 1 и 9. Например,
- nIne — буква I есть только в 9ке, 5ке, 6ке, 8ке, но нет в 1.
Значит, Count(9) = Count(‘I’) — Count(5) — Count(6) — Count(8).
- One — буква ‘O’ есть только в 1е, 0, 2ке, 4ке
Значит, Count(1) = Count(‘O’) — Count(0) — Count(2) — Count(4).
Код для проверки:
const convertToDigits = (str) => {
let output = '';
var digits = Array.from({ length: 10 }, () => 0);
for (const sym of str) {
switch (sym) {
case 'z': // only zero contains 'z'
digits[0]++;
break;
case 'w': // only two contains 'w'
digits[2]++;
break;
case 'u': // only four contains 'u'
digits[4]++;
break;
case 'x': // only six contains 'x'
digits[6]++;
break;
case 'g': // only eight contains 'g'
digits[8]++;
break;
case 'f': // only four, five contains 'f'
digits[5]++;
break;
case 's': // only six, seven contains 's'
digits[7]++;
break;
case 'h': // only three, eight contains 'h'
digits[3]++;
break;
case 'i': // only nine, five, six, eight contains 'i'
digits[9]++;
break;
case 'o': // only one, zero, two, four contains 'o'
digits[1]++;
break;
default:
break;
}
}
// Вычитаем соот.значения из цифр, ктр определяются по нескольким буквам
digits[5] = digits[5] - digits[4];
digits[7] = digits[7] - digits[6];
digits[3] = digits[3] - digits[8];
digits[9] = digits[9] - digits[6] - digits[8] - digits[5];
digits[1] = digits[1] - digits[0] - digits[2] - digits[4];
// собираем получившиеся цифры
for (let i = 0; i < 10; i++) {
let digitCount = digits[i];
while (digitCount > 0) {
output += i.toString();
digitCount--;
}
}
return output;
};
console.log(convertToDigits('owoztneoer')); // 012
console.log(convertToDigits('fviefuro')); // 45