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

3.3 KiB
Raw Blame History

id title challengeType forumTopicId dashedName
5a23c84252665b21eecc8017 Soundex 5 302320 soundex

--description--

Soundex é um algoritmo para criar índices para palavras com base em sua pronúncia. O objetivo é que os homófonos sejam codificados para a mesma representação, para que eles possam ser combinados apesar das pequenas diferenças na ortografia (do artigo da Wikipédia). Há uma questão importante em muitas das implementações relativas à separação de duas consoantes que têm o mesmo código soundex! De acordo com as regras oficiais. Então, verifique por exemplo se Ashcraft é codificado para A-261.

  • Se uma vogal (A, E, I, O, U) separa duas consoantes que tenham o mesmo código soundex, a consoante à direita da vogal é codificada. Tymczak é codificado como T-522 (T, 5 para M, 2 para o C, Z ignorado veja a regra "Lado a lado" acima , 2 para o K). Uma vez que a vogal "A" separa Z e K, o K está codificado.
  • Se "H" ou "W" separa duas consoantes que tenham o mesmo código soundex, a consoante à direita da vogal não é codificada. Exemplo: Ashcraft está codificado A-261 (A, 2 para o S, C ignorado, 6 para o R, 1 para o F). Ele não é codificado A-226.

--instructions--

Escreva uma função que receba uma string como parâmetro e retorne a string codificada.

--hints--

soundex deve ser uma função.

assert(typeof soundex == 'function');

soundex("Soundex") deve retornar uma string.

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

soundex("Soundex") deve retornar "S532".

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

soundex("Example") deve retornar "E251".

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

soundex("Sownteks") deve retornar "S532".

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

soundex("Ekzampul") deve retornar "E251".

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

soundex("Euler") deve retornar "E460".

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

soundex("Gauss") deve retornar "G200".

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

soundex("Hilbert") deve retornar "H416".

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

soundex("Knuth") deve retornar "K530".

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

soundex("Lloyd") deve retornar "L300".

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

soundex("Lukasiewicz") deve retornar "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();
}