我在reddit遇到了一个编程问题(请看该问题的链接)

这是Python中的解决方案之一:

s="112213"
k=2
result=0
for i in range(len(s)):
    num_seen = 0
    window = {}
    for ind in range(i, len(s)):
        if not s[ind] in window:
            num_seen += 1
            window[s[ind]] = 1
        else:
            window[s[ind]] += 1
        if   window[s[ind]] == k:
            num_seen -= 1
            if num_seen == 0:
                result +=1
        elif window[s[ind]] > k:
            break
print(result)

我试图将此解决方案移植到Raku中,这是我的代码:
my @s=<1 1 2 2 1 3>;
my $k=2;
my $res=0;
for ^@s {
    my $seen = 0;
    my %window;
    for @s[$_..*] {
    if $^a == %window.keys.none {
        $seen++;
        %window{$^a} = 1;}
    else {
        %window{$^a} += 1;}
    if %window{$^a} == $k {
        $seen--;
        if $seen == 0 {
        $res++;} }
    elsif %window{$^a} > $k {
        last;}}}
say $res;

它给出了这个错误:
Use of an uninitialized value of type Any in a numeric context in a block at ... line 13
如何解决?

最佳答案

我觉得那不是MRE。它涉及到太多问题,我无法介入。相反,我所做的是从原始Python开始并进行了翻译。我将添加一些评论:

my \s="112213" .comb;      # .comb to simulate Python string[n] indexing.
my \k=2;
my $result=0;              # result is mutated so give it a sigil
for ^s -> \i {             # don't use $^foo vars with for loops
    my $num_seen = 0;
    my \window = {}
    for i..s-1 -> \ind {
        if s[ind] == window.keys.none {   # usefully indent code!
            $num_seen += 1;
            window{s[ind]} = 1
        } else {
            window{s[ind]} += 1
        }
        if window{s[ind]} == k {
            $num_seen -= 1;
            if $num_seen == 0 {
                $result +=1
            }
        } elsif window{s[ind]} > k {
            last
        }
    }
}
print($result)

显示4

我并不是说这是Raku中的一个很好的解决方案。这只是一个相对机械的翻译。希望它会有所帮助。

10-04 10:15