Как код переписать?

Вчера было собеседование, задачка
63130419b992b362242401.png
моя реализация
const compare = (a, b) => {
  if(+a === 0 || +b === 0) return null;
  if(+a % 2 === 0 && +b % 2 === 0) return '*';
  if(+a % 2 !== 0 && +b % 2 !== 0) return '-';
  return null
}

const StringChallenge = (str) => {
  str = str.toString()
  const result = [str[0]]
  for(let i = 1; i < str.length; i += 1) {
    const char = compare(str[i - 1], str[i]);
    if(char) result.push(char);
    result.push(str[i])
  }
  return result.join('')
}


попросили переписать задачку без функции compare
я не смог
в итоге после собеседование сидел и думал как это можно сделать, придумал только такой вариант =>
const StringChallenge = (str) => {
      str = str.toString()
      const strArr = str.split('')
      const result = strArr.reduce((p, c, i) => {
        const lastEl = strArr[i - 1];
        let d = ''
        if ((+lastEl === 0 || +c === 0)) d = ''
        else if ((+lastEl % 2 === 0 && +c % 2 === 0)) d = '*'
        else if ((+lastEl % 2 !== 0 && +c % 2 !== 0)) d = '-'
        else d = ''
        return p + d + c
      })
      return result
    }

ну все равно не очень
как переписать первый вариант задачи, без реализации сторонней функции, не теряя в читаемости особо
UPD крутые ребята снизу на регулярках решили задачу, ну хотелось бы увидеть реализацию без регулярок
  • Вопрос задан
  • 180 просмотров
Решения вопроса 3
0xD34F
@0xD34F Куратор тега JavaScript
const bullshitInsert = str => str
  .replace(/(?<=[2468])(?=[2468])/g, '*')
  .replace(/(?<=[13579])(?=[13579])/g, '-');

или

const bullshitInsert = str => Array
  .from(str, (n, i) => (n * str[i - 1] && !((n ^ str[i - 1]) & 1) ? '*-'[n & 1] : '') + n)
  .join('');
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
const StringChallenge = (str) =>
  str.replaceAll(/(?<=[13579])(?=[13579])/g, '-')
     .replaceAll(/(?<=[2468])(?=[2468])/g, '*');

const StringChallenge = (str) => 
  str.split('').reduce(
    (acc, dig) => {
      const sign = +dig ? (dig % 2 ? '-' : '*') : '';
      return {
        str: acc.str + (acc.sign === sign ? sign : '') + dig,
        sign,
      };
    },
    { str: '', sign: '' },
  ).str;
Ответ написан
RAX7
@RAX7
function stringChallenge(str) {
  let $ = ['*', '', '-'], _ = $[1];
  for (let i = 0.666, a, b; a = str[~~i], b = str[-~i], i < str.length - 1; i++) {
    _ += a + ((+a && +b) ? $[(a & 1) + (b & 1)] : $[1]);
  }
  return _.concat(str.at(-1));
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы