Files
freeCodeCamp/curriculum/challenges/italian/10-coding-interview-prep/rosetta-code/soundex.md
2022-07-12 13:56:02 +02:00

3.5 KiB

id, title, challengeType, forumTopicId, dashedName
id title challengeType forumTopicId dashedName
5a23c84252665b21eecc8017 Soundex 1 302320 soundex

--description--

L'Algoritmo Soundex si occupa dell'intenzione delle parole. Crea una rappresentazione per parole che hanno un suono simile.

È usato per cercare nomi e indirizzi. Questo significa che la persona che ha compilato il nome, può concentrarsi sul suo suono piuttosto che correggere lo spelling dei nomi.

Ad esempio:

Se senti il nome Quenci per la prima volta, e lo scrivi sbagliato, otterrai un codice Soundex di Q520.

Quando scrivi il nome Quincy correttamente la volta successiva, otterrai comunque lo stesso codice Q520, il che significa che puoi collegare pronunce diverse dello stesso nome alla stessa persona senza bisogno di aggiungere ogni modo di scriverlo.

Ecco le regole:

  • Se una vocale (A, E, I, O, U) separata due consonanti che hanno lo stesso codice soundex, la consonante a destra della vocale è codificata. Tymczak è codificato come T-522 (T, 5 per M, 2 per C, Z ignorata (vedi regola "Fianco-a-fianco" qua sopra), 2 per K). Visto che la "A" separa la Z e la K, la K è codificata.
  • Se "H" o "W" separano due consonanti che hanno lo stesso codice soundex, la consonante alla destra della vocale non è codificata. Per esempio: Ashcraft è codificato come A-261 (A, 2 per S, C ignorata, 6 per R, 1 per F). Non è codificata come A-226.

--instructions--

Scrivi una funzione che prende una stringa come parametro e restituisce la stringa codificata.

--hints--

soundex dovrebbe essere una funzione.

assert(typeof soundex == 'function');

soundex("Soundex") dovrebbe restituire una stringa.

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

soundex("Soundex") dovrebbe restituire "S532".

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

soundex("Example") dovrebbe restituire "E251".

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

soundex("Sownteks") dovrebbe restituire "S532".

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

soundex("Ekzampul") dovrebbe restituire "E251".

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

soundex("Euler") dovrebbe restituire "E460".

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

soundex("Gauss") dovrebbe restituire "G200".

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

soundex("Hilbert") dovrebbe restituire "H416".

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

soundex("Knuth") dovrebbe restituire "K530".

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

soundex("Lloyd") dovrebbe restituire "L300".

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

soundex("Lukasiewicz") dovrebbe restituire "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();
}