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

3.4 KiB

id title challengeType forumTopicId dashedName
5a23c84252665b21eecc8017 Soundex 5 302320 soundex

--description--

Soundex Algorithm deals with the intentions of the words. It creates a representation for similar sounding words.

It is used for searching names and addresses. This means that the person who filled in the name, can focus on how it sounds instead of correcting the spelling of names.

For example:

If you are hearing the name Quenci for the first time, and misspelled it, you will get Soundex code Q520.

When you spell the name Quincy correctly next time, you will still get the same code Q520, which means you can link multiple name pronunciations into the same person without the need for adding every spelling.

Here is the rules:

  • If a vowel (A, E, I, O, U) separates two consonants that have the same soundex code, the consonant to the right of the vowel is coded. Tymczak is coded as T-522 (T, 5 for the M, 2 for the C, Z ignored (see "Side-by-Side" rule above), 2 for the K). Since the vowel "A" separates the Z and K, the K is coded.
  • If "H" or "W" separate two consonants that have the same soundex code, the consonant to the right of the vowel is not coded. Example: Ashcraft is coded A-261 (A, 2 for the S, C ignored, 6 for the R, 1 for the F). It is not coded A-226.

--instructions--

Write a function that takes a string as a parameter and returns the encoded string.

--hints--

soundex should be a function.

assert(typeof soundex == 'function');

soundex("Soundex") should return a string.

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

soundex("Soundex") should return "S532".

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

soundex("Example") should return "E251".

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

soundex("Sownteks") should return "S532".

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

soundex("Ekzampul") should return "E251".

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

soundex("Euler") should return "E460".

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

soundex("Gauss") should return "G200".

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

soundex("Hilbert") should return "H416".

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

soundex("Knuth") should return "K530".

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

soundex("Lloyd") should return "L300".

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

soundex("Lukasiewicz") should return "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();
}