[アルゴリズム]電話番号分身(小米2017秋招真題)[JavaScript]


テーマの説明
MIUIは携帯電話の分身機能を発表したMIUU 8に続き、電話番号の分身機能を導入する予定だ.まず、電話番号の数字に8桁を付けて、大文字で代替する(「ZERO」、「ONE」、「TWO」、「THREE」、「FOUR」、「FIVE」、「SIX」、「SEVEN」、「EITGHT」、「NINE」の文字をランダムにして混乱させる.生成された文字列は電話番号のペアに分身するべきです.
例:入力=>出力EGHT=>0 ZEROTWOONE=>234 OHWETENRTEO=>345 OHEWT IEGTHERTEO=>0345
この問題は文字列を入力して、数字列にマッピングします.写像問題はまず辞書でやってみる習慣です.
10個の数字は英語の単語と一々対応していますが、これらの単語はいくつかの文章を作ることができますか?
これらの10個の数字の英語単語の中で、文字ZZEROだけに存在し、WTWOだけに存在することが分かります.したがって、文字列でZが発見されると、0が存在していると言える.ここでZ と呼び、ZERO と呼び、0 と呼びます.

{
    Z: ['ZERO', 0],
    W: ['TWO', 2],
    U: ['FOUR', 4],
    X: ['SIX', 6],
    G: ['EIGHT', 8]
}
0, 2, 4, 6, 8はすでに処理済みで、まだ1, 3, 5, 7, 9が残っています.詳しく分析すると、文字Oはこの5つの数字の英語ではONEだけに存在していることが分かります.文字FFIVEにのみ存在し、これに類推する.じゃ、私達はまた一つのマップを得ることができます.

{
    O: ['ONE', 1],
    T: ['THREE', 3],
    F: ['FIVE', 5],
    S: ['SEVEN', 7]
}
なぜここに9のマッピングがないですか?NINEN, I, E1, 3, 5, 7に全部出現していますので、ここは空いています.
ここの二つのマッピング関係は統合できないです.なぜですか?
これらのマッピング関係は何のためにありますか?ここは辞書を使います.入力した文字列を辞書構造に変換してもいいです.keyは文字で、valueは文字列全体に現れる回数です.
たとえば:
"OHEWTIEGTHENRTEO"

var dict = {
    E: 4,
    T: 3,
    O: 2,
    H: 2,
    I: 1,
    G: 1,
    W: 1,
    N: 1,
    R: 1
}
そして私たちはこの辞書を遍歴しました.

[{
    Z: ['ZERO', 0],
    W: ['TWO', 2],
    U: ['FOUR', 4],
    X: ['SIX', 6],
    G: ['EIGHT', 8]
},{
    O: ['ONE', 1],
    T: ['THREE', 3],
    F: ['FIVE', 5],
    S: ['SEVEN', 7]
}].map(map => {
    Object.keys(dict).map(key => {
        /**              
         *                      0
         */
        map[key] && dict[key] > 0 &&
        /**
         *                       ,
         *         ,            1,         
         */
        map[key][0].split('').map(char => dict[char] -= 1) &&
        //           
        console.log(map[key][1])
    })
})

/**
 * 2
 * 8
 * 1
 * 3
 */
しかし、OHEWTIEGTHENRTEOの出力値は0345であるべきです.どこで間違えましたか?
問題の中のひと言に注意します.
まず電話番号の数字に8をつけて、席を取ります.
つまり、私たちが打った値はこの 8 を逆にする必要があります.いくつかの方法があります.1つは、印刷時にmap[key][1]を処理する方法です.
num => num - 8 >= 0 ? num - 8 : num + 2
あるいは、私はここで怠けた方法を使っていますが、私達のマッピングの中に数字の値があることを覚えていますか?私は人工的に交替しました.P

[{
    Z: ['ZERO', 2],
    W: ['TWO', 4],
    U: ['FOUR', 6],
    X: ['SIX', 8],
    G: ['EIGHT', 0]
},{
    O: ['ONE', 3],
    T: ['THREE', 5],
    F: ['FIVE', 7],
    S: ['SEVEN', 9
}].map(map => {
    Object.keys(dict).map(key => {
        map[key] && dict[key] > 0 &&
        map[key][0].split('').map(char => dict[char] -= 1) &&
        console.log(map[key][1])
    })
})

/**
 * 4
 * 0
 * 3
 * 5
 */
今は出力値を順に並べばいいです.

var output = [];

[{ Z: ['ZERO', 2], W: ['TWO', 4], U: ['FOUR', 6], X: ['SIX', 8], G: ['EIGHT', 0]
},{ O: ['ONE', 3], T: ['THREE', 5], F: ['FIVE', 7], S: ['SEVEN', 9}].map(map => {
    Object.keys(dict).map(key => {
        map[key] && dict[key] > 0 &&
        map[key][0].split('').map(char => dict[char] -= 1) &&
        output.push(map[key][1])
    })
})

/* 
 *        9        ?      ~
 * 9     NINE                       N I E         
 *         E
 *    9        1,       ?
 */
//if (dict['E'] && dict['E'] > 0) output.push(1)

/**
 * 2017.09.19 08:36   :
 *            9,      9       ,         :
 */
 dist['E'] && //             E,             ,     E,     9
 (output = output.concat(Array(dist['E']).fill(1))) // js  ,                 

output.sort()
console.log(output) // 0 3 4 5
本文のタイトルには[ ]プレフィックスがありますが、この書き方は全く複雑さなどを考えていません.