Создать список слов, которые появляются в строке без пробелов - учитывайте, когда слово появляется более одного раза - PullRequest
0 голосов
/ 11 июля 2019

В соответствии с этой задачей Codewars мне нужно создать простую логику для отслеживания всех слов, которые появляются в строке.


ИНСТРУКЦИИ

Некоторые новые кассиры начали работать в вашем ресторане.

Они хорошо принимают заказы, но незнаете, как использовать слова с заглавной буквы или используйте пробел!

Все создаваемые ими заказы выглядят примерно так:

"milkshakepizzachickenfriescokeburgerpizzasandwichmilkshakepizza"

Персонал кухни угрожает броситьиз-за того, как трудно читать заказы.

Их предпочтение состоит в том, чтобы получать заказы в виде красивой чистой строки с пробелами и прописными буквами, например:

"Burger Fries Chicken Pizza Pizza Pizza PizzaSandwich Milkshake Milkshake Coke "

Персонал кухни ожидает, что элементы будут в том же порядке, в котором они отображаются в меню.

Элементы меню довольно простые, в названиях нет совпаденийиз предметов:

  1. бургер
  2. картофель фри
  3. курица
  4. пицца
  5. сэндвич
  6. луковые кольца
  7. Милкшаke
  8. Кокс

EDIT Следуя логике .match(), я создал массив всех элементов, которыепоявляются на входе.Но я не знаю, какой самый быстрый способ сортировать их по порядку появления в исходной строке:

function getOrder(order) {
  
  let menu = ['Burger', 'Fries', 'Chicken', 'Pizza', 'Sandwich', 'Onionrings', 'Milkshake', 'Coke'];
  
  let finalOrder = order.split(/(burger|fries|chicken|pizza|sandwich|onionrings|milkshake|coke)/i);
  finalOrder = finalOrder.filter((element) => element !== null || element !== "");
  finalOrder = finalOrder.map((element) => element.charAt(0).toUpperCase() + element.slice(1));
  finalOrder = finalOrder.sort((a, b) => {
    if (menu.indexOf(a) > menu.indexOf(b)) {
      return 1;
    }
    else {
      return -1;
    }
  });
  return finalOrder.join(" ").trim(/\s/);
}

console.log(getOrder("milkshakepizzachickenfriescokeburgerpizzasandwichmilkshakepizza"));

Ответы [ 6 ]

2 голосов
/ 11 июля 2019

Вот мое решение этой задачи:

Объяснение:

Для каждого элемента меню: подсчитать количество вхождений элемента и добавить элемент вмного раз выводить строку.

  • RegExp(i, 'gi'): регистр i без учета чувствительности g lobal совпадение для подсчета
  • || []: дескрипторсопоставление 0 раз
  • .length: получить только количество совпадений
  • Array().fill(i): создать массив размеров, заполненный элементом меню, повторяется
  • ...: развернуть массив так, что push вставляет элементы по отдельности в массив
  • .join(' '): наконец, вставить пробелы между каждым соответствием

Пример:

let menu = ['Burger','Fries','Chicken','Pizza','Sandwich','Onionrings','Milkshake','Coke'];

function getOrder(input) {
  let output = [];
  menu.forEach( (i) =>
    output.push( ...Array( (input.match( RegExp(i, 'gi') ) || []).length ).fill( i ) )
  );
  return output.join(' ');
}

console.log( getOrder("milkshakepizzachickenfriescokeburgerpizzasandwichmilkshakepizza") )
2 голосов
/ 11 июля 2019

Вместо includes используйте indexOf. Это берет второй параметр, индекс, чтобы начать поиск. Например, переберите все бургеры и передайте предыдущий индекс следующему вызову indexOf, пока он не вернет -1, а затем посчитайте, как часто вы зацикливались.

Кроме того, вы можете .match текст, основанный на регулярном выражении, которое принимает все возможные блюда.

1 голос
/ 11 июля 2019

Создание массива, содержащего пункты меню в нижнем регистре в указанном порядке

let testString = "milkshakepizzachickenfriescokeburgerpizzasandwichmilkshakepizza";
let menuItemsLowerCase = ["burger","fries","chicken","pizza","sandwich","onionrings","milkshake","coke"];

Перебор каждого элемента и замена вхождения каждого элемента строкой элемента плюс запятая

for(let itemIndex=0;itemIndex<menuItemsLowerCase.length; itemIndex++){
    const item = menuItemsLowerCase[itemIndex];
    const re = new RegExp(item,"g");
    testString = testString.replace(re, item+',');
}

Удалить последнюю запятую, если есть

if(testString[testString.length-1] === ','){
    testString = testString.substr(0,testString.length-1);
}

Разбить строку на запятые и отсортировать

let stringAsArray = testString.split(',');
stringAsArray = stringAsArray.sort(function(a,b){
    return menuItemsLowerCase.indexOf(a) - menuItemsLowerCase.indexOf(b);
});

Преобразовать первый символ в верхний регистр и объединить с пробелом в качестве разделителя

console.log(stringAsArray.map(function(item){
        return item.substr(0,1).toUpperCase() + item.substr(1);
    }
).join(' '));
1 голос
/ 11 июля 2019

Вы также можете перебирать символ за символом и добавлять слова по мере их формирования. Чтобы проверить, является ли слово «сформированным», вы можете использовать набор для хранения слов / пунктов меню, которые являются действительными:

function getOrder(input) {

  let order = [];
  const items = new Set(["burger", "fries", "chicken", "pizza", "sandwich", "onionrings", "milkshake", "coke"]);

  let curr = "";
  for (let c of [...input]) {
    curr += c;
    if (items.has(curr)) {
      order.push(curr);
      curr = "";
    }
  }
  return order.map(item => item.charAt(0).toUpperCase() + item.slice(1)).join(" ");
}

console.log(getOrder("milkshakepizzachickenfriescokeburgerpizzasandwichmilkshakepizza"));
1 голос
/ 11 июля 2019

Если бы вы знали , где в строке вашего слова, вы могли бы удалить ее, так что если вы снова посмотрите в оставшуюся строку, вы найдете дубликат.

0 голосов
/ 12 июля 2019
  1. Создать массив всех совпадающих элементов, которые существуют во входной строке
  2. Превратить первую букву всех элементов в массиве в верхний регистр, чтобы они точно соответствовали элементам в массиве меню.
  3. Сортировка элементов в соответствии с их порядком в массиве меню.
  4. Возвращает массив, объединенный в строку.

function getOrder(input) {
    
  let menu = ['Burger','Fries','Chicken','Pizza','Sandwich','Onionrings','Milkshake','Coke'];
  let items = input.match(/(burger|fries|chicken|pizza|sandwich|onionrings|milkshake|coke)/gi);
  items = items.map((element) => element.charAt(0).toUpperCase() + element.slice(1));
  items = items.sort((a, b) => {
    if (menu.indexOf(a) > menu.indexOf(b)) {
      return 1;
    }
    else {
      return -1;
    }
  });
  return items.join(" ");
}

console.log(getOrder("milkshakepizzachickenfriescokeburgerpizzasandwichmilkshakepizza"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...