in reply to Re: How to perform different sorts on multiple sections of items in the same array
in thread How to perform different sorts on multiple sections of items in the same array

For your sample data, the OPs specifications, should lead to an ordering of:

copy carpet soap error prawn emblem cabin echo pail engine reptile esk +imo skunk

Not:

carpet error prawn reptile emblem engine echo eskimo copy soap cabin p +ail skunk

Consider the OPs 3-part specification and the following:

orig pre-r sort-r pre-e sort-e pre-o sort-O + final cabin cabin copy + copy prawn prawn carpet + carpet pail pail soap + soap error error error + error reptile reptile prawn + prawn engine engine emblem + emblem copy copy cabin + cabin echo echo echo + echo soap soap pail + pail eskimo eskimo engine + engine carpet carpet reptile + reptile emblem emblem eskimo + eskimo skunk skunk skunk + skunk

The problem with your algorithm is, that is doesn't exclude those items that match the first criteria, from being considered by the second criteria, if the also match it; but the OPs specifications (emphasis added):

all the strings inside the array that contain an “r” and sort those in ascending alphabetical order. For the elements that are left, find the ones that start with an “e” and sort those by ascii value of their third character. And for the ones that are left reverse sort by their last letter alphabetically.

Your algorithm does not exclude items that contain an 'r' from being considered when processing items that start with an 'e'. Eg. 'error'.

Nor does it exclude items that contain an 'r', or start with an 'e', from being processed when reverse sorting "the ones that are left".


With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.

Replies are listed 'Best First'.
Re^3: How to perform different sorts on multiple sections of items in the same array
by johngg (Canon) on Dec 30, 2014 at 12:28 UTC

    Perhaps I misinterpreted the OP's spec. I thought the requirement was to sort all those containing an 'r' followed by those starting with an 'e' and finally the remainder but I can see that your interpretation of leaving each set in their relative positions could be more accurate. Perhaps estreb could clarify?

    Your algorithm does not exclude items that contain an 'r' from being considered when processing items that start with an 'e'. Eg. 'error'.

    Nor does it exclude items that contain an 'r', or start with an 'e', from being processed when reverse sorting "the ones that are left".

    I'm not sure you are correct in those statements. The if ( m{r} ) { ... } elsif ( m{^e} ) { ... } else { ... } section assigns ascending values to $type which is packed as the first term and becomes the primary key for the sort. Thus all those starting with an 'r' are sorted separately from those starting with 'e' which are again separate from the remainder. I think this is demonstrated by the output.

    carpet } error } Strings containing an 'r' anywhere prawn } are sorted ascending alpha reptile } emblem } engine } Strings starting with 'e' but not echo } containing an 'r' are sorted ascending eskimo } alpha on the third character copy } soap } Strings neither containing an 'r' nor cabin } starting with 'e' are sorted descending pail } alpha on the last character skunk }

    Please let me know if you still think I am having a senior moment and have got this aspect of the algorithm completely wrong.

    Update: Corrected wrong variable in explanation, s/$ord/$type/

    Cheers,

    JohnGG

      Please let me know if you still think I am having a senior moment and have got this aspect of the algorithm completely wrong.

      No. I was :)

      Looking again at your code, post reading your explanation, I now see the effect/purpose of your $type variable -- to effectively segregate and pre-order the three subsets of the data.

      And, looking again at the OPs description, yours is just as valid an interpretation of it, as mine.

      Sorry for having misinterpreted your code the first time; and thankyou for the patient explanation. I learnt something -- which is always nice :)


      With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      "Science is about questioning the status quo. Questioning authority".
      In the absence of evidence, opinion is indistinguishable from prejudice.