26.06.2019, 09:48
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,105
|
|
|
|
26.06.2019, 09:53
|
|
Профессор
|
|
Регистрация: 25.10.2016
Сообщений: 1,012
|
|
Сообщение от alex-romanov
|
Сама задача нацелена на создание синтаксического анализатора, который проверяет, что при открытии ресурса, ресурс должен быть закрыт.
|
Это намного более простая задача, чем то что ты описал. Если ресурсы (скобки) одного вида, то функция ok от ksa, если разного, то чуть сложнее, со стеком. Причём такая проверка сразу укажет, где конкретно косяк. Нафига из неправильного варианта получать набор правильных, я так и не понял.
|
|
26.06.2019, 12:25
|
Аспирант
|
|
Регистрация: 02.02.2019
Сообщений: 67
|
|
в коде может быть указан
- метод разблокировки
- метод блокировки
Это неправильно.
Сначала нужно указать метод который блокирует ресурс, затем должен быть метод который освобождает ресурс.
Например, программист ошибся и указал лишнии методы, либо в неправильном порядке.
Поэтому программа получает на вход порядок расположения методов (блокировка/разблокировка) и
предлагает несколько вариантов правильных.
Когда идет многопоточная обработка:
один метод блокирует ресурс (lock), затем после обработки данных, ресурс должен быть разблокирован(unlock)
lock - {
unlock - }
|
|
26.06.2019, 12:36
|
Аспирант
|
|
Регистрация: 02.02.2019
Сообщений: 67
|
|
Сообщение от ksa
|
Вот сделал набросок по проблеме как я ее понял и описал выше.
|
без регулярки никак ?
Твоя задача почти идеальна, но удаляет ценную одну пару,
то есть в одном из вариантов она выдает
[]
для такой входной строки
var str=' []][]]';
[], [[]],[][]
|
|
26.06.2019, 12:42
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,205
|
|
Сообщение от alex-romanov
|
Твоя задача почти идеальна, но удаляет ценную одну пару
|
У меня ничего не удаляется.
В моем варианте показываются все разные и "валидные" расстановки скобок из заданной последовательности.
Сообщение от alex-romanov
|
то есть в одном из вариантов она выдает
[]
для такой входной строки
var str='[]][]]';
[],[[]],[][]
|
У этой строки как раз всего 3 разных варианта "валидной" расстановки скобок. Их я и вывожу...
|
|
26.06.2019, 15:52
|
|
Профессор
|
|
Регистрация: 20.12.2009
Сообщений: 1,714
|
|
Сообщение от ksa
|
У этой строки как раз всего 3 разных варианта "валидной" расстановки скобок.
|
Притом всё-таки удалили одну пару! Там где var str='[]][]]'; у вас теряет пару в варианте... []
alex-romanov, каждый запущенный метод имеет конец! Метод важно закрыть! Но удалять запущенные методы нельзя! Вот мой вариант...
{
class IndexedRegExp extends RegExp {
[Symbol.replace](s, f) {
let i = 0;
return s.replace(new RegExp(this), function() {
return f(i++, ...arguments);
});
}
}
class Pairs extends Array {
constructor(string, openingMethod, closingMethod) {
super();
Object.assign(this, { string, openingMethod, closingMethod });
var l = [...string].filter(v => v === closingMethod).length;
var re = new IndexedRegExp(`\\${closingMethod}`,"g");
for (var i = 0, len = 2 ** l; i < len; i++) {
let x = string.replace(re, (j,m) => ((1 << j) & i) === 0 ? "" : closingMethod);
if(this.isValid(x) && !this.includes(x))
this.push(x);
}
}
isValid(string) {
var index = 0;
for(const char of string) {
if(char === this.openingMethod) index++;
else if(char === this.closingMethod) index--;
if(index < 0) return false;
}
return index === 0;
}
}
// Примеры
console.log(new Pairs("[ x] x] [ x]x ]","[","]"));
console.log(new Pairs("[ ] x ] x]","[","]"));
console.log(new Pairs("[ x ] x ] x]","[","]"));
console.log(new Pairs("{}}{}}","{","}"));
console.log(new Pairs("[]][]]","[","]"));
}
Также можете посмотреть интерактивный пример с добавленным функционалом закрытия не закрытых методов! (Если поставите галочку в Auto Closing) https://codepen.io/Malleys/pen/rEGjVM?editors=0010
Последний раз редактировалось Malleys, 26.06.2019 в 15:55.
|
|
26.06.2019, 16:54
|
|
Профессор
|
|
Регистрация: 25.10.2016
Сообщений: 1,012
|
|
Сообщение от alex-romanov
|
в коде может быть указан
- метод разблокировки
- метод блокировки
Это неправильно.
Сначала нужно указать метод который блокирует ресурс, затем должен быть метод который освобождает ресурс.
Например, программист ошибся и указал лишнии методы, либо в неправильном порядке.
Поэтому программа получает на вход порядок расположения методов (блокировка/разблокировка) и
предлагает несколько вариантов правильных.
Когда идет многопоточная обработка:
один метод блокирует ресурс (lock), затем после обработки данных, ресурс должен быть разблокирован(unlock)
lock - {
unlock - }
|
Тогда, боюсь, твоя иллюстрация со скобками одного вида сильно упрощённая. Как минимум, может блокироваться не один ресурс, а несколько. К тому же некоторые ресурсы можно блокировать ограниченное число раз, иногда только один (мютексы или критические секции, например). Это всё, наверно, надо учесть как-то.
|
|
26.06.2019, 22:33
|
Аспирант
|
|
Регистрация: 02.02.2019
Сообщений: 67
|
|
Сообщение от Alexandroppolus
|
Тогда, боюсь, твоя иллюстрация со скобками одного вида сильно упрощённая. Как минимум, может блокироваться не один ресурс, а несколько. К тому же некоторые ресурсы можно блокировать ограниченное число раз, иногда только один (мютексы или критические секции, например). Это всё, наверно, надо учесть как-то.
|
у нас есть метод lock() (в специальном классе) который в многопоточной среде блокирует ресурс, чтобы один из потоков мог нормально работать текущим ресурсом.
Lock() - uncock()
Lock() lock() unlock() unlock() - вот эту схему и заменили скобками.
Иногда можеты быть ошибка в коде вот такая
unlock() unlock() lock() - валидатор при такой схемы должен вернуть 0 вариантов
Lock()-lock()-lock()-unlock()-unlock()
Здесь один из lock() лишний и т.д.
|
|
27.06.2019, 07:51
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,205
|
|
Сообщение от Malleys
|
Притом всё-таки удалили одну пару! Там где var str='[]][]]'; у вас теряет пару в варианте... []
|
Я так и не понял про что вы пишите...
|
|
27.06.2019, 11:10
|
Аспирант
|
|
Регистрация: 02.02.2019
Сообщений: 67
|
|
Цитата:
|
alex-romanov, каждый запущенный метод имеет конец! Метод важно закрыть! Но удалять запущенные методы нельзя! Вот мой вариант...
|
я проверял в 3х браузерах не запускается код на сайте
var l = [...string].filter(v => v === closingMethod).length;
мне это не понятно
думаю вы использовали node.js я его с трудом понимаю, а точнее вообще непонятно, только некторые моменты.
Спасибо за труд, но я не смогу перевести ваш код на свой язык.
Даже зная немного jquery и javascript трудно читать.
Но вообще спасибо.
Кстати регулярка здесь не должна использоваться, так как она требует больше ресурсов (то есть ее в рабочем коде в серверной части редко используют и стараются избегать), поэтому ее не используем.
|
|
|
|