Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
21 июн 2021, 19:25

Примитивная задачка

Автор frykt1k, 03 мая 2017, 16:48

0 Пользователей и 1 гость просматривают эту тему.

frykt1k

Здравствуйте!
Помогите, пожалуйста, новичку решить примитивную задачку..:trhregerhg:
Необходимо сделать функцию, которая будет приводить произвольную последовательность из открывающих и закрывающих скобок к правильному виду, путем добавления нужного количества скобок в нужных местах.:nhsrm:

Dethmontt

frykt1k, пример...
Добавлено: 03 мая 2017, 17:17


()()()((()(()())))((()()()()()))

или

(453-5435)+(5+8*(6+3(((5+2))+7+6+8)*6)))
Добавлено: 03 мая 2017, 17:19


Цитата: frykt1k от 03 мая 2017, 16:48путем добавления нужного количества скобок в нужных местах
Вы сами то понимаете чего хотите?

Простой пример:

(((    ))
Три открывающих, 2 закрывающих

В каком месте нужно поставить 3-ю закрывающую???
1. ()((    ))
2. (()(    ))
3. (((    )))

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

frykt1k

Цитата: Dethmontt от 03 мая 2017, 17:16
frykt1k, пример...
Пример:
Исходная строка: «(()((()»
Результат: «(()((())))»
Пример 2:
Исходная строка: «)))(»
Результат: «((()))()»

Dethmontt

исходная строка:
Цитата: Dethmontt от 03 мая 2017, 17:16((())

Результат?


Добавлено: 03 мая 2017, 18:04


frykt1k, всегда скобки добавляются в конец и в начало?
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

frykt1k

Цитата: Dethmontt от 03 мая 2017, 18:02
исходная строка:
Цитата: Dethmontt от 03 мая 2017, 17:16((())

Результат?
((()))
Цитировать
Добавлено: 03 мая 2017, 18:04


frykt1k, всегда скобки добавляются в конец и в начало?
Да, всегда, наверное.:bleh:
Добавлено: 03 мая 2017, 18:54


Цитата: Dethmontt от 03 мая 2017, 17:16((())
Я вот набросал тут, ругается на итератор.. В синтаксисе так и не разобрался..:(
&НаКлиенте
Процедура АнализИсходнойСтроки(Команда)
   Массив = Новый Массив();
   Массив = ИсходнаяСтрока;
   
   Для Каждого ЭлементМассива Из Массив Цикл
      
   если (ЭлементМассива = ")") и ((ЭлементМассива-1) <> "(") тогда
      Массив.Вставить(0, "(");
   конецесли;
   
   если (ЭлементМассива = "(") и ((ЭлементМассива+1) <> ")") тогда
      Массив.Добавить(")");
   конецесли;   
   конецЦикла;      

   РезультатСтрока = Массив;         
   КонецПроцедуры

Dethmontt

frykt1k, не оптимально, но мне лень думать...
Функция ПолучитьРезультат(Знач Строка)

Массив = Новый Массив(СтрДлина(Строка),2);

//0 - нет пары
//1 - есть пара

//Заполняем исходный массив
Для сч=0 По СтрДлина(Строка)-1 Цикл
Массив[сч][0] = Сред(Строка, сч+1, 1);
Массив[сч][1] = 0;
КонецЦикла;

Для сч=0 По Массив.ВГраница() Цикл

//Ищем пары для открывающих скобок
Если Массив[сч][0] = "(" и Массив[сч][1] = 0 Тогда
Для а=сч По Массив.ВГраница() Цикл
Если Массив[а][0] = ")" и Массив[а][1] = 0 Тогда
Массив[а][1] = 1;
Массив[сч][1] = 1;
Прервать;
КонецЕсли;
КонецЦикла;
//Ищем пары для закрывающих скобок
ИначеЕсли Массив[сч][0] = ")" и Массив[сч][1] = 0 Тогда
Для а=-(сч-1) По 0 Цикл
Если Массив[-а][0] = "(" и Массив[-а][1] = 0 Тогда
Массив[-а][1] = 1;
Массив[сч][1] = 1;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;

КонецЦикла;

//Добавим скобки тем кому пара не нашлась...
сч=0;
Пока сч < Массив.Количество() Цикл
Если Массив[сч][0] = ")" и  Массив[сч][1] = 0 Тогда
Массив[сч][1] = 1; 
Массив.Вставить(0, Новый Массив(2));
Массив[0][0] = "(";
Массив[0][1] = 1;
ИначеЕсли Массив[сч][0] = "(" и  Массив[сч][1] = 0 Тогда
Массив[сч][1] = 1; 
Массив.Добавить(Новый Массив(2));
Массив[Массив.ВГраница()][0] = ")";
Массив[Массив.ВГраница()][1] = 1;
КонецЕсли;
сч=сч+1;
КонецЦикла;

//Собираем результат
Рез = "";
Для сч=0 По Массив.ВГраница() Цикл
Рез = Рез + Массив[сч][0]; 
КонецЦикла;

Возврат Рез;

КонецФункции

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

LexaK

прикольная задачка, посмотрите такой вариант.
проверил, тестовые примеры совпали


&НаКлиенте
Процедура КомандаОбработать(Команда)
Результат = ВыполнитьОбработку(Задача);
КонецПроцедуры

&НаКлиенте
Функция  ВыполнитьОбработку(Знач лкСтр)

лкИсх = лкСтр;

//сначала убираем закрытые пары
Пока СтрНайти(лкСтр,"()") > 0 Цикл
лкСтр = СтрЗаменить(лкСтр,"()","");
КонецЦикла;

//компенсируем/закрываем открытые скобки, слева и справа
ЗакрытьСкобки(лкИсх, лкСтр, "(");
ЗакрытьСкобки(лкИсх, лкСтр, ")");

Возврат лкИсх;

КонецФункции

&НаКлиенте
Процедура ЗакрытьСкобки(лкИсх, лкСтр, лкСкобка)

лкЧисло = СтрЧислоВхождений(лкСтр, лкСкобка);
Для лкИндекс = 1 По лкЧисло Цикл
Если лкСкобка = "(" Тогда
лкИсх = лкИсх + ")";
Иначе
лкИсх = "(" + лкИсх;
КонецЕсли;
КонецЦикла;

КонецПроцедуры


ответ Понравился? (в смысле пригодился?)

frykt1k

Цитата: LexaK от 04 мая 2017, 11:48
прикольная задачка, посмотрите такой вариант.
проверил, тестовые примеры совпали


&НаКлиенте
Процедура КомандаОбработать(Команда)
Результат = ВыполнитьОбработку(Задача);
КонецПроцедуры

&НаКлиенте
Функция  ВыполнитьОбработку(Знач лкСтр)

лкИсх = лкСтр;

//сначала убираем закрытые пары
Пока СтрНайти(лкСтр,"()") > 0 Цикл
лкСтр = СтрЗаменить(лкСтр,"()","");
КонецЦикла;

//компенсируем/закрываем открытые скобки, слева и справа
ЗакрытьСкобки(лкИсх, лкСтр, "(");
ЗакрытьСкобки(лкИсх, лкСтр, ")");

Возврат лкИсх;

КонецФункции

&НаКлиенте
Процедура ЗакрытьСкобки(лкИсх, лкСтр, лкСкобка)

лкЧисло = СтрЧислоВхождений(лкСтр, лкСкобка);
Для лкИндекс = 1 По лкЧисло Цикл
Если лкСкобка = "(" Тогда
лкИсх = лкИсх + ")";
Иначе
лкИсх = "(" + лкИсх;
КонецЕсли;
КонецЦикла;

КонецПроцедуры


Спасибо большое)
А лкИсх, лкСтр, Задача - что за переменные?

ilyay

СтрЧислоВхождений() вам в помощь...

frykt1k

лкИсх и Задача это ИсходнаяСтрока, если я правильно понял..

Теги:

Похожие темы (5)

68379

Ответов: 0
Просмотров: 493

16054

Ответов: 1
Просмотров: 2741

40491

Ответов: 29
Просмотров: 9081

60487

Ответов: 1
Просмотров: 776

Рейтинг@Mail.ru Rambler's Top100

Поиск