Как преобразовать массив [1,1,Q,1,R] в строку "2Q1R"
Есть массив [1,1,1,Q,1,1,R,1]
Как получить строку вида " 3Q2R1 " т.е. все единицы которые идут подряд - плюсуются; или, для примера, массив [1,1,N,W,1,1,1,Q] требуемая строка на выходе = " 2NW3Q " (т.е если подряд единицы то они плюсуются). Неделю копаю, не осилю, помогите пожалуйста. Заранее благодарен! :cray: |
querubin,
function str_pack(arr) { var acc = 0, str = ''; for( i in arr ){ if( isNaN(arr[i]) ) str = str + (acc > 0 ? acc : '') + arr[i], acc = 0; else acc = +arr[i] + acc; } if( acc > 0 ) str += acc; return str; } console.log(str_pack([1,1,'Q',1,'R'])); console.log(str_pack([1,1,1,'Q',1,1,'R',1])); console.log(str_pack([1,1,'N','W',1,1,1,'Q'])); |
querubin ,
function str_pack(arr) { return arr.join('').replace(/1+/g, a => a.length) } console.log(str_pack([1,1,'Q',1,'R'])); console.log(str_pack([1,1,1,'Q',1,1,'R',1])); console.log(str_pack([1,1,'N','W',1,1,1,'Q'])); |
рони,
:thanks: Респект. |
рони, прикольно. Единственный вопрос - что делать в таком случае [1,1,'Q',11,'R'] (если он возможен).)
|
Бомж-стайл вариант:
function f(ar){ let res = [0]; ar.forEach( n => typeof n == 'number' && typeof res[ res.length - 1 ] == 'number' ? res[ res.length - 1 ] += n : res.push(n) ); return res.join('').replace( /^0/, '' ); } console.log( f( [1, 1, 'Q', 1, 'R'] )); //2Q1R console.log( f( [1, 1, 1, 'Q', 1, 1, 'R', 1] ) ); // 3Q2R1 console.log( f( [1, 1, 'N', 'W', 1, 1, 1, 'Q'] ) ); // 2NW3Q /*****/ console.log( f( [1, 11, 'N', 'W', 3, 55 , 0, 'Q'] ) ); // 12NW58Q console.log( f( ['A', 1, 21, 'N', 'W', 3, 55, 0, 'Q', 4] ) ); // A22NW58Q4 console.log( f( ['A','CDE', 1, 21, 'N', 'W', 3, 'Q', 4] ) ); // ACDE22NW3Q4 |
Cuntmann,
:) function f(ar) { let i = 0; for (let n of ar.slice(1)) { if (typeof (n + ar[i]) == 'number') ar[i] += n; else ar[++i] = n; } ar.length = ++i; return ar.join(''); } console.log(f([1, 1, 'Q', 1, 'R'])); //2Q1R console.log(f([1, 1, 1, 'Q', 1, 1, 'R', 1])); // 3Q2R1 console.log(f([1, 1, 'N', 'W', 1, 1, 1, 'Q'])); // 2NW3Q /*****/ console.log(f([1, 11, 'N', 'W', 3, 55, 0, 'Q'])); // 12NW58Q console.log(f(['A', 1, 21, 'N', 'W', 3, 55, 0, 'Q', 4])); // A22NW58Q4 console.log(f(['A', 'CDE', 1, 21, 'N', 'W', 3, 'Q', 4])); // ACDE22NW3Q4 |
рони, :yes: :thanks:
|
Подкину и я свои 5коп...
function f(ar) { const o = ar.reduce((o, v) => (typeof v === 'number' ? o.n += v : (o.t += (o.n || '') + v, o.n = 0) , o), {t: '', n: 0}) return o.t + (o.n || '') } console.log(f([1, 1, 'Q', 1, 'R'])); //2Q1R console.log(f([1, 1, 1, 'Q', 1, 1, 'R', 1])); // 3Q2R1 console.log(f([1, 1, 'N', 'W', 1, 1, 1, 'Q'])); // 2NW3Q /*****/ console.log(f([1, 11, 'N', 'W', 3, 55, 0, 'Q'])); // 12NW58Q console.log(f(['A', 1, 21, 'N', 'W', 3, 55, 0, 'Q', 4])); // A22NW58Q4 console.log(f(['A', 'CDE', 1, 21, 'N', 'W', 3, 'Q', 4])); // ACDE22NW3Q4 Но вариант с регуляркой явно не переплюнуть... :D |
Часовой пояс GMT +3, время: 09:45. |