5

長さが 8 文字を超えることのない文字列を作成します。たとえば、次のようになります。

// represented as array to demonstrate multiple examples
var strs = [
    '11111111',
    '1RBN4',
    '12B5'
]    

関数を実行すると、すべての数字文字が合計されて最終的な文字列が返されます。

var strsAfterFunction = [
    '8',
    '1RBN4',
    '3B5'
]

1最初の文字列の 8 つの単一文字すべてが単一の文字列として終了するのを見ることができますが8、2 番目の文字列は変更されません。隣接する数字文字が存在しないため、3 番目の文字列は12文字が a3になり、残りの部分が変化します。文字列の変更はありません。

疑似コードでこれを行う最良の方法は次のようになると思います。

1. split the array by regex to find multiple digit characters that are adjacent
2. if an item in the split array contains digits, add them together
3. join the split array items

.split複数の連続数字文字で分割する正規表現は次のようになります。

var str = '12RB1N1'
  => ['12', 'R', 'B', '1', 'N', '1']

編集:

質問:結果が「27」または「9」の場合、文字列「999」はどうなりますか

明確な場合は、常に数字を合計します999=> 27, 234=>9

4

3 に答える 3

12

変換全体に対してこれを行うことができます:

var results = strs.map(function(s){
    return s.replace(/\d+/g, function(n){
       return n.split('').reduce(function(s,i){ return +i+s }, 0)
    })
});

strs配列の場合、 を返します["8", "1RBN4", "3B5"]

于 2013-06-11T19:18:27.097 に答える
1

ジョージ...私の答えはもともとジストロイのものに似ていましたが、今夜家に帰ってあなたのコメントを見つけたとき、私は挑戦を見逃すことができませんでした

:)

ここでは正規表現なしです。fwiw の方が速いかもしれませんが、反復はネイティブであるため、興味深いベンチマークになるでしょう。

function p(s){
  var str = "", num = 0;
  s.split("").forEach(function(v){
    if(!isNaN(v)){
        (num = (num||0) + +v);
    } else if(num!==undefined){
        (str += num + v,num = undefined);
    } else {
        str += v;
    }
  });
  return str+(num||"");
};

// TESTING
console.log(p("345abc567"));
// 12abc18
console.log(p("35abc2134mb1234mnbmn-135"));
// 8abc10mb10mnbmn-9
console.log(p("1 d0n't kn0w wh@t 3153 t0 thr0w @t th15 th1n6"));
// 1d0n't0kn0w0wh@t12t0thr0w0@t0th6th1n6

// EXTRY CREDIT
function fn(s){
    var a = p(s);
    return a === s ? a : fn(a);
}

console.log(fn("9599999gh999999999999999h999999999999345"));
// 5gh9h3

そして、これがフィドルと、過度に巧妙な三項のない新しいフィドルです

于 2013-06-12T04:56:58.307 に答える