Files

152 lines
3.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
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**.
<ul>
<li>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.</li>
<li>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.</li>
</ul>
# --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();
}
```