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 15:16:52 EDT 2018
how about allOffsets?
Bob S
> On Nov 2, 2018, at 09:16 , Geoff Canyon via use-livecode <use-livecode at lists.runrev.com> wrote:
>
> All of those return a single value; I wanted to convey the concept of
> returning multiple values. To me listOffset implies it does the same thing
> as itemOffset, since items come in a list. How about:
>
> offsets -- not my favorite because it's almost indistinguishable from offset
> offsetsOf -- seems a tad clumsy
>
> On Fri, Nov 2, 2018 at 7:41 AM Bob Sneidar via use-livecode <
> use-livecode at lists.runrev.com> wrote:
>
>> 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
>>
>>
>> _______________________________________________
>> 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