--- id: 5a23c84252665b21eecc8017 title: Алгоритм Саундекс challengeType: 5 forumTopicId: 302320 dashedName: soundex --- # --description-- Саундекс — це алгоритм створення індексів для слів на основі їх вимови. Метою є кодування омофонів до одного представлення, щоб їх можна було зіставити, незважаючи на незначні відмінності у написанні (зі [статті у Вікіпедії](https://en.wikipedia.org/wiki/soundex)). Великою проблемою в багатьох реалізаціях є розрізнення приголосних із однаковим саундекс-кодом! Згідно з [ офіційними правилами](https://www.archives.gov/research/census/soundex.html). Тому перевірте, наприклад, чи **Ashcraft** закодовано як **A-261**. # --instructions-- Напишіть функцію, яка приймає рядок як параметр та повертає закодований рядок. # --hints-- `soundex` має бути функцією. ```js assert(typeof soundex == 'function'); ``` `soundex("Soundex")` має повернути рядок. ```js assert(typeof soundex('Soundex') == 'string'); ``` `soundex("Soundex")` має повернути `"S532"`. ```js assert.equal(soundex('Soundex'), 'S532'); ``` `soundex("Example")`має повернути `"E251"`. ```js assert.equal(soundex('Example'), 'E251'); ``` `soundex("Sownteks")` має повернути `"S532"`. ```js assert.equal(soundex('Sownteks'), 'S532'); ``` `soundex("Ekzampul")` має повернути `"E251"`. ```js assert.equal(soundex('Ekzampul'), 'E251'); ``` `soundex("Euler")` має повернути `"E460"`. ```js assert.equal(soundex('Euler'), 'E460'); ``` `soundex("Gauss")` має повернути `"G200"`. ```js assert.equal(soundex('Gauss'), 'G200'); ``` `soundex("Hilbert")` має повернути `"H416"`. ```js assert.equal(soundex('Hilbert'), 'H416'); ``` `soundex("Knuth")` має повернути `"K530"`. ```js assert.equal(soundex('Knuth'), 'K530'); ``` `soundex("Lloyd")` має повернути `"L300"`. ```js assert.equal(soundex('Lloyd'), 'L300'); ``` `soundex("Lukasiewicz")` має повернути `"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(); } ```