树中的距离

作者:L. Grondin

http://rosalind.info/problems/nwck/

示例输入

(cat)dog;
dog cat

(dog,cat);
dog cat

注意:输入数据中需要有一个尾随换行符,以便输入可以被三整除。

示例输出

1 2

源代码: nwck-grondilu.pl

use v6;

my $default-data = q:to/END/;
    (cat)dog;
    dog cat

    (dog,cat);
    dog cat

    END

sub MAIN($input-file = Nil) {
    my $input = $input-file ?? $input-file.IO.slurp !! $default-data;
    say gather for $input.lines.list -> $newick, $taxa, $ {
        my ($a, $b) = $taxa.split: ' ';
        my @token = $newick.comb: rx/ <.ident>+ | <[(),]> /;
        Nil while @token.shift ne $a|$b;
        my ($climbs, $descents) = 0 xx 2;
        for @token {
            last if $_ eq $a or $_ eq $b;
            if /< , ) >/ {
                if $descents > 0 { $descents-- }
                else { $climbs++ }
            }
            if /< , ( >/ { $descents++ }
        }
        take $climbs + $descents;
    }.join(" ");
}