Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как преобразовать массив [1,1,Q,1,R] в строку "2Q1R" (https://javascript.ru/forum/misc/85208-kak-preobrazovat-massiv-%5B1-1-q-1-r%5D-v-stroku-2q1r.html)

querubin 08.05.2023 23:37

Как преобразовать массив [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:

Белый шум 09.05.2023 01:38

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']));

рони 09.05.2023 06:58

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']));

Белый шум 09.05.2023 10:59

рони,
:thanks:
Респект.

Aetae 09.05.2023 18:47

рони, прикольно. Единственный вопрос - что делать в таком случае [1,1,'Q',11,'R'] (если он возможен).)

Cuntmann 10.05.2023 12:49

Бомж-стайл вариант:

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

рони 10.05.2023 13:43

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

Cuntmann 10.05.2023 14:32

рони, :yes: :thanks:

ksa 10.05.2023 15:28

Подкину и я свои 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.