Удалить повторяющиеся символы из строки

1. G_107108283491272370458 12.11.20 23:03 Сейчас в теме
Доброго времени суток. Вводится строка. Требуется удалить из нее повторяющиеся символы и
все пробелы. Например, если было введено "abc cde def", то должно быть
выведено "abcdef". С пробелами то понятно как, а как с другими символами?

Процедура Обработка(Команда)
   ИскомаяСтрока=Объект.Строка;
	Пока Найти(ИскомаяСтрока, "  ") > 0 Цикл
      ИскомаяСтрока = СтрЗаменить(ИскомаяСтрока," ","");
  КонецЦикла;
	Объект.Ответ = ИскомаяСтрока;
КонецПроцедуры
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. FatPanzer 12.11.20 23:05 Сейчас в теме
Так, давай-ка твои тестовые задания для собеседования решать здесь не будем. Или неси сюда зарплату.

И кстати - твой пример с удалением пробела ужасен!
3. alxarz 32 12.11.20 23:27 Сейчас в теме
(1)
	ИскомаяСтрока="abc cde efg";
	ИскомаяСтрока = СтрЗаменить(ИскомаяСтрока," ","");
	НовСтрока = ""; повтсимв = "";
	Пока СтрДлина(ИскомаяСтрока) > 0 Цикл
	повтсимв = сред(искомаястрока,1,1);
	ИскомаяСтрока = СтрЗаменить(ИскомаяСтрока,повтсимв,"");
	новстрока = новстрока + повтсимв;
	КонецЦикла;
	сообщить(новстрока);
Показать
6. tetraren 35 13.11.20 00:06 Сейчас в теме
(3) Строку "abc cde def" такой алгоритм не переварит, оставит две d
8. alxarz 32 13.11.20 00:53 Сейчас в теме
(6) да вроде переварил, одна на выходе...
4. tetraren 35 12.11.20 23:28 Сейчас в теме
	Строка = "abc cde def";
	
	СимволыСтроки = Новый Соответствие;
	Подстроки = Новый Массив;
	
	Для Сч = 1 По СтрДлина(Строка) Цикл
		Символ = Сред(Строка, Сч, 1);
		Если Символ = " " Тогда
			Продолжить;
		ИначеЕсли СимволыСтроки[Символ] = Неопределено Тогда
			СимволыСтроки[Символ] = Истина;
			Подстроки.Добавить(Символ);
		КонецЕсли; 
	КонецЦикла;
	Строка = СтрСоединить(Подстроки,"");
Показать


Но вообще да, если так все задачи на форуме спрашивать, то так никогда не научишься.
SlavaKron; +1 Ответить
7. FatPanzer 13.11.20 00:53 Сейчас в теме
(4) Есть предположение, что некоторые "учителя" на своих курсах прямо раздают ученикам задания со словами "есть такой профессиональный ресурс ИС, там вам обязательно помогут". И вот ресурс от наплыва этих учеников становится непрофессиональным, и за одну неделю в сентябре три или четыре человека в разных ветках задавали задачи про расчет питания протеинами, подсчет количества понедельников до конца года и прочие аналогичные задачи. Потом прошло две недели, курсы закончились, и этих людей простыл и след на инфостарте...
user1619761; user1438475; Fox-trot; Sashares; nomad_irk; t278; +6 Ответить
9. HAMAZ 7 13.11.20 07:25 Сейчас в теме
(4)
строка="abc cde def";a=новый соответствие;a_=новый массив;for a__=1 to стрдлина(строка) do a___=сред(строка,a__,1);if a___=" " then продолжить;elsif a[a___]=неопределено then a[a___]=истина;a_.добавить(a___);endif;enddo;строка=стрсоединить(a_,"");
11. SlavaKron 13.11.20 08:40 Сейчас в теме
(4)
СимволыСтроки[Символ] = Истина;
Через соответствие хороший вариант, только нужно, наверно, СимволыСтроки.Вставить(Символ, Истина). И пробелы лучше сразу удалить через СтрЗаменить.
18. tetraren 35 13.11.20 17:22 Сейчас в теме
(11) Прошу прощения, но не понимаю. Разве СимволыСтроки[Символ] = Истина не выполняет неявно тот же метод СимволыСтроки.Вставить(Символ, Истина) ? Если так, их производительность должна быть одинакова...
19. SlavaKron 13.11.20 18:00 Сейчас в теме
(18) В первом случае происходит не присвоение нового элемента, а считывание по ключу Символ.
И да, для всех предложивших свой вариант, соответствие будет быстрее.
20. tetraren 35 13.11.20 18:31 Сейчас в теме
(19) При вставить тоже придется искать по ключу, иначе непонятно, есть ли уже такой элемент или нет.

