diff options
| -rw-r--r-- | challenge-323/arne-sommer/blog.txt | 1 | ||||
| -rwxr-xr-x | challenge-323/arne-sommer/raku/ch-1.raku | 13 | ||||
| -rwxr-xr-x | challenge-323/arne-sommer/raku/ch-2.raku | 35 | ||||
| -rwxr-xr-x | challenge-323/arne-sommer/raku/increment-decrement | 13 | ||||
| -rwxr-xr-x | challenge-323/arne-sommer/raku/tax-amount | 35 |
5 files changed, 97 insertions, 0 deletions
diff --git a/challenge-323/arne-sommer/blog.txt b/challenge-323/arne-sommer/blog.txt new file mode 100644 index 0000000000..9f991c5f65 --- /dev/null +++ b/challenge-323/arne-sommer/blog.txt @@ -0,0 +1 @@ +https://raku-musings.com/increment-tax.html diff --git a/challenge-323/arne-sommer/raku/ch-1.raku b/challenge-323/arne-sommer/raku/ch-1.raku new file mode 100755 index 0000000000..25ca74b597 --- /dev/null +++ b/challenge-323/arne-sommer/raku/ch-1.raku @@ -0,0 +1,13 @@ +#! /usr/bin/env raku + +unit sub MAIN (*@operations where @operations.elems > 0 + && all(@operations) eq any('++x', 'x++', '--x', 'x--'), + :v(:$verbose)); + +my %val = ( '++x' => 1, 'x++' => 1, '--x' => -1, 'x--' => -1 ); + +my @val = @operations.map({ %val{$_} }); + +say ": Values: { @val.join(", ") }" if $verbose; + +say @val.sum; diff --git a/challenge-323/arne-sommer/raku/ch-2.raku b/challenge-323/arne-sommer/raku/ch-2.raku new file mode 100755 index 0000000000..6c8143f347 --- /dev/null +++ b/challenge-323/arne-sommer/raku/ch-2.raku @@ -0,0 +1,35 @@ +#! /usr/bin/env raku + +unit sub MAIN (UInt $income is copy, *@tax-brackets where @tax-brackets.elems > 0, + :v(:$verbose)); + +my @tax = @tax-brackets>>.words; + +my @limits = @tax[*;0]>>.Numeric; +my @percents = @tax[*;1]>>.Numeric; + +die "Overlapping brackets" unless [<] @limits; + +die "Wrong percentage values (0..100 only)" unless all(@percents) ~~ Numeric + && all(@percents) >= 0 + && all(@percents) <= 100; + +my $i = 0; +my $tax = 0; + +for @tax -> ($at, $pct) +{ + last if $income <= 0; + + my $bracket = $at - $i; + my $add = min($bracket, $income) * $pct / 100; + + say ": Add [{ $i +1 } .. $at]: $bracket @ $pct% = $add" if $verbose; + + $i = $at; + + $tax += $add; + $income -= $bracket; +} + +say $tax;
\ No newline at end of file diff --git a/challenge-323/arne-sommer/raku/increment-decrement b/challenge-323/arne-sommer/raku/increment-decrement new file mode 100755 index 0000000000..25ca74b597 --- /dev/null +++ b/challenge-323/arne-sommer/raku/increment-decrement @@ -0,0 +1,13 @@ +#! /usr/bin/env raku + +unit sub MAIN (*@operations where @operations.elems > 0 + && all(@operations) eq any('++x', 'x++', '--x', 'x--'), + :v(:$verbose)); + +my %val = ( '++x' => 1, 'x++' => 1, '--x' => -1, 'x--' => -1 ); + +my @val = @operations.map({ %val{$_} }); + +say ": Values: { @val.join(", ") }" if $verbose; + +say @val.sum; diff --git a/challenge-323/arne-sommer/raku/tax-amount b/challenge-323/arne-sommer/raku/tax-amount new file mode 100755 index 0000000000..6c8143f347 --- /dev/null +++ b/challenge-323/arne-sommer/raku/tax-amount @@ -0,0 +1,35 @@ +#! /usr/bin/env raku + +unit sub MAIN (UInt $income is copy, *@tax-brackets where @tax-brackets.elems > 0, + :v(:$verbose)); + +my @tax = @tax-brackets>>.words; + +my @limits = @tax[*;0]>>.Numeric; +my @percents = @tax[*;1]>>.Numeric; + +die "Overlapping brackets" unless [<] @limits; + +die "Wrong percentage values (0..100 only)" unless all(@percents) ~~ Numeric + && all(@percents) >= 0 + && all(@percents) <= 100; + +my $i = 0; +my $tax = 0; + +for @tax -> ($at, $pct) +{ + last if $income <= 0; + + my $bracket = $at - $i; + my $add = min($bracket, $income) * $pct / 100; + + say ": Add [{ $i +1 } .. $at]: $bracket @ $pct% = $add" if $verbose; + + $i = $at; + + $tax += $add; + $income -= $bracket; +} + +say $tax;
\ No newline at end of file |
