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

3.4 KiB

id title challengeType forumTopicId dashedName
5a23c84252665b21eecc8017 Soundex 5 302320 soundex

--description--

Soundex è un algoritmo per creare indici per le parole basato sulla loro pronuncia. L'obbiettivo è avere gli omofoni codificati alla stessa rappresentazione così che possano essere combaciati nonostante piccole differenze di ortografia (dall'articolo di Wikipedia). C'è un problema importante in molte delle implementazioni riguardanti la separazione di due consonanti che hanno lo stesso codice soundex! In accordo con le regole ufficiali. Quindi controlla se per esempio Ashcraft è codificato a A-261.

  • 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();
}