aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--challenge-323/arne-sommer/blog.txt1
-rwxr-xr-xchallenge-323/arne-sommer/raku/ch-1.raku13
-rwxr-xr-xchallenge-323/arne-sommer/raku/ch-2.raku35
-rwxr-xr-xchallenge-323/arne-sommer/raku/increment-decrement13
-rwxr-xr-xchallenge-323/arne-sommer/raku/tax-amount35
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