aboutsummaryrefslogtreecommitdiff
path: root/challenge-053/ryan-thompson/perl/ch-2.pl
blob: 585eaa10f18502a84f3bf7149184ade94bcd34d2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/usr/bin/env perl
#
# ch-2.pl - Vowel strings
#
# Ryan Thompson <rjt@cpan.org>

use 5.010;
use warnings;
use strict;

# Follow rules. Basically graph edges.
my %edges = ( a => ['i','e'],  e => ['i'],    i => ['u','o','e','a'],
              o => ['u','a'],  u => ['e','o'] );

# Builds vowel strings using BFS with queue
sub vowel_string {
    my ($len) = @_;
    my @queue = sort keys %edges; # Pre-load queue

    my @vstrs;
    while (my $str = shift @queue) {
        push @vstrs, $str    and next if $len <= length $str;
        push @queue, $str.$_ for @{$edges{ substr $str, -1 }}
    }
    @vstrs;
}

# Iterator version
sub vowel_iter {
    my ($len) = @_;
    my @queue = sort keys %edges;
    sub {
        while (my $str = shift @queue) {
            return $str if $len <= length $str;
            push @queue, $str.$_ for @{$edges{ substr $str, -1 }}
        }
    }
}

say for vowel_string(6);

my $it = vowel_iter(3);
say while $_ = $it->();