По идее, там для внутри должен быть сеттер, что-то вроде
public map[] setСоответствие(Ключ, Значение) {
Соответствие.Вставить(Ключ, Значение);
}

Т.е. то же самое. Может я и не прав...
21. FatPanzer 13.11.20 18:42 Сейчас в теме
(20) Нет, присвоение через "=" работает только для существующих ключей, для несуществующих только Вставить()...
22. tetraren 35 13.11.20 18:48 Сейчас в теме
(21) Со структурой - да. С соответствием вполне себе работает и очень полезно порой (код выше - рабочий).
24. FatPanzer 13.11.20 19:56 Сейчас в теме
(22) Мдя? Ваще никогда даже не пытался... )))
23. spacecraft 13.11.20 19:00 Сейчас в теме
(21) для соответствия не требуется инициализация ключа.
25. FatPanzer 13.11.20 19:57 Сейчас в теме
(23) Двойные стандарты! Непорядок!
26. user856012 14 14.11.20 02:08 Сейчас в теме
(25)
Двойные стандарты! Непорядок!
Еще более двойные стандарты - в (15) и (16), прямо-таки классическая иллюстрация отличия 1Сника от программиста: и по объему кода, и по его читаемости, и по переносимости между платформами (кстати, ее версия в ТЗ не указана).

Надо сохранить ветку в закладках, чтобы потом наглядно показывать, как одни пишут код, а другие - г...внокак-токод.
5. YA_871721945 13.11.20 00:02 Сейчас в теме
Мда, "умный" малый. Но все же. Тут написано все для частного случая, а именно "abc cde def", а не в общем. В строку же могут ввести любой набор букв.
10. HAMAZ 7 13.11.20 07:32 Сейчас в теме
Вот еще вариант:
СтрокаСудьбы = "Abссс сссef ссdсeссссссcdggggggggnjnnnnnnnn xcmmmm sssss ooooo eeeeee aaa dfff сссссссссссс";
СтрокаСудьбы = СтрЗаменить(СтрокаСудьбы," ","");

ТаблицаВажныхЗначений = Новый ТаблицаЗначений;
ТаблицаВажныхЗначений.Колонки.Добавить("СимволВершащийСудьбу", Новый ОписаниеТипов("Строка"));

Для СчетчикСтрокТаблицаВажныхЗначений = 0 По СтрДлина(СтрокаСудьбы) Цикл
	ТаблицаВажныхЗначений.Добавить().СимволВершащийСудьбу = Сред(СтрокаСудьбы, СчетчикСтрокТаблицаВажныхЗначений, 1);
КонецЦикла;

ТаблицаВажныхЗначений.Свернуть("СимволВершащийСудьбу");
МыНашМыНовыйСтрокПостроим = "";

Для Каждого СчетчикСтрокТаблицаВажныхЗначений Из ТаблицаВажныхЗначений Цикл
	 МыНашМыНовыйСтрокПостроим = МыНашМыНовыйСтрокПостроим + СчетчикСтрокТаблицаВажныхЗначений.СимволВершащийСудьбу;
КонецЦикла;
Показать
SlavaKron; +1 Ответить
12. SlavaKron 13.11.20 08:44 Сейчас в теме
(10) Пафосный код и работать, видимо, должен неторопливо.
TEA_spb; EVKash; +2 Ответить
14. HAMAZ 7 13.11.20 09:48 Сейчас в теме
13. VladimirB 17 13.11.20 09:37 Сейчас в теме
	_Строка=СтрЗаменить(выбСтрока," ","");
	_НоваяСтрока="";
	Пока СтрДлина(_Строка)>0 Цикл
		_Смв=Лев(_Строка,1);
		_НоваяСтрока=_НоваяСтрока+_Смв;
		_Строка=СтрЗаменить(_Строка,_Смв,"");
	КонецЦикла;
Сообщить(_НоваяСтрока);
Показать
starik-2005; +1 Ответить
15. starik-2005 3075 13.11.20 11:55 Сейчас в теме
  Рез = Новый Массив(255-65);
  Результат = Новый Массив( СтрДлина( Строка ) - 1 );

  Для А = 1 По СтрДлина(Строка) Цикл
    Поз = КодСимв(Сред(Строка, А, 1)) - 65;
    Если НЕ ЗначениеЗаполнено( Рез[Поз] ) Тогда
      Рез[Поз]  = А
    КонецЕсли;
  КонецЦикла;

  Поз = 0;
  Для каждого А ИЗ Рез Цикл
    Если ЗначениеЗаполнено(А) Тогда
      Результат[А] = Симв(Поз + 65);
    КонецЕсли;
    Поз + = 1;
  КонецЦикла;

  Строка = "";
  Для каждого А ИЗ Результат /Цикл
    Если ЗначениеЗаполнено(А) Тогда
      Строка += А;
    КонецЕсли;
  КонецЦикла;
Показать
Как-то так )))
user1464234; +1 Ответить
16. karamazoff 117 13.11.20 13:17 Сейчас в теме
  

  Результат ="";
  Для А = 1 По СтрДлина(Строка) Цикл
    Симв= Сред(Строка, А, 1);
    Если СтрНайти(Результат,Симв)>0 или Симв = " " тогда
      Продолжить;
    Иначе
      Результат = Результат+Симв;
    КонецЕсли;
  КонецЦикла;



Показать
user1619761; Bunny; user856012; papami; +4 Ответить
17. papami 56 13.11.20 14:32 Сейчас в теме
Вот этот код самый нормальный.
Но слово "повторяющийся" смущает. Т.е. если ранее был символ, то он не должен повторяться. Я бы обход сделал с конца) и проверял был ли такой символ в строке ранее.
27. FatPanzer 14.11.20 10:11 Сейчас в теме
(17)
Я бы обход сделал с конца) и проверял был ли такой символ в строке ранее.
А нарисуйте-ка, а? ИНтересно же, зачем тут "обход с конца" и как будете проверять на "был ли ранее".
Fox-trot; +1 Ответить
28. papami 56 14.11.20 11:10 Сейчас в теме
(27)
Так, давай-ка твои тестовые задания для собеседования решать здесь не будем.

Похоже FatPanzer и топикстартер - одно лицо)
Учите матчасть)
29. FatPanzer 14.11.20 11:16 Сейчас в теме
(28) Да ты просто гений дедукции!!! Но ты так и не объяснил - почему же лучше обходить строку "с конца"? Начитался про "логичность" удаления элементов из массива и сдвиг индексов что ли?
30. papami 56 14.11.20 11:28 Сейчас в теме
(29)
Коллега перешел на ты)))) Нервы?
Перечитал код выше - он ищет в конечной строке - это норм.
Я когда писал коммент ошибся, в оценке где он ищет символ
Код идеальный.
35. FatPanzer 14.11.20 13:21 Сейчас в теме
(30)
Коллега перешел на ты)))) Нервы?
Не льстите себе )) На "ты" я общаюсь только с друзьями и дураками ;-)
37. papami 56 14.11.20 18:30 Сейчас в теме
(35)
Сочувствую... друзьям
В любом случае именно этот код я Вам рекомендую отдать потенциальному работодателю.
user1706724; FatPanzer; +2 Ответить
31. slim747 14.11.20 11:38 Сейчас в теме
А если попробовать создать таблицу значений. Затем в нее посимвольно загнать исходную строку. Потом таблицу значений свернуть и вывести в переменную все оставшиеся символы с конкатенацией....
36. FatPanzer 14.11.20 13:38 Сейчас в теме
(31)
А если попробовать создать таблицу значений.
Действительно, в любом непонятном случае - вызывай сервер!
32. slim747 14.11.20 11:42 Сейчас в теме
Вверху указан код который и будет идеальным вариантом.
34. user856012 14 14.11.20 12:54 Сейчас в теме
(31)
А если попробовать создать таблицу значений. Затем в нее посимвольно загнать исходную строку.
Не, это слишком просто получается: надо сначала разложить строку в массив, массив загрузить в таблицу значений, ТЗ свернуть, выгрузить в массив и собрать массив в строку.

Вот это - по-настоящему в духе 1С!
(32)
Вверху указан код который и будет идеальным вариантом.
К моменту написания этого вашего сообщения в ветке были приведены семь вариантов кода (включая авторский - восемь), и все они "вверху". Браво, вы настоящий 1Сник!
33. starik-2005 3075 14.11.20 12:29 Сейчас в теме
(32)
Самый простой и понятный код, но нифига не быстрый (кстати, в (13) то же самое и даже лучше, т.к. пробелы убираются в самом начале):
  Рез = ""; // результат, возвращаемый функцией
  Пока НЕ ПустаяСтрока(Строка) Цикл // Строка - входящий параметр функции
    А = Лев(Строка, 1); // получаем первый символ строки
    Строка = СтрЗаменить(Строка, А, ""); // удаляем из строки этот символ
    Если А = " " Тогда Продолжить КонецЕсли; // если это пробел - пропускаем ход
    Рез = Рез + А; // добавляем к результату символ
  КонецЦикла;
Существует примерно сотня разных способов достичь желаемого, и все имеют право на существование. И идеалы у всех разные: кто-то хочет понятный код, кто-то - быстрый, кто-то еще вкладывает в это понятие и то, и другое, и, возможно, какое-нибудь третье - минимум строк и символов в них - самый короткий, использующий минимум памяти или минимум процессорного времени. Но если код решает задачу - он имеет право на существование и может быть вполне идеальным с какой-то из этих точек зрения.
38. karamazoff 117 14.11.20 21:20 Сейчас в теме
(33)ну тут еще момент, что это примитивная задача для почти любого языка программирования и решать ее надо примитивно, на низком уровне, а тут как пошли заходы с массивами, соответсвиями, несколькими проходами, хорошо еще про БСП не вспомнили (а кто и как в БСП пишет модули - по оптимизации, большой вопрос) - вот к этому и идем, вместо 6-и строк кода все чаще вызывают черте шо, написанное черти кем.
user1706724; Fox-trot; +2 Ответить
39. user856012 14 14.11.20 21:39 Сейчас в теме
(38)
это примитивная задача для почти любого языка программирования и решать ее надо примитивно
ИМХО, не так важно - какими методами решать, важно и о коллегах подумать, кто придет после вас.

О чем я? А о том, что можно ли, не зная исходного ТЗ, по одному только коду из (15) сходу понять - какую задачу он решает? То есть, тут в миниатюре воспроизведена обычная ситуация, когда приходит новый программист, ему ставят задачу что-то подправить, он лезет в чужой код, а там нахреноверчено... см. выше.

все чаще вызывают черте шо, написанное черти кем.
Конкретно - черти тем, кому совершенно наплевать на других. Или, как вариант, кто собирается вечно обслуживать свою нетленку... и вообще жить вечно. ;)
40. karamazoff 117 14.11.20 21:56 Сейчас в теме
(39)я про конкретную задачу, а так, конечно, отталкиваться надо от конкретного тз и конкретной конфы, когда что-то не работает в незнакомой конфе, иногда проще проанализировать предыдущий говнокод в одной процедуре, чем отлаживать десятки общих модулей, которые пересылают друг другу инфу. Ни на чем не настаиваю, но, надеюсь жить вечно :)
41. user856012 14 14.11.20 22:02 Сейчас в теме
(40)
надеюсь жить вечно :)
Ну что же, на этот случай есть классика:
Ученик пришел к раввину:
— Ребе! У меня есть желание жить вечно! Что делать?
— Женись!
— И что? Я буду жить вечно?
— Нет! Но желание скоро пройдет.
42. karamazoff 117 14.11.20 22:07 Сейчас в теме
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот