Plucking strings
This is a correction and follow-up of my previous post. The ever helpful vrurg provided a simplification to my transformative role. I added some evil to it, mostly for nicer looking introspection.
role Trans[::From, ::To, &c] {
has To $.value;
method COERCE(From:D $old) {
self.new(:value($old.&c))
}
unless ::?ROLE.^declares_method(my $mname = To.^name) {
::?ROLE.^add_method: $mname, ('my method ' ~ $mname ~ '(--> To) { $.value }').EVAL;
}
}
By checking if the role contains a method already, I don’t need to fool around with the method table any more. I use .EVAL
to compose the method name properly. Rakudo doesn’t care, but a human looking at the method name does not need to be confused. Please note the absence of use MONKEY;
. The method form of EVAL
doesn’t require it. It is safe to assume code not to be safe.
Task 2 can be written as a naive algorithm. Keep the stickers that contain characters that are also in the target word. Check if all letters in the target word are in the kept stickers. If so, show them or complain.
Again, I need a way to turn words into Set
s. I shall do so by invoking the coercion-protocol with a new
-method.
class Plucked {
has $.str;
has @.chars;
method new(Str:D $s) { callwith :str($s), :chars($s.comb) }
method gist { $!str ~ ' ' ~ @!chars.pairs».&{ .key ~ ' ' ~ .value } }
method Str { $.str }
method Set { @.chars.Set }
method AT-POS($pos) { @.chars.AT-POS($pos) }
method AT-KEY($key) { @.chars.grep( * eq $key ) }
}
constant PC = Plucked(Str:D);
for [
('perl','raku','python'), 'peon';
('love','hate','angry'), 'goat';
('come','nation','delta'), 'accommodation';
('come','country','delta'), 'accommodation'
] -> [ @stickers, PC $word ] {
my @keep;
for @stickers -> PC $sticker {
@keep.push($sticker) if $word ∩ $sticker;
}
if ([∪] @keep) ⊇ $word {
put „"$word" can be made with "$@keep"“;
} else {
my $missing = $word ∖ ([∪] @keep);
put „"$word" can not be made, "$missing" is missing“;
}
}
The helper class Plucked
knows how to dissect Str
s and turn them into Set
s and Str
s. Since laziness is a virtue, I reduce the amount of typing by storing the coercion-type in a constant. Then I write the naive algorithm down.
I didn’t know that I can store coercion-types the same way as other type-objects in a constant. It just DWIMed and that pleases me greatly.