Финансы без пpоблем: Пеpеговоpный Пункт II (http://hdru.com/cgi-bin/pp2/YaBB.cgi)
>> Общий pаздел >> Быстрое удаление символов
(Message started by: Vladimir на 03.01.17 в 17:24:21)

Заголовок: Быстрое удаление символов
Прислано пользователем Vladimir на 03.01.17 в 17:24:21
Коллеги, нужна помощь!

Имеется строка из которой надо удалять некоторые символы. Количество символов ограничено и они известны заранее.

Пример строки:   BND-42+S5
Пример "лишних" символов ~!"#;%:?*()_+-
Строка после обработки: BND42S5

Нужен самый скорострельный алгоритм на ФБП.

Заголовок: Re: Быстрое удаление символов
Прислано пользователем mine-R на 06.01.17 в 11:31:40
По максимальной скорострельности есть большие сомнения :) но "для затравки" - вариант от кэпа-очевидность:


Code:
C=''
S='BND-42+S5'
for I=1 to [length S]
D=[hc S,I]
if (D>48)&(D<123)&(D<>58)&(D<>59)&(D<>63)&(D<>95)
C=C+[ch D]
endif
endfor
C=[strip C]
printstr C


UPD:
Чуть более скорострельный "близнец":

Code:
C=''
Z='~!"#;%:?*()_+-'
S='BND-42+S5'
for I=1 TO [length S]
D=[cp S,I,1]
if [ps D,Z]=0
C=C+D
endif
endfor
C=[strip C]
printstr C

Заголовок: 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:
Спасибо за отклик. Идея искать удаляемые символы "наоборот"в строке Z может оказаться плодотворной. Сейчас не могу заняться исследованием - приболел. Надеюсь дать отчет до 15 яваря.  


Я поставил много разных экспериментов, описывать их все не имеет смысла. Самый быстрый результат, которого удалось добиться - вот.
ПП :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:
Меня вот когда-то "озадачил" вопрос избавления от [strip] перед выводом, т.е. от начального пустого символа в виде пробела (С=''). В DOS'e раньше можно было "инициализироваться в backspace" (т.е. в [ch 8]). В Сервере этот приём не проходит. Можно конечно организовать счетчик и обработать как угодно первую итерацию, но, возможно, у кого-нибудь есть простое и изящное решение?


Для особо непонятливых дайте пару rpt-строк по своей проблеме.


Заголовок: Re: Быстрое удаление символов
Прислано пользователем mine-R на 17.01.17 в 19:10:23

on 01/17/17 в 17:16:43, Boris, Kiev. wrote:
Для особо непонятливых дайте пару rpt-строк по своей проблеме.


"Как избавиться от пробела в начале строки, при инициализации переменной в строковый пустой символ, не используя [strip]"

Cобственно, как оказалось, и решение уже было у меня, просто затерялось среди множества прочих обрывков кода  :)

Вместо инициализации в '' , можно инициализироваться в "возврат каретки". Вроде как действует и в Сервере..
Итоговый код вышеуказанного алгоритма, с подобной инициализацией будет выглядеть так:


Code:
C=[ch 13]
Z='~!"#;%:?*()_+-'
S='BND-42+S5'
for I=1 TO [length S]
D=[cp S,I,1]
if [ps D,Z]=0
C=C+D
endif
endfor
printstr C


В данном конкретном алгоритме, конечно совсем это избавление от strip'a ни к чему. Привел для наглядности.

Заголовок: Re: Быстрое удаление символов
Прислано пользователем Boris, Kiev. на 18.01.17 в 15:27:52

on 01/17/17 в 19:10:23, mine-R wrote:
"Как избавиться от пробела в начале строки, при инициализации переменной в строковый пустой символ, не используя [strip]"

Замечу, что и [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:
A=[ch8]+[ch8]+[ch8]+[ch8]+[ch8]
B='111112222233333'
C=B+A
printstr C

Заголовок: Re: Быстрое удаление символов
Прислано пользователем Boris, Kiev. на 19.01.17 в 09:41:21

on 01/18/17 в 23:17:46, mine-R wrote:
Я не писал, что это "досада"  :)
Попробуйте убрать [strip] из алгоритма с переменной, инициализированной в '' и сравните с последним алгоритмом, в котором уже убран [strip].
Мне кажется, будет наглядно видна разница. В первом случае, в начале строки окажется "пробел".

А во времена, когда DOS использовался не только как конструктор, можно было к примеру использовать такой прием удаления пятисимвольных слов из конца строки:


Code:
A=[ch8]+[ch8]+[ch8]+[ch8]+[ch8]
B='111112222233333'
C=B+A
printstr C


Тогда желательно "не путать праведное с грешным". Давайте разделять вопрос работы со строками и вопрос управляющих символов при выводе строк.





Powered by YaBB 1 Gold - SP 1.3.2!
Forum software copyright й 2000-2004 Yet another Bulletin Board