http://www.perlmonks.org?node_id=1057040


in reply to Re^3: Challenge: 8 Letters, Most Words
in thread Challenge: 8 Letters, Most Words

I think all you need to do is to sort the words descending by length before you run through your loop. See my variation below which is very similar to yours Re^2: Challenge: 8 Letters, Most Words.

The reason is that a longer word will never be added to the stack of a shorter word, so you do not need to check that.

Replies are listed 'Best First'.
Re^5: Challenge: 8 Letters, Most Words
by aaron_baugher (Curate) on Oct 05, 2013 at 15:38 UTC

    That should help, but even then it seems like it would be possible for some matches to be ignored with my method. For instance, say the word 'post' comes along, and next the word 'dime.' Since 'dime' can fit into the bucket started by 'post,' that bucket now holds 'postdime.' Later the word 'cot' comes along, and now it can't be added to that bucket, so there will be no bucket that ever contains 'post' and 'cot.'

    As a test, I tried this short list of words: post dime coat tear. The three words "post coat tear" can fit into 8 letters: aceoprst. Mine failed to find that, as expected, because the 'post' bucket had already been filled with 'dime,' so 'coat' and 'tear' never got a chance at it. If I move 'dime' to the end, then it works, but there's no way to anticipate that. So my method fails, even if I sort the words by length first.

    Aaron B.
    Available for small or large Perl jobs; see my home node.

      Thanks for this post! It did not even occur to me that you could add another letter to make a word fit into a bucket or class if the total of 8 is not exhausted yet. Means I have to rework my solution. I am thinking of cloning a class with less than 8 letters when a new word is added that requires adding new letters. But this will create an explosion of possibilities and lengthen the runtime a lot. Not for tonight...