Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Какую можно применить сортировку комбинаций из 2х значений (https://javascript.ru/forum/misc/77812-kakuyu-mozhno-primenit-sortirovku-kombinacijj-iz-2kh-znachenijj.html)

рони 26.06.2019 09:48

alex-romanov,
http://javascript.ru/forum/css-html/...teki-v-js.html

Alexandroppolus 26.06.2019 09:53

Цитата:

Сообщение от alex-romanov
Сама задача нацелена на создание синтаксического анализатора, который проверяет, что при открытии ресурса, ресурс должен быть закрыт.

Это намного более простая задача, чем то что ты описал. Если ресурсы (скобки) одного вида, то функция ok от ksa, если разного, то чуть сложнее, со стеком. Причём такая проверка сразу укажет, где конкретно косяк. Нафига из неправильного варианта получать набор правильных, я так и не понял.

alex-romanov 26.06.2019 12:25

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

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

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

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

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

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

lock - {
unlock - }

alex-romanov 26.06.2019 12:36

Цитата:

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

без регулярки никак ?

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

[]

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

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

[],[[]],[][]

ksa 26.06.2019 12:42

Цитата:

Сообщение от alex-romanov
Твоя задача почти идеальна, но удаляет ценную одну пару

У меня ничего не удаляется. :no:
В моем варианте показываются все разные и "валидные" расстановки скобок из заданной последовательности.
Цитата:

Сообщение от alex-romanov
то есть в одном из вариантов она выдает
[]
для такой входной строки
var str='[]][]]';

[],[[]],[][]

У этой строки как раз всего 3 разных варианта "валидной" расстановки скобок. Их я и вывожу...

Malleys 26.06.2019 15:52

Цитата:

Сообщение от 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

Alexandroppolus 26.06.2019 16:54

Цитата:

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

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

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

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

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

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

lock - {
unlock - }

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

alex-romanov 26.06.2019 22:33

Цитата:

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

у нас есть метод lock() (в специальном классе) который в многопоточной среде блокирует ресурс, чтобы один из потоков мог нормально работать текущим ресурсом.

Lock() - uncock()

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

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

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

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

Здесь один из lock() лишний и т.д.

ksa 27.06.2019 07:51

Цитата:

Сообщение от Malleys
Притом всё-таки удалили одну пару! Там где var str='[]][]]'; у вас теряет пару в варианте... []

Я так и не понял про что вы пишите... :no:

alex-romanov 27.06.2019 11:10

Цитата:

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

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


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

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

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

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


Часовой пояс GMT +3, время: 18:14.