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


in reply to Regex to compare (if) two strings (Uniquely - I will explain inside)

When chickenlips makes reference to Scrabble, what I assume is meant is that a word formed from the random characters need not use all of the random characters, but must use only those characters. E.g., 'mad' can be formed from 'randam', but 'madam' cannot (two 'm' characters).

use warnings FATAL => 'all' ; use strict; use Data::Dump; use constant DEBUG => 0; use constant { DBPR_DD_1 => 1 && DEBUG, }; my $random = 'randam'; my %r_count; $r_count{$_}++ for split '', $random; dd \%r_count if DBPR_DD_1; for my $word (qw(a mad ran madnar madam ranx xxxxxx x)) { my %u_count = %r_count; my $ok = scrabblicious($word, %u_count); my $len = 2 + length $random; printf qq{%*s %sproperly formed from '$random' \n}, $len, qq{'$word'}, $ok ? ' ' : 'im'; } sub scrabblicious { my ($word, %u_count) = @_; for my $c (split '', $word) { return if --$u_count{$c} < 0; } return 1; }

Output:

'a' properly formed from 'randam' 'mad' properly formed from 'randam' 'ran' properly formed from 'randam' 'madnar' properly formed from 'randam' 'madam' improperly formed from 'randam' 'ranx' improperly formed from 'randam' 'xxxxxx' improperly formed from 'randam' 'x' improperly formed from 'randam'

Update: The definition of  scrabblicious() given above will accept an empty string as a match for a 'tray' of characters. So just add
    return if not length $word;
before the for-loop.