How to find the offset of the last instance of a repeating character in a string? (Geoff Canyon)
Bob Sneidar
bobsneidar at iotecdigital.com
Fri Nov 2 10:40:53 EDT 2018
It probably should be named listOffset, like itemOffset or lineOffset.
Bob S
> On Nov 1, 2018, at 17:04 , Geoff Canyon via use-livecode <use-livecode at lists.runrev.com> wrote:
>
> Nice! I *just* finished creating a github repository for it, and adding
> support for multi-char search strings, much as you did. I was coming to the
> list to post the update when I saw your post.
>
> Here's the GitHub link: https://github.com/gcanyon/offsetlist
>
> Here's my updated version:
>
> function offsetList D,S,pCase
> -- returns a comma-delimited list of the offsets of D in S
> set the caseSensitive to pCase is true
> set the itemDel to D
> put length(D) into dLength
> put 1 - dLength into C
> repeat for each item i in S
> add length(i) + dLength to C
> put C,"" after R
> end repeat
> set the itemDel to comma
> if char -dLength to -1 of S is D then return char 1 to -2 of R
> put length(C) + 1 into lenC
> put length(R) into lenR
> if lenC = lenR then return 0
> return char 1 to lenR - lenC - 1 of R
> end offsetList
>
> On Thu, Nov 1, 2018 at 8:28 AM Niggemann, Bernd via use-livecode <
> use-livecode at lists.runrev.com> wrote:
>
>> Hi Geoff,
>>
>> thank you for this beautiful script.
>>
>> I modified it a bit to accept multi-character search string and also for
>> case sensitivity.
>>
>> It definitely is a lot faster for unicode text than anything I have seen.
>>
>> -----------------------------
>> function offsetList D,S, pCase
>> -- returns a comma-delimited list of the offsets of D in S
>> -- pCase is a boolean for caseSensitive
>> set the caseSensitive to pCase
>> set the itemDel to D
>> put the length of D into tDelimLength
>> repeat for each item i in S
>> add length(i) + tDelimLength to C
>> put C - (tDelimLength - 1),"" after R
>> end repeat
>> set the itemDel to comma
>> if char -1 of S is D then return char 1 to -2 of R
>> put length(C) + 1 into lenC
>> put length(R) into lenR
>> if lenC = lenR then return 0
>> return char 1 to lenR - lenC - 1 of R
>> end offsetList
>> ------------------------------
>>
>> Kind regards
>> Bernd
>>
>>
>>
>>
>>
>>>
>>> Date: Thu, 1 Nov 2018 00:15:37 -0700
>>> From: Geoff Canyon
>>> To: How to use LiveCode <use-livecode at lists.runrev.com>
>>> Subject: Re: How to find the offset of the last instance of a
>>> repeating character in a string?
>>>
>>> I was curious if using the itemDelimiter might work for this, so I wrote
>>> the below code out of curiosity; but in my quick testing with single-byte
>>> characters it was only about 30% faster than the above methods, so I
>> didn't
>>> bother to post it.
>>>
>>> But Ben Rubinstein just posted about a terrible slow-down doing pretty
>> much
>>> this same thing for text with unicode characters. So I ran a simple test
>>> with 8000 character long strings that start with a single unicode
>>> character, this is about 15x faster than offset() with skip. For
>>> 100,000-character lines it's about 300x faster, so it seems to be immune
>> to
>>> the line-painter issues skip is subject to. So for what it's worth:
>>>
>>> function offsetList D,S
>>> -- returns a comma-delimited list of the offsets of D in S
>>> set the itemDel to D
>>> repeat for each item i in S
>>> add length(i) + 1 to C
>>> put C,"" after R
>>> end repeat
>>> set the itemDel to comma
>>> if char -1 of S is D then return char 1 to -2 of R
>>> put length(C) + 1 into lenC
>>> put length(R) into lenR
>>> if lenC = lenR then return 0
>>> return char 1 to lenR - lenC - 1 of R
>>> end offsetList
>>>
>>
>>
>> _______________________________________________
>> use-livecode mailing list
>> use-livecode at lists.runrev.com
>> Please visit this url to subscribe, unsubscribe and manage your
>> subscription preferences:
>> http://lists.runrev.com/mailman/listinfo/use-livecode
>>
> _______________________________________________
> use-livecode mailing list
> use-livecode at lists.runrev.com
> Please visit this url to subscribe, unsubscribe and manage your subscription preferences:
> http://lists.runrev.com/mailman/listinfo/use-livecode
More information about the use-livecode
mailing list