From d848d3cf55a41587d2e8809838ffec2a84d4491d Mon Sep 17 00:00:00 2001 From: 冯昶 Date: Mon, 17 May 2021 17:58:31 +0800 Subject: challenge 113, raku solutions --- challenge-113/feng-chang/raku/ch-1.raku | 11 ++++++ challenge-113/feng-chang/raku/ch-2.raku | 68 +++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100755 challenge-113/feng-chang/raku/ch-1.raku create mode 100755 challenge-113/feng-chang/raku/ch-2.raku diff --git a/challenge-113/feng-chang/raku/ch-1.raku b/challenge-113/feng-chang/raku/ch-1.raku new file mode 100755 index 0000000000..3b3e4cb4b1 --- /dev/null +++ b/challenge-113/feng-chang/raku/ch-1.raku @@ -0,0 +1,11 @@ +#!/bin/env raku + +subset Digit of UInt where * ≤ 9; + +sub MAIN(UInt:D $N = 25, Digit:D $D = 7) { + put do given $N { + when $N ~~ /$D/ { 1 } + when $N == (1..^$N).grep(/$D/).combinations».sum.any { 1 } + default { 0 } + } +} diff --git a/challenge-113/feng-chang/raku/ch-2.raku b/challenge-113/feng-chang/raku/ch-2.raku new file mode 100755 index 0000000000..0a25d20ea9 --- /dev/null +++ b/challenge-113/feng-chang/raku/ch-2.raku @@ -0,0 +1,68 @@ +#!/bin/env raku + +grammar Tree { + rule TOP { '(' ** 0..2 ')' } + token node { \d+ } +} + +class TreeActions { + method TOP($/) { + my %h = root => $.made; + %h = $[0].made if $[0]; + %h = $[1].made if $[1]; + + make %h; + } + + method node($/) { make $/.Int } +} + +multi MAIN('test') { + use Test; + + is-deeply Tree.parse('(111)', :actions(TreeActions)).made, { root => 111 }, '(111) parsed'; + is-deeply + Tree.parse('(6 (2) (3))', :actions(TreeActions)).made, + { root => 6, left => { root => 2 }, right => { root => 3 } }, + '(6 (2) (3)) parsed'; + + done-testing; +} + +sub tree-sum($t --> Int:D) { + $t ?? $t + tree-sum($t) + tree-sum($t) !! 0 +} + +sub modify-tree($t, Int:D $sum) { + return unless $t; + + $t = $sum - $t; + modify-tree($t, $sum); + modify-tree($t, $sum); +} + +sub print-tree(Hash:D $t) { + print '(', $t; + + if $t.defined { + print ' '; + print-tree($t); + } + + if $t.defined { + print ' '; + print-tree($t); + } + + print ')'; +} + +multi MAIN(Str:D $t = '(1(2(4(7)))(3(5)(6)))') { + my Hash $tree .= new(Tree.parse($t, :actions(TreeActions)).made); + + my $sum = tree-sum($tree); + modify-tree($tree, $sum); + + print-tree($tree); + put ''; +} -- cgit