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

3.8 KiB

id title challengeType forumTopicId dashedName
5a23c84252665b21eecc8017 サウンデックス 5 302320 soundex

--description--

サウンデックスは発音から単語のインデックスを作成するためのアルゴリズムです。 目的は、複数の同音異義語を同じ表記にコード化して、スペルの微小な違いにもかかわらず、一致させることです (wikipedia記事より)。 同じサウンデックスコードを持つ 2 つの子音の分離に関する実装には、多くの場合、大きな問題があります。 (公式ルール より)。 では、AshcraftA-261 にコード化する場合を確認してみましょう。

  • 母音 (A、E、I、O、U) が同じサウンデックスコードを持つ2つの子音を分離している場合、母音の右側の子音がコード化されます。 Tymczak は T-522 (T、Mを5、Cを2、Zは無視 (上記の隣接ルールを参照)、Kを2) としてコード化されます。 母音 "A" が Z と K を分離しているため、K がコード化されます。
  • "H" または "W" が同じサウンデックスコードを持つ 2 つの子音を分離している場合、母音の右側の子音はコード化されません。 例: Ashcraft は A-261 (A、Sを2、Cは無視、Rを6、Fを1) にコード化されます。 A-226 にはコード化されません。

--instructions--

1つの文字列をパラメータとして取り、コード化した文字列を返す関数を記述してください。

--hints--

soundex は関数とします。

assert(typeof soundex == 'function');

soundex("Soundex") は文字列を返す必要があります。

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

soundex("Soundex")"S532" を返す必要があります。

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

soundex("Example")"E251" を返す必要があります。

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

soundex("Sownteks")"S532" を返す必要があります。

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

soundex("Ekzampul")"E251" を返す必要があります。

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

soundex("Euler")"E460" を返す必要があります。

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

soundex("Gauss")"G200" を返す必要があります。

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

soundex("Hilbert")"H416" を返す必要があります。

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

soundex("Knuth")"K530" を返す必要があります。

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

soundex("Lloyd")"L300" を返す必要があります。

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

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