我正在尝试将针对背包问题的基于正则表达式的解决方案从Perl转换为raku。 Perlmonks的详细信息>
Perl解决方案创建此正则表达式:
(?<P>(?:vvvvvvvvvv)?) (?<B>(?:vv)?) (?<Y>(?:vvvv)?) (?<G>(?:vv)?) (?<R>(?:v)?) 0 (?= (?(?{ $1 })wwww|) (?(?{ $2 })w|) (?(?{ $3 })wwwwwwwwwwww|) (?(?{ $4 })ww|) (?(?{ $5 })w|) )
与
vvvvvvvvvvvvvvvvvvv0wwwwwwwwwwwwwww
匹配。之后,匹配哈希%+
包含要放入麻袋中的物品。
我的乐曲转换是:
$<B> = [ [ vv ]? ] $<P> = [ [ vvvvvvvvvv ]? ] $<R> = [ [ v ]? ] $<Y> = [ [ vvvv ]? ] $<G> = [ [ vv ]? ] 0 <?before [ { say "B"; say $/<B>; say $0; say $1; $1 } w || { "" } ] [ { say "P"; say $/<P>; say $0; say $1; $2 } wwww || { "" } ] [ { say "R"; say $/<R>; say $0; say $1; $3 } w || { "" } ] [ { say "Y"; say $/<Y>; say $0; say $1; $4 } wwwwwwwwwwww || { "" } ] [ { say "G"; say $/<G>; say $0; say $1; $5 } ww || { "" } ]
也匹配
vvvvvvvvvvvvvvvvvvv0wwwwwwwwwwwwwww
。但是匹配对象$/
不包含任何有用的内容。另外,我的调试say
都说Nil,所以此时反向引用似乎不起作用?
这是我的测试脚本:
my $max-weight = 15;
my %items =
'R' => { w => 1, v => 1 },
'B' => { w => 1, v => 2 },
'G' => { w => 2, v => 2 },
'Y' => { w => 12, v => 4 },
'P' => { w => 4, v => 10 }
;
my $str = 'v' x %items.map(*.value<v>).sum ~
'0' ~
'w' x $max-weight;
say $str;
my $i = 0;
my $left = my $right = '';
for %items.keys -> $item-name
{
my $v = 'v' x %items{ $item-name }<v>;
my $w = 'w' x %items{ $item-name }<w>;
$left ~= sprintf( '$<%s> = [ [ %s ]? ] ' ~"\n", $item-name, $v );
$right ~= sprintf( '[ { say "%s"; say $/<%s>; say $0; say $1; $%d } %s || { "" } ]' ~ "\n", $item-name, $item-name, ++$i, $w );
}
use MONKEY-SEE-NO-EVAL;
my $re = sprintf( '%s0' ~ "\n" ~ '<?before ' ~ "\n" ~ '%s>' ~ "\n", $left, $right );
say $re;
dd $/ if $str ~~ m:g/<$re>/;
我正在尝试将针对背包问题的基于正则表达式的解决方案从Perl转换为raku。有关Perlmonks的详细信息Perl解决方案创建了此正则表达式:(?
(?: vvvvvvvvvvv)?)(?(?: vv)?)(?...
]