--- id: 5a23c84252665b21eecc8017 title: Soundex challengeType: 5 forumTopicId: 302320 dashedName: 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](https://en.wikipedia.org/wiki/soundex)). 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](https://www.archives.gov/research/census/soundex.html). Então, verifique por exemplo se **Ashcraft** é codificado para **A-261**. # --instructions-- Escreva uma função que receba uma string como parâmetro e retorne a string codificada. # --hints-- `soundex` deve ser uma função. ```js assert(typeof soundex == 'function'); ``` `soundex("Soundex")` deve retornar uma string. ```js assert(typeof soundex('Soundex') == 'string'); ``` `soundex("Soundex")` deve retornar `"S532"`. ```js assert.equal(soundex('Soundex'), 'S532'); ``` `soundex("Example")` deve retornar `"E251"`. ```js assert.equal(soundex('Example'), 'E251'); ``` `soundex("Sownteks")` deve retornar `"S532"`. ```js assert.equal(soundex('Sownteks'), 'S532'); ``` `soundex("Ekzampul")` deve retornar `"E251"`. ```js assert.equal(soundex('Ekzampul'), 'E251'); ``` `soundex("Euler")` deve retornar `"E460"`. ```js assert.equal(soundex('Euler'), 'E460'); ``` `soundex("Gauss")` deve retornar `"G200"`. ```js assert.equal(soundex('Gauss'), 'G200'); ``` `soundex("Hilbert")` deve retornar `"H416"`. ```js assert.equal(soundex('Hilbert'), 'H416'); ``` `soundex("Knuth")` deve retornar `"K530"`. ```js assert.equal(soundex('Knuth'), 'K530'); ``` `soundex("Lloyd")` deve retornar `"L300"`. ```js assert.equal(soundex('Lloyd'), 'L300'); ``` `soundex("Lukasiewicz")` deve retornar `"L222"`. ```js assert.equal(soundex('Lukasiewicz'), 'L222'); ``` # --seed-- ## --seed-contents-- ```js function soundex(s) { } ``` # --solutions-- ```js 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(); } ```