Answer

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



Report Page