Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 26.06.2019, 09:48
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,105

alex-romanov,
Баланс открывающихся и закрывающихся скобок.Стеки в JS
Ответить с цитированием
  #12 (permalink)  
Старый 26.06.2019, 09:53
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

Сообщение от alex-romanov
Сама задача нацелена на создание синтаксического анализатора, который проверяет, что при открытии ресурса, ресурс должен быть закрыт.
Это намного более простая задача, чем то что ты описал. Если ресурсы (скобки) одного вида, то функция ok от ksa, если разного, то чуть сложнее, со стеком. Причём такая проверка сразу укажет, где конкретно косяк. Нафига из неправильного варианта получать набор правильных, я так и не понял.
Ответить с цитированием
  #13 (permalink)  
Старый 26.06.2019, 12:25
Аспирант
Отправить личное сообщение для alex-romanov Посмотреть профиль Найти все сообщения от alex-romanov
 
Регистрация: 02.02.2019
Сообщений: 67

в коде может быть указан
- метод разблокировки
- метод блокировки

Это неправильно.
Сначала нужно указать метод который блокирует ресурс, затем должен быть метод который освобождает ресурс.

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

Поэтому программа получает на вход порядок расположения методов (блокировка/разблокировка) и
предлагает несколько вариантов правильных.

Когда идет многопоточная обработка:

один метод блокирует ресурс (lock), затем после обработки данных, ресурс должен быть разблокирован(unlock)

lock - {
unlock - }
Ответить с цитированием
  #14 (permalink)  
Старый 26.06.2019, 12:36
Аспирант
Отправить личное сообщение для alex-romanov Посмотреть профиль Найти все сообщения от alex-romanov
 
Регистрация: 02.02.2019
Сообщений: 67

Сообщение от ksa
Вот сделал набросок по проблеме как я ее понял и описал выше.
без регулярки никак ?

Твоя задача почти идеальна, но удаляет ценную одну пару,
то есть в одном из вариантов она выдает

[]

для такой входной строки

var str='[]][]]';

[],[[]],[][]
Ответить с цитированием
  #15 (permalink)  
Старый 26.06.2019, 12:42
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,205

Сообщение от alex-romanov
Твоя задача почти идеальна, но удаляет ценную одну пару
У меня ничего не удаляется.
В моем варианте показываются все разные и "валидные" расстановки скобок из заданной последовательности.
Сообщение от alex-romanov
то есть в одном из вариантов она выдает
[]
для такой входной строки
var str='[]][]]';

[],[[]],[][]
У этой строки как раз всего 3 разных варианта "валидной" расстановки скобок. Их я и вывожу...
Ответить с цитированием
  #16 (permalink)  
Старый 26.06.2019, 15:52
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 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.
Ответить с цитированием
  #17 (permalink)  
Старый 26.06.2019, 16:54
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

Сообщение от alex-romanov Посмотреть сообщение
в коде может быть указан
- метод разблокировки
- метод блокировки

Это неправильно.
Сначала нужно указать метод который блокирует ресурс, затем должен быть метод который освобождает ресурс.

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

Поэтому программа получает на вход порядок расположения методов (блокировка/разблокировка) и
предлагает несколько вариантов правильных.

Когда идет многопоточная обработка:

один метод блокирует ресурс (lock), затем после обработки данных, ресурс должен быть разблокирован(unlock)

lock - {
unlock - }
Тогда, боюсь, твоя иллюстрация со скобками одного вида сильно упрощённая. Как минимум, может блокироваться не один ресурс, а несколько. К тому же некоторые ресурсы можно блокировать ограниченное число раз, иногда только один (мютексы или критические секции, например). Это всё, наверно, надо учесть как-то.
Ответить с цитированием
  #18 (permalink)  
Старый 26.06.2019, 22:33
Аспирант
Отправить личное сообщение для alex-romanov Посмотреть профиль Найти все сообщения от alex-romanov
 
Регистрация: 02.02.2019
Сообщений: 67

Сообщение от Alexandroppolus Посмотреть сообщение
Тогда, боюсь, твоя иллюстрация со скобками одного вида сильно упрощённая. Как минимум, может блокироваться не один ресурс, а несколько. К тому же некоторые ресурсы можно блокировать ограниченное число раз, иногда только один (мютексы или критические секции, например). Это всё, наверно, надо учесть как-то.
у нас есть метод lock() (в специальном классе) который в многопоточной среде блокирует ресурс, чтобы один из потоков мог нормально работать текущим ресурсом.

Lock() - uncock()

Lock() lock() unlock() unlock() - вот эту схему и заменили скобками.

Иногда можеты быть ошибка в коде вот такая

unlock() unlock() lock() - валидатор при такой схемы должен вернуть 0 вариантов

Lock()-lock()-lock()-unlock()-unlock()

Здесь один из lock() лишний и т.д.
Ответить с цитированием
  #19 (permalink)  
Старый 27.06.2019, 07:51
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,205

Сообщение от Malleys
Притом всё-таки удалили одну пару! Там где var str='[]][]]'; у вас теряет пару в варианте... []
Я так и не понял про что вы пишите...
Ответить с цитированием
  #20 (permalink)  
Старый 27.06.2019, 11:10
Аспирант
Отправить личное сообщение для alex-romanov Посмотреть профиль Найти все сообщения от alex-romanov
 
Регистрация: 02.02.2019
Сообщений: 67

Цитата:
alex-romanov, каждый запущенный метод имеет конец! Метод важно закрыть! Но удалять запущенные методы нельзя! Вот мой вариант...
я проверял в 3х браузерах не запускается код на сайте

var l = [...string].filter(v => v === closingMethod).length;


мне это не понятно

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

Спасибо за труд, но я не смогу перевести ваш код на свой язык.
Даже зная немного jquery и javascript трудно читать.

Но вообще спасибо.
Кстати регулярка здесь не должна использоваться, так как она требует больше ресурсов (то есть ее в рабочем коде в серверной части редко используют и стараются избегать), поэтому ее не используем.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск