|
||||
|
Заголовок: Быстрое удаление символов Прислано пользователем Vladimir на 03.01.17 в 17:24:21 Коллеги, нужна помощь! Имеется строка из которой надо удалять некоторые символы. Количество символов ограничено и они известны заранее. Пример строки: BND-42+S5 Пример "лишних" символов ~!"#;%:?*()_+- Строка после обработки: BND42S5 Нужен самый скорострельный алгоритм на ФБП. |
||||
|
Заголовок: Re: Быстрое удаление символов Прислано пользователем mine-R на 06.01.17 в 11:31:40 По максимальной скорострельности есть большие сомнения :) но "для затравки" - вариант от кэпа-очевидность: Code:
UPD: Чуть более скорострельный "близнец": Code:
|
||||
|
Заголовок: Re: Быстрое удаление символов Прислано пользователем Vladimir на 09.01.17 в 00:52:25 Спасибо за отклик. Идея искать удаляемые символы "наоборот"в строке Z может оказаться плодотворной. Сейчас не могу заняться исследованием - приболел. Надеюсь дать отчет до 15 яваря. |
||||
|
Заголовок: Re: Быстрое удаление символов Прислано пользователем mine-R на 09.01.17 в 11:25:12 Наискорейшего Вам выздоровления! Меня вот когда-то "озадачил" вопрос избавления от [strip] перед выводом, т.е. от начального пустого символа в виде пробела (С=''). В DOS'e раньше можно было "инициализироваться в backspace" (т.е. в [ch 8]). В Сервере этот приём не проходит. Можно конечно организовать счетчик и обработать как угодно первую итерацию, но, возможно, у кого-нибудь есть простое и изящное решение? |
||||
|
Заголовок: Re: Быстрое удаление символов Прислано пользователем Vladimir на 16.01.17 в 06:08:52 on 01/09/17 в 00:52:25, Vladimir wrote:
Я поставил много разных экспериментов, описывать их все не имеет смысла. Самый быстрый результат, которого удалось добиться - вот. ПП :C4 повторенная миллион раз потребовала 6~8 секунд на выполнение. Что особеено приятно - алгоритм корректно работает по концам строки и по пробелам. Идея принадлежит mine-R, за что я ему премного благодарен. Z = '-+~!@#$%^&*()_=`<>?,.;:"[]{}\|_+ xX' S = ' -BND-42+ S5xBND#s> ' Исходная ^^^^^^^^^^^^^^^^^^^^S^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ T0 = [:TIMER] for ii = 1 to 1000000 S = [:C4 Z, S] endfor ET = [:TIMEDCD [:TIMER] - T0] ELAPSED TIME = ^^^^^^^^^^^ET^^^^^^^^^^^^^^^^^^^^^^^^^^^ S = S+'*' добавим * чтобы видеть последний пробел Результат ^^^^^^^^^^^^^^^^^^^^S^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ stop * :C4 (S) * Z chars to remove * S string to claen local i, C, L CS = ' ' _Init clean string L = [length S] for i = 1 to L C = [cp S, i, 1] if [ps C, Z] = 0 CS = CS + C endif endfor CS = [strip CS] return (CS) |
||||
|
Заголовок: Re: Быстрое удаление символов Прислано пользователем Boris, Kiev. на 17.01.17 в 17:14:03 Аналогичный алгоритм использую для очистки имени файла которое присваивается по пользовательскому вводу и частенько может содержать недопустимые WinОС символы: \ / : * ? ” < > | Замечу, что в случае длины обрабатываемой строки большей, чем длина строки «спецсимволов», то скорее всего поиск спецсимволов в целевой строке будет эффективнее сугубо по причине сокращения практически сходного цикла. Если речь идёт о единичной процедуре в каком-то сценарии, то ломать копья с вариантами этого алгорита не стоит. В идеальном и универсальном варианте для массы обращений в одном сценарии, можно собрать алгоритм с варьированием обоих вариантов в зависимости от параметров отработки каждого на предыдущем варианте входной строки, конечно при условии, что ряд обращений к этому универ-алгоритму будет аналогичным. |
||||
|
Заголовок: Re: Быстрое удаление символов Прислано пользователем Boris, Kiev. на 17.01.17 в 17:16:43 on 01/09/17 в 11:25:12, mine-R wrote:
Для особо непонятливых дайте пару rpt-строк по своей проблеме. |
||||
|
Заголовок: Re: Быстрое удаление символов Прислано пользователем mine-R на 17.01.17 в 19:10:23 on 01/17/17 в 17:16:43, Boris, Kiev. wrote:
"Как избавиться от пробела в начале строки, при инициализации переменной в строковый пустой символ, не используя [strip]" Cобственно, как оказалось, и решение уже было у меня, просто затерялось среди множества прочих обрывков кода :) Вместо инициализации в '' , можно инициализироваться в "возврат каретки". Вроде как действует и в Сервере.. Итоговый код вышеуказанного алгоритма, с подобной инициализацией будет выглядеть так: Code:
В данном конкретном алгоритме, конечно совсем это избавление от strip'a ни к чему. Привел для наглядности. |
||||
|
Заголовок: Re: Быстрое удаление символов Прислано пользователем Boris, Kiev. на 18.01.17 в 15:27:52 on 01/17/17 в 19:10:23, mine-R wrote:
Замечу, что и [strip ‘ ‘] не даст вожделенной вами «пустой» строки, т.к. strip над пробелом(ами) оставляет единственный пробел. И возврат каретки в этом случае мало чем отличается от использования другого символа, ведь он всего навсего управляющий символ при выводе и не более, ведь длина этой строки всё также будет с учетом единички от него. Мне не очень до сих пор понятно, какую такую «досаду» вы хотите объехать. Инициализировать переменную любым символом, отработать с этой переменной, отрезать этот символ на выходе и вуаля, в чём «досада»? |
||||
|
Заголовок: Re: Быстрое удаление символов Прислано пользователем mine-R на 18.01.17 в 23:17:46 on 01/18/17 в 15:27:52, Boris, Kiev. wrote:
Я не писал, что это "досада" :) Попробуйте убрать [strip] из алгоритма с переменной, инициализированной в '' и сравните с последним алгоритмом, в котором уже убран [strip]. Мне кажется, будет наглядно видна разница. В первом случае, в начале строки окажется "пробел". А во времена, когда DOS использовался не только как конструктор, можно было к примеру использовать такой прием удаления пятисимвольных слов из конца строки: Code:
|
||||
|
Заголовок: Re: Быстрое удаление символов Прислано пользователем Boris, Kiev. на 19.01.17 в 09:41:21 on 01/18/17 в 23:17:46, mine-R wrote:
Тогда желательно "не путать праведное с грешным". Давайте разделять вопрос работы со строками и вопрос управляющих символов при выводе строк. |
||||
|
Powered by YaBB 1 Gold - SP 1.3.2! Forum software copyright й 2000-2004 Yet another Bulletin Board |