freeCodeCamp/curriculum/challenges/ukrainian/10-coding-interview-prep/rosetta-code/soundex.md

4.1 KiB
Raw Blame History

id title challengeType forumTopicId dashedName
5a23c84252665b21eecc8017 Алгоритм Саундекс 5 302320 soundex

--description--

Саундекс — це алгоритм створення індексів для слів на основі їх вимови. Метою є кодування омофонів до одного представлення, щоб їх можна було зіставити, незважаючи на незначні відмінності у написанні (зі статті у Вікіпедії). Великою проблемою в багатьох реалізаціях є розрізнення приголосних із однаковим саундекс-кодом! Згідно з офіційними правилами. Тому перевірте, наприклад, чи Ashcraft закодовано як A-261.

  • Якщо голосний (A, E, I, O, U) звук розділяє два приголосні, які мають однаковий саундекс-код, кодується приголосний праворуч від голосного. Tymczak кодується як T-522 (T, 5 замість M, 2 замість C, Z ігнорується (див. правило "Пліч-о-пліч" вище), 2 замість K). Оскільки голосний "A" розділяє літери Z та К, літера К кодується.
  • Якщо "H" чи "W" розділяють два приголосні із однаковим саундекс-кодом, приголосний праворуч від голосного не кодується. Приклад: Ashcraft кодується як A-261 (A, 2 замість S, C ігнорується, 6 замість R, 1 замість F). Слово не кодується як A-226.

--instructions--

Напишіть функцію, яка приймає рядок як параметр та повертає закодований рядок.

--hints--

soundex має бути функцією.

assert(typeof soundex == 'function');

soundex("Soundex") має повернути рядок.

assert(typeof soundex('Soundex') == 'string');

soundex("Soundex") має повернути "S532".

assert.equal(soundex('Soundex'), 'S532');

soundex("Example")має повернути "E251".

assert.equal(soundex('Example'), 'E251');

soundex("Sownteks") має повернути "S532".

assert.equal(soundex('Sownteks'), 'S532');

soundex("Ekzampul") має повернути "E251".

assert.equal(soundex('Ekzampul'), 'E251');

soundex("Euler") має повернути "E460".

assert.equal(soundex('Euler'), 'E460');

soundex("Gauss") має повернути "G200".

assert.equal(soundex('Gauss'), 'G200');

soundex("Hilbert") має повернути "H416".

assert.equal(soundex('Hilbert'), 'H416');

soundex("Knuth") має повернути "K530".

assert.equal(soundex('Knuth'), 'K530');

soundex("Lloyd") має повернути "L300".

assert.equal(soundex('Lloyd'), 'L300');

soundex("Lukasiewicz") має повернути "L222".

assert.equal(soundex('Lukasiewicz'), 'L222');

--seed--

--seed-contents--

function soundex(s) {

}

--solutions--

function soundex(s) {
  var a = s.toLowerCase().split('');
  var f = a.shift(),
    r = '',
    codes = {
      a: '',
      e: '',
      i: '',
      o: '',
      u: '',
      b: 1,
      f: 1,
      p: 1,
      v: 1,
      c: 2,
      g: 2,
      j: 2,
      k: 2,
      q: 2,
      s: 2,
      x: 2,
      z: 2,
      d: 3,
      t: 3,
      l: 4,
      m: 5,
      n: 5,
      r: 6
    };
  r =
    f +
    a
      .map(function(v, i, a) {
        return codes[v];
      })
      .filter(function(v, i, a) {
        return i === 0 ? v !== codes[f] : v !== a[i - 1];
      })
      .join('');

  return (r + '000').slice(0, 4).toUpperCase();
}