On Sun, 30 Dec 2018 at 00:29, Roelof Wobben <r.wob...@home.nl> wrote:

> Hello,
>
> Still working on AdventOfCode
>
> I'm struggling to see how this can be solved.
>
> Now, a nice string is one with all of the following properties:
>
>    - It contains a pair of any two letters that appears at least twice in
>    the string without overlapping, like xyxy (xy) or aabcdefgaa (aa), but
>    not like aaa (aa, but it overlaps).
>
> To exclude overlaps, one approach could be to subtract each candidate pair
from the string
and then check the remainder-string for matches.
I'm not sure, but suspect that as the candidate pair progresses through the
string, only the
trailing remainder-string needs matching since the preceding
remainder-string has already been checked.

So a Pharo 7 Spotter search for 'pairs' finds 28 implementors
where SequenceableCollection>>overlappingPairsCollect:
looks quite close to what is required...
  'abcdefg' asArray overlappingPairsCollect: [ :a :b | { a.b } ].  "#(
  #($a $b)
  #($b $c)
  #($c $d)
  #($d $e)
  #($e $f)
  #($f $g))"

Reviewing its implementation...
    SequenceableCollection>>overlappingPairsCollect: aBlock
| retval |
retval := self species ofSize: self size - 1.
1 to: self size - 1
do: [:i | retval at: i put: (aBlock value: (self at: i) value: (self at: i
+ 1)) ].
^retval

it can be adapted to provide also a remainder...
    SequenceableCollection>>overlappingPairsRemainderCollect: aBlock
| retval |
retval := self species ofSize: self size - 1.
1 to: self size - 1
do: [:i | retval at: i put: (aBlock value: (self at: i) value: (self at: i
+ 1) value: (self allButFirst: i + 1)) ].
^retval

for use like this...
  'abcdefg' asArray  overlappingPairsRemainderCollect: [ :a :b :rem | {
a.b.rem } ] "#(
  #($a $b #($c $d $e $f $g))
  #($b $c #($d $e $f $g))
  #($c $d #($e $f $g))
  #($d $e #($f $g))
  #($e $f #($g))
  #($f $g #()))"



>    - It contains at least one letter which repeats with exactly one
>    letter between them, like xyx, abcdefeghi (efe), or even aaa.
>
> You might adapt "overlappingPairsCollect: aBlock"
into  "overlappingPairsSkip: n collect: aBlock"
but changing  "size -1"  and   "i + 1"
into  "size - n"  and   "i + n"

HTH
cheers -ben

P.S. If  #overlappingPairsSkip:collect:  seemed generically useful to push
into Pharo,
then the following would be redefined to reuse it...
  SequenceableCollection>>overlappingPairsCollect: aBlock
      ^self overlappingPairsSkip: 1 collect: aBlock

The extra layer of function call doesn't add much overhead.

On the other hand #overlappingPairsRemainderCollect:
does lots of extra copying through #allButFirst:
so would not be so good for reuse by  #overlappingPairsCollect:

Reply via email to