# A few more Raku challenges

1) From the given digits L, combine all possible numbers that are less than Y and that contain exactly X digits. 2) Write a function that from the given string returns the last word that matches the given regex.

Let me demonstrate a few more solutions to some of the problems offered by the Perl Weekly Challenge site. This is what you can do during your breakfast.

From the given digits L, combine all possible numbers that are less than Y and that contain exactly X digits.

Here are the initial data for the task:

```my @L = (0, 1, 2, 5);
my \$X = 2;
my \$Y = 21;```

And here is the full solution:

`(grep * < \$Y, grep 10 < * < 100, [X~] @L xx \$X).join(', ').say;`

In this one-liner, we first generate `\$X` copies of the digits in `@L` as `@L xx \$X`, then cross-concatenate them using `[X~]`, then filter the numbers that have two digits (`grep 10 < * < 100`) and finally only leave the numbers less than `\$Y` using another filter (`grep * < \$Y`).

The program prints the following list:

```\$ raku ch-2.raku
10, 11, 12, 15, 20```

If we know that `\$Y` is less than 100, we can simplify the conditions, for example:

`(grep 10 <= * < \$Y, [X~] @L xx \$X).join(', ').say;`

Write a function that, from the given string, returns the last word that matches the given regex.

The task is accomplished with the example of code, which I converted to use Raku regexes here:

```last_word('  hello world',                /<[ea]>l/);      # 'hello'
last_word("Don't match too much, Chet!",  rx:i/ch.t/);     # 'Chet!'
last_word("spaces in regexp won't match", /'in re'/);      #  undef
last_word((1..1e6).join(' '),             /^(3.*?) ** 3/); # '399933'```

To find the words in the string and reverse them so that you can find the first instead of the last, you can use a couple of method calls: `\$str.words.reverse`. But, actually, you even don’t need that as the `first` method accepts the `:end` parameter, which makes `first` to find the last occurrence (I hope it is optimised internally not to scan all items).

```sub last_word(\$str, \$re) {
say \$str.words.first: * ~~ \$re, :end;
}```

And that’s the whole body of the function in question. Run the program and confirm it prints the words that were expected in the task:

```\$ raku ch-1.raku
hello
Chet!
Nil
399933```