Дисквалификация последовательных символов в алфавитном порядке. Sol [ASCII формат] - PullRequest
0 голосов
/ 06 января 2019

Мне подарил эту проблему мой друг. Вопрос просит удалить все алфавитно-последовательные символы из заданного строкового ввода. Так что я сделал это с помощью Javascript, мне нужна помощь специалиста, если я выполнил это точно.

Я думал, что использование Array.prototype.reduce будет лучшим способом, у нас есть другие возможные способы?

/**
 * @author Abhishek Mittal <abhishekmittaloffice@gmail.com>
 * @description function can deal with both any types followed in a consecutive manner in ASCII Chart.
 * @param {string} str 
 */
function improvise(str) {
    // Backup for original input.
    const bck = str || '';
    const bckArr = bck.split('').map( e => e.charCodeAt(0)); // converting the alphabets into its ASCII for simplicity and reducing the mayhem.

    let result = bckArr.reduce( (acc, n) => {
            // Setting up flag
            let flag1 = n - acc.rand[acc.rand.length - 1];
            let flag2 = n - acc.temp;

            if(flag1 === 1 || flag2 === 1) {
                (flag2 !== NaN && flag2 !== 1) ? acc.rand.pop() : null; // update the latest value with according to the case.
                acc.temp = n
            }else{
                acc.rand.push(n); // updating the random to latest state.
                acc.temp = null;
            }

        return acc;

    }, {rand: [], temp: null} /* setting up accumulative situation of the desired result */) 

    result = result.rand.map(e => String.fromCharCode(e)).join('')
    return result ? result : '' ;
}

function init() {
    const str = "ab145c";
    const final = improvise(str);
    console.log(final)
}
init();

Что ж, выходные данные получаются правильными. Вход: ab145c Выход: 1с

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Хорошо, это отличный код, но он не дает точного решения проблемы, см .:

INPUT: hishakmitalaaaaabbbbbbcccccclmnojqyz

я получил

Output: shakmitalaaaabbbbcccccjq

вы видите, что 'ab' и 'bc' остаются нетронутыми, нам нужно увеличить количество циклов, возможно, чтобы проверить их, также можно увеличить сложность. Но мое решение не так хорошо дает мне желаемый ответ, например, для приведенной выше строки я должен получить

ishakmitalaacccjq

а скорее мое решение дает

shakmitalcccccjq

надеюсь, вы понимаете вопрос. Нам нужно изменить способ прохождения через строку.

0 голосов
/ 06 января 2019

К сожалению, нет способа решить эту проблему с помощью какого-либо разумного регулярного выражения.

Я думаю, было бы намного понятнее использовать .filter и проверить, является ли следующий или предыдущий символ последовательным:

const code = char => char
? char.charCodeAt(0)
: -2; // will not be === to any other codes after addition or subtraction
  
function improvise(str) {
  return [...str]
    .filter((char, i) => {
      const thisCode = code(char);
      return (
        thisCode !== code(str[i - 1]) + 1
        && thisCode !== code(str[i + 1]) - 1
      );
    })
    .join('');
}

console.log(improvise('ab145c'));

(в качестве альтернативы вы можете проверить only , является ли следующий символ последовательным, но тогда вам также придется проверить правильность последнего символа в строке)

Если вам нужно непрерывно заменять символов, пока не останется никаких последовательных символов, продолжайте звонить improvise:

const code = char => char
? char.charCodeAt(0)
: -2; // will not be === to any other codes after addition or subtraction
  
function improvise(str) {
  return [...str]
    .filter((char, i) => {
      const thisCode = code(char);
      return (
        thisCode !== code(str[i - 1]) + 1
        && thisCode !== code(str[i + 1]) - 1
      );
    })
    .join('');
}

let result = 'hishakmitalaaaaabbbbbbcccccclmnojqyz';
let same = false;
while (!same) {
  const newResult = improvise(result);
  if (newResult !== result) {
    result = newResult;
    console.log(result);
  } else {
    same = true;
  }
}
console.log('FINAL:', result);
...