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


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

Yes, I had it dump the complete array to a file the last time, and the winning set "painters" only gets 292 words from my script. I had a feeling it could miss some somehow, but I can't quite figure out how yet.

Update: I see the problem now. Let's say "painters" is the 100th word, and "at" is word #2 and "not" is word #3. "not" gets added to bucket #2 along with "at" because it can fit, but now "painters" can't go into that bucket. And since "at" has already been placed in bucket #2 and possibly bucket #1, it can't be placed in bucket #100 with "painters" or in any of the buckets in between that "painters" might be in.

So to make my approach work, I guess once all the words have been placed in at least one bucket, I would have to go back through them again, retrying them against each bucket past the one they started in. And even then I'm not sure you'd be guaranteed to get a bucket with the best possible combination.

I had a nagging feeling there was a problem like that, but I needed a night's sleep to see it.

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

Replies are listed 'Best First'.
Re^4: Challenge: 8 Letters, Most Words
by hdb (Monsignor) on Oct 05, 2013 at 14:48 UTC

    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.

      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...