diff options
| -rw-r--r-- | challenge-113/ben-davies/raku/ch-01.raku | 4 | ||||
| -rw-r--r-- | challenge-113/ben-davies/raku/ch-02.raku | 42 |
2 files changed, 46 insertions, 0 deletions
diff --git a/challenge-113/ben-davies/raku/ch-01.raku b/challenge-113/ben-davies/raku/ch-01.raku new file mode 100644 index 0000000000..5a70ca0745 --- /dev/null +++ b/challenge-113/ben-davies/raku/ch-01.raku @@ -0,0 +1,4 @@ +use v6; +unit sub MAIN(IntStr:D $n where 1..*, IntStr:D $d where 1..9) { + say Int(+$n ∈ (1..$n).grep({ m/$d/ }).combinations».sum); +} diff --git a/challenge-113/ben-davies/raku/ch-02.raku b/challenge-113/ben-davies/raku/ch-02.raku new file mode 100644 index 0000000000..c747e68ffc --- /dev/null +++ b/challenge-113/ben-davies/raku/ch-02.raku @@ -0,0 +1,42 @@ +use v6; + +role BTree[::T] { + has T $.value is required; + has ::?CLASS:_ $.left = $?CLASS; + has ::?CLASS:_ $.right = $?CLASS; + + method new(::?ROLE:_: T $value, ::?CLASS:_ :L($left) = $?CLASS, ::?CLASS:_ :R($right) = $?CLASS --> ::?ROLE:D) { + self.bless: :$value, :$left, :$right + } + + multi method CALL-ME(::?ROLE:U: |args --> ::?ROLE:D) { + self.new: |args + } + + multi method sum(::?ROLE:U: --> 0) { } + multi method sum(::?ROLE:D: --> Int:D) { $!value + $!left.sum + $!right.sum } + + multi method map(::?ROLE:U: &f --> ::?ROLE:U) { self } + multi method map(::?ROLE:D: &f --> ::?ROLE:D) { self.new: f($!value), L => $!left.map(&f), R => $!right.map(&f) } + + multi method gist(::?ROLE:D: Int:D :$level = 0 --> Str:D) { + my Str:D $margin = ' ' x $level * 2; + join $?NL, + $!value.gist, + ($margin ~ "L $!left.gist(level => $level + 1)" with $!left), + ($margin ~ "R $!right.gist(level => $level + 1)" with $!right) + } +} + +my constant BIT = BTree[Int:D].^pun; + +unit sub MAIN() { + my BIT:D $bit = BIT(1, + L => BIT(2, + L => BIT(4, + R => BIT(7))), + R => BIT(3, + L => BIT(5), + R => BIT(6))); + say $bit.map: $bit.sum - *; +} |
