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