## Advent Calendar - December 6, 2021

Monday, Dec 6, 2021| Tags: Raku

## Advent Calendar 2021

### | Day 5 | Day 6 | Day 7 |

The gift is presented by Aaron Smith. Today he is talking about his solution to “The Weekly Challenge - 102”. This is re-produced for Advent Calendar 2021 from the original post by `Aaron Smith`.

## Task #2: Hash-counting String

You are given a positive integer `\$N`.

Write a script to produce Hash-counting string of that length.

The definition of a hash-counting string is as follows:

``````- the string consists only of digits 0-9 and hashes, ‘#’
- there are no two consecutive hashes: ‘##’ does not appear in your string
- the last character is a hash
- the number immediately preceding each hash (if it exists) is the position of that hash in the string, with the position being counted up from 1
``````

### See below for explanation and any implementation-specific comments.

``````ub challenge(Int \$N) returns Str {
my @output;
my \$index = \$N - 1;
while \$index >= 0 {
@output[\$index] = '#';
my \$position = \$index + 1; # Position is 1-based while index is 0-based
for \$position.flip.comb.kv -> \$offset, \$digit {
@output[\$index - (\$offset + 1)] = \$digit;
}
\$index -= (\$position.chars + 1);
}
@output.join;
}

sub MAIN(Int \$N) {
say challenge(\$N);
}
``````

### This program runs as such:

``````\$ raku ch-2.raku 14
2#4#6#8#11#14#
``````

## Explanation

We are given two really concrete details about the sequence:

``````* the last character is a hash
* the number immediately preceding each hash (if it exists) is the position of that hash in the string, with the position being counted up from 1
``````

### Given that, we follow the following steps:

#### 2. While \$index is greater-than-or-equal-to zero:

``````* Set @output[\$index] to #.
* Find the 1-based index (\$position) of that hash character (\$index + 1).
* Iterate backwards through the 1-based index and fill in the indices in front of the newly-placed # with the digits of \$position.
* Decrement \$index by the amount of characters in \$position + 1 (the 1 is for the hash character).
``````

Nothing to add here; this one is pretty straight forward.

## Final Thoughts

It’s pretty cool that Raku has `.sqrt` built right in, but I find it odd that it doesn’t have some sort of .is-whole functionality (Python has `.is_integer()`, Scala has `.isWhole`). Maybe it does, and the documentation is just bad; it would not be the first time I have run into that! Honestly, if you read back through my blog, I think I have found 3 separate ways to check if a floating-point number (`Num`) is an integer (`Int`) in Raku. Oh well, I guess it is all part of the journey!

If you have any suggestion then please do share with us perlweeklychallenge@yahoo.com.