aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad Sajid Anwar <Mohammad.Anwar@yahoo.com>2025-05-27 11:34:18 +0100
committerGitHub <noreply@github.com>2025-05-27 11:34:18 +0100
commite27e602ad21dc021475821391b63f6611f970605 (patch)
treed86c7c2c487a3588dcaf706b5054e2342ebb5aaf
parent60ee688460273895dc1ceeb61a070ecec0f381be (diff)
parentf6cde2100949b1d1ca3d907f9238d257c6ec93c5 (diff)
downloadperlweeklychallenge-club-e27e602ad21dc021475821391b63f6611f970605.tar.gz
perlweeklychallenge-club-e27e602ad21dc021475821391b63f6611f970605.tar.bz2
perlweeklychallenge-club-e27e602ad21dc021475821391b63f6611f970605.zip
Merge pull request #12096 from Firedrake/rogerbw-challenge-323
RogerBW solutions for challenge no. 323
-rwxr-xr-xchallenge-323/roger-bell-west/crystal/ch-1.cr26
-rwxr-xr-xchallenge-323/roger-bell-west/crystal/ch-2.cr28
-rwxr-xr-xchallenge-323/roger-bell-west/javascript/ch-1.js34
-rwxr-xr-xchallenge-323/roger-bell-west/javascript/ch-2.js36
-rw-r--r--challenge-323/roger-bell-west/kotlin/ch-1.kt34
-rw-r--r--challenge-323/roger-bell-west/kotlin/ch-2.kt34
-rwxr-xr-xchallenge-323/roger-bell-west/lua/ch-1.lua35
-rwxr-xr-xchallenge-323/roger-bell-west/lua/ch-2.lua37
-rwxr-xr-xchallenge-323/roger-bell-west/perl/ch-1.pl23
-rwxr-xr-xchallenge-323/roger-bell-west/perl/ch-2.pl27
-rw-r--r--challenge-323/roger-bell-west/postscript/ch-1.ps54
-rw-r--r--challenge-323/roger-bell-west/postscript/ch-2.ps62
-rwxr-xr-xchallenge-323/roger-bell-west/python/ch-1.py25
-rwxr-xr-xchallenge-323/roger-bell-west/python/ch-2.py27
-rwxr-xr-xchallenge-323/roger-bell-west/raku/ch-1.p621
-rwxr-xr-xchallenge-323/roger-bell-west/raku/ch-2.p623
-rwxr-xr-xchallenge-323/roger-bell-west/ruby/ch-1.rb31
-rwxr-xr-xchallenge-323/roger-bell-west/ruby/ch-2.rb33
-rwxr-xr-xchallenge-323/roger-bell-west/rust/ch-1.rs29
-rwxr-xr-xchallenge-323/roger-bell-west/rust/ch-2.rs35
-rw-r--r--challenge-323/roger-bell-west/scala/ch-1.scala35
-rw-r--r--challenge-323/roger-bell-west/scala/ch-2.scala35
-rw-r--r--challenge-323/roger-bell-west/tests.json44
-rw-r--r--challenge-323/roger-bell-west/typst/ch-1.typ29
-rw-r--r--challenge-323/roger-bell-west/typst/ch-2.typ29
25 files changed, 826 insertions, 0 deletions
diff --git a/challenge-323/roger-bell-west/crystal/ch-1.cr b/challenge-323/roger-bell-west/crystal/ch-1.cr
new file mode 100755
index 0000000000..6349a16df7
--- /dev/null
+++ b/challenge-323/roger-bell-west/crystal/ch-1.cr
@@ -0,0 +1,26 @@
+#! /usr/bin/crystal
+
+def incrementdecrement(operations)
+ p = 0
+ operations.each do |s|
+ if s.chars()[1] == '+'
+ p += 1
+ else
+ p -= 1
+ end
+ end
+ p
+end
+
+require "spec"
+describe "incrementdecrement" do
+ it "test_ex1" do
+ incrementdecrement(["--x", "x++", "x++"]).should eq 1
+ end
+ it "test_ex2" do
+ incrementdecrement(["x++", "++x", "x++"]).should eq 3
+ end
+ it "test_ex3" do
+ incrementdecrement(["x++", "++x", "--x", "x--"]).should eq 0
+ end
+end
diff --git a/challenge-323/roger-bell-west/crystal/ch-2.cr b/challenge-323/roger-bell-west/crystal/ch-2.cr
new file mode 100755
index 0000000000..ea73f6c2b3
--- /dev/null
+++ b/challenge-323/roger-bell-west/crystal/ch-2.cr
@@ -0,0 +1,28 @@
+#! /usr/bin/crystal
+
+def taxamount(income, brackets)
+ tax = 0
+ lastbracket = 0
+ brackets.each do |bracket|
+ if income > lastbracket
+ tax += ([income, bracket[0]].min - lastbracket) * bracket[1]
+ else
+ break
+ end
+ lastbracket = bracket[0]
+ end
+ tax / 100.0
+end
+
+require "spec"
+describe "taxamount" do
+ it "test_ex1" do
+ taxamount(10, [[3, 50], [7, 10], [12, 25]]).should eq 2.65
+ end
+ it "test_ex2" do
+ taxamount(2, [[1, 0], [4, 25], [5, 50]]).should eq 0.25
+ end
+ it "test_ex3" do
+ taxamount(0, [[2, 50]]).should eq 0
+ end
+end
diff --git a/challenge-323/roger-bell-west/javascript/ch-1.js b/challenge-323/roger-bell-west/javascript/ch-1.js
new file mode 100755
index 0000000000..9373b341a2
--- /dev/null
+++ b/challenge-323/roger-bell-west/javascript/ch-1.js
@@ -0,0 +1,34 @@
+#! /usr/bin/node
+
+"use strict"
+
+function incrementdecrement(operations) {
+ let p = 0;
+ for (let s of operations) {
+ if (s.charAt(1) == '+') {
+ p += 1;
+ } else {
+ p -= 1;
+ }
+ }
+ return p;
+}
+
+if (incrementdecrement(['--x', 'x++', 'x++']) == 1) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write(" ");
+if (incrementdecrement(['x++', '++x', 'x++']) == 3) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write(" ");
+if (incrementdecrement(['x++', '++x', '--x', 'x--']) == 0) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write("\n");
diff --git a/challenge-323/roger-bell-west/javascript/ch-2.js b/challenge-323/roger-bell-west/javascript/ch-2.js
new file mode 100755
index 0000000000..00808e1d88
--- /dev/null
+++ b/challenge-323/roger-bell-west/javascript/ch-2.js
@@ -0,0 +1,36 @@
+#! /usr/bin/node
+
+"use strict"
+
+function taxamount(income, brackets) {
+ let tax = 0
+ let lastbracket = 0
+ for (let bracket of brackets) {
+ if (income > lastbracket) {
+ tax += (Math.min(income, bracket[0]) - lastbracket) * bracket[1];
+ } else {
+ break;
+ }
+ lastbracket = bracket[0];
+ }
+ return tax / 100.0;
+}
+
+if (taxamount(10, [[3, 50], [7, 10], [12, 25]]) == 2.65) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write(" ");
+if (taxamount(2, [[1, 0], [4, 25], [5, 50]]) == 0.25) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write(" ");
+if (taxamount(0, [[2, 50]]) == 0) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write("\n");
diff --git a/challenge-323/roger-bell-west/kotlin/ch-1.kt b/challenge-323/roger-bell-west/kotlin/ch-1.kt
new file mode 100644
index 0000000000..639d4ddf06
--- /dev/null
+++ b/challenge-323/roger-bell-west/kotlin/ch-1.kt
@@ -0,0 +1,34 @@
+fun incrementdecrement(operations: List<String>): Int {
+ var p = 0
+ for (s in operations) {
+ if (s.get(1) == '+') {
+ p += 1
+ } else {
+ p -= 1
+ }
+ }
+ return p
+}
+
+fun main() {
+
+ if (incrementdecrement(listOf("--x", "x++", "x++")) == 1) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ print(" ")
+ if (incrementdecrement(listOf("x++", "++x", "x++")) == 3) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ print(" ")
+ if (incrementdecrement(listOf("x++", "++x", "--x", "x--")) == 0) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ println("")
+
+}
diff --git a/challenge-323/roger-bell-west/kotlin/ch-2.kt b/challenge-323/roger-bell-west/kotlin/ch-2.kt
new file mode 100644
index 0000000000..6f73a0eb16
--- /dev/null
+++ b/challenge-323/roger-bell-west/kotlin/ch-2.kt
@@ -0,0 +1,34 @@
+fun taxamount(income: Int, brackets: List<List<Int>>): Double {
+ var tax = 0
+ var lastbracket = 0
+ for (bracket in brackets) {
+ if (income > lastbracket) {
+ tax += (listOf(income, bracket[0]).minOrNull()!! - lastbracket) * bracket[1]
+ }
+ lastbracket = bracket[0]
+ }
+ return tax.toDouble() / 100.0
+}
+
+fun main() {
+
+ if (taxamount(10, listOf(listOf(3, 50), listOf(7, 10), listOf(12, 25))) == 2.65) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ print(" ")
+ if (taxamount(2, listOf(listOf(1, 0), listOf(4, 25), listOf(5, 50))) == 0.25) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ print(" ")
+ if (taxamount(0, listOf(listOf(2, 50))) == 0.0) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ println("")
+
+}
diff --git a/challenge-323/roger-bell-west/lua/ch-1.lua b/challenge-323/roger-bell-west/lua/ch-1.lua
new file mode 100755
index 0000000000..d2402dbd25
--- /dev/null
+++ b/challenge-323/roger-bell-west/lua/ch-1.lua
@@ -0,0 +1,35 @@
+#! /usr/bin/lua
+
+function incrementdecrement(operations)
+ local p = 0
+ for _, s in ipairs(operations) do
+ if string.sub(s, 2, 2) == "+" then
+ p = p + 1
+ else
+ p = p - 1
+ end
+ end
+ return p
+end
+
+if incrementdecrement({"--x", "x++", "x++"}) == 1 then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+io.write(" ")
+
+if incrementdecrement({"x++", "++x", "x++"}) == 3 then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+io.write(" ")
+
+if incrementdecrement({"x++", "++x", "--x", "x--"}) == 0 then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+print("")
+
diff --git a/challenge-323/roger-bell-west/lua/ch-2.lua b/challenge-323/roger-bell-west/lua/ch-2.lua
new file mode 100755
index 0000000000..8237c90a9d
--- /dev/null
+++ b/challenge-323/roger-bell-west/lua/ch-2.lua
@@ -0,0 +1,37 @@
+#! /usr/bin/lua
+
+function taxamount(income, brackets)
+ local tax = 0
+ local lastbracket = 0
+ for _, bracket in ipairs(brackets) do
+ if income > lastbracket then
+ tax = tax + (math.min(income, bracket[1]) - lastbracket) * bracket[2]
+ else
+ break
+ end
+ lastbracket = bracket[1]
+ end
+ return tax / 100
+end
+
+if taxamount(10, {{3, 50}, {7, 10}, {12, 25}}) == 2.65 then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+io.write(" ")
+
+if taxamount(2, {{1, 0}, {4, 25}, {5, 50}}) == 0.25 then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+io.write(" ")
+
+if taxamount(0, {{2, 50}}) == 0 then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+print("")
+
diff --git a/challenge-323/roger-bell-west/perl/ch-1.pl b/challenge-323/roger-bell-west/perl/ch-1.pl
new file mode 100755
index 0000000000..ba8628e642
--- /dev/null
+++ b/challenge-323/roger-bell-west/perl/ch-1.pl
@@ -0,0 +1,23 @@
+#! /usr/bin/perl
+
+use strict;
+use warnings;
+use experimental 'signatures';
+
+use Test::More tests => 3;
+
+is(incrementdecrement(['--x', 'x++', 'x++']), 1, 'example 1');
+is(incrementdecrement(['x++', '++x', 'x++']), 3, 'example 2');
+is(incrementdecrement(['x++', '++x', '--x', 'x--']), 0, 'example 3');
+
+sub incrementdecrement($operations) {
+ my $p = 0;
+ foreach my $s (@{$operations}) {
+ if ($s =~ /\+/) {
+ $p++;
+ } else {
+ $p--;
+ }
+ }
+ $p;
+}
diff --git a/challenge-323/roger-bell-west/perl/ch-2.pl b/challenge-323/roger-bell-west/perl/ch-2.pl
new file mode 100755
index 0000000000..4dc58ac728
--- /dev/null
+++ b/challenge-323/roger-bell-west/perl/ch-2.pl
@@ -0,0 +1,27 @@
+#! /usr/bin/perl
+
+use strict;
+use warnings;
+use experimental 'signatures';
+
+use Test::More tests => 3;
+
+is(taxamount(10, [[3, 50], [7, 10], [12, 25]]), 2.65, 'example 1');
+is(taxamount(2, [[1, 0], [4, 25], [5, 50]]), 0.25, 'example 2');
+is(taxamount(0, [[2, 50]]), 0, 'example 3');
+
+use List::Util qw(min);
+
+sub taxamount($income, $brackets) {
+ my $tax = 0;
+ my $lastbracket = 0;
+ foreach my $bracket (@{$brackets}) {
+ if ($income > $lastbracket) {
+ $tax += (min($income, $bracket->[0]) - $lastbracket) * $bracket->[1];
+ } else {
+ last;
+ }
+ $lastbracket = $bracket->[0];
+ }
+ $tax / 100;
+}
diff --git a/challenge-323/roger-bell-west/postscript/ch-1.ps b/challenge-323/roger-bell-west/postscript/ch-1.ps
new file mode 100644
index 0000000000..d4c8919ffd
--- /dev/null
+++ b/challenge-323/roger-bell-west/postscript/ch-1.ps
@@ -0,0 +1,54 @@
+%!PS
+
+% begin included library code
+% see https://codeberg.org/Firedrake/postscript-libraries/
+/test.start {
+ print (:) print
+ /test.pass 0 def
+ /test.count 0 def
+} bind def
+
+/test {
+ /test.count test.count 1 add def
+ {
+ /test.pass test.pass 1 add def
+ } {
+ ( ) print
+ test.count (....) cvs print
+ (-fail) print
+ } ifelse
+} bind def
+
+/test.end {
+ ( ) print
+ test.count 0 gt {
+ (Passed ) print
+ test.pass (...) cvs print
+ (/) print
+ test.count (...) cvs print
+ ( \() print
+ test.pass 100 mul test.count idiv (...) cvs print
+ (%\)) print
+ (\r\n) print
+ } if
+} bind def
+
+
+% end included library code
+
+/incrementdecrement {
+ 0 exch
+ {
+ 1 get 43 eq {
+ 1 add
+ } {
+ 1 sub
+ } ifelse
+ } forall
+} bind def
+
+(incrementdecrement) test.start
+[(--x) (x++) (x++)] incrementdecrement 1 eq test
+[(x++) (++x) (x++)] incrementdecrement 3 eq test
+[(x++) (++x) (--x) (x--)] incrementdecrement 0 eq test
+test.end
diff --git a/challenge-323/roger-bell-west/postscript/ch-2.ps b/challenge-323/roger-bell-west/postscript/ch-2.ps
new file mode 100644
index 0000000000..550402392c
--- /dev/null
+++ b/challenge-323/roger-bell-west/postscript/ch-2.ps
@@ -0,0 +1,62 @@
+%!PS
+
+% begin included library code
+% see https://codeberg.org/Firedrake/postscript-libraries/
+/test {
+ /test.count test.count 1 add def
+ {
+ /test.pass test.pass 1 add def
+ } {
+ ( ) print
+ test.count (....) cvs print
+ (-fail) print
+ } ifelse
+} bind def
+
+/test.end {
+ ( ) print
+ test.count 0 gt {
+ (Passed ) print
+ test.pass (...) cvs print
+ (/) print
+ test.count (...) cvs print
+ ( \() print
+ test.pass 100 mul test.count idiv (...) cvs print
+ (%\)) print
+ (\r\n) print
+ } if
+} bind def
+
+/test.start {
+ print (:) print
+ /test.pass 0 def
+ /test.count 0 def
+} bind def
+
+
+% end included library code
+
+/taxamount {
+ 0 dict begin
+ /brackets exch def
+ /income exch def
+ /lastbracket 0 def
+ 0
+ brackets {
+ /bracket exch def
+ income lastbracket gt {
+ income bracket 0 get min lastbracket sub bracket 1 get mul add
+ } {
+ exit
+ } ifelse
+ /lastbracket bracket 0 get def
+ } forall
+ 100.0 div
+ end
+} bind def
+
+(taxamount) test.start
+10 [[3 50] [7 10] [12 25]] taxamount 2.65 eq test
+2 [[1 0] [4 25] [5 50]] taxamount 0.25 eq test
+0 [[2 50]] taxamount 0 eq test
+test.end
diff --git a/challenge-323/roger-bell-west/python/ch-1.py b/challenge-323/roger-bell-west/python/ch-1.py
new file mode 100755
index 0000000000..9890b59848
--- /dev/null
+++ b/challenge-323/roger-bell-west/python/ch-1.py
@@ -0,0 +1,25 @@
+#! /usr/bin/python3
+
+def incrementdecrement(operations):
+ p = 0
+ for s in operations:
+ if s[1] == "+":
+ p += 1
+ else:
+ p -= 1
+ return p
+
+import unittest
+
+class TestIncrementdecrement(unittest.TestCase):
+
+ def test_ex1(self):
+ self.assertEqual(incrementdecrement(["--x", "x++", "x++"]), 1, 'example 1')
+
+ def test_ex2(self):
+ self.assertEqual(incrementdecrement(["x++", "++x", "x++"]), 3, 'example 2')
+
+ def test_ex3(self):
+ self.assertEqual(incrementdecrement(["x++", "++x", "--x", "x--"]), 0, 'example 3')
+
+unittest.main()
diff --git a/challenge-323/roger-bell-west/python/ch-2.py b/challenge-323/roger-bell-west/python/ch-2.py
new file mode 100755
index 0000000000..f29bd23a75
--- /dev/null
+++ b/challenge-323/roger-bell-west/python/ch-2.py
@@ -0,0 +1,27 @@
+#! /usr/bin/python3
+
+def taxamount(income, brackets):
+ tax = 0
+ lastbracket = 0
+ for bracket in brackets:
+ if income > lastbracket:
+ tax += (min(income, bracket[0]) - lastbracket) * bracket[1]
+ else:
+ break
+ lastbracket = bracket[0]
+ return tax / 100
+
+import unittest
+
+class TestTaxamount(unittest.TestCase):
+
+ def test_ex1(self):
+ self.assertEqual(taxamount(10, [[3, 50], [7, 10], [12, 25]]), 2.65, 'example 1')
+
+ def test_ex2(self):
+ self.assertEqual(taxamount(2, [[1, 0], [4, 25], [5, 50]]), 0.25, 'example 2')
+
+ def test_ex3(self):
+ self.assertEqual(taxamount(0, [[2, 50]]), 0, 'example 3')
+
+unittest.main()
diff --git a/challenge-323/roger-bell-west/raku/ch-1.p6 b/challenge-323/roger-bell-west/raku/ch-1.p6
new file mode 100755
index 0000000000..2fe8905ee3
--- /dev/null
+++ b/challenge-323/roger-bell-west/raku/ch-1.p6
@@ -0,0 +1,21 @@
+#! /usr/bin/raku
+
+use Test;
+
+plan 3;
+
+is(incrementdecrement(['--x', 'x++', 'x++']), 1, 'example 1');
+is(incrementdecrement(['x++', '++x', 'x++']), 3, 'example 2');
+is(incrementdecrement(['x++', '++x', '--x', 'x--']), 0, 'example 3');
+
+sub incrementdecrement(@operations) {
+ my $p = 0;
+ for @operations -> $s {
+ if ($s ~~ /\+/) {
+ $p++;
+ } else {
+ $p--;
+ }
+ }
+ $p;
+}
diff --git a/challenge-323/roger-bell-west/raku/ch-2.p6 b/challenge-323/roger-bell-west/raku/ch-2.p6
new file mode 100755
index 0000000000..1dce267343
--- /dev/null
+++ b/challenge-323/roger-bell-west/raku/ch-2.p6
@@ -0,0 +1,23 @@
+#! /usr/bin/raku
+
+use Test;
+
+plan 3;
+
+is(taxamount(10, [[3, 50], [7, 10], [12, 25]]), 2.65, 'example 1');
+is(taxamount(2, [[1, 0], [4, 25], [5, 50]]), 0.25, 'example 2');
+is(taxamount(0, [[2, 50], ]), 0, 'example 3');
+
+sub taxamount($income, @brackets) {
+ my $tax = 0;
+ my $lastbracket = 0;
+ for @brackets -> @bracket {
+ if ($income > $lastbracket) {
+ $tax += (min($income, @bracket[0]) - $lastbracket) * @bracket[1];
+ } else {
+ last;
+ }
+ $lastbracket = @bracket[0];
+ }
+ $tax / 100;
+}
diff --git a/challenge-323/roger-bell-west/ruby/ch-1.rb b/challenge-323/roger-bell-west/ruby/ch-1.rb
new file mode 100755
index 0000000000..55b1ba200c
--- /dev/null
+++ b/challenge-323/roger-bell-west/ruby/ch-1.rb
@@ -0,0 +1,31 @@
+#! /usr/bin/ruby
+
+def incrementdecrement(operations)
+ p = 0
+ operations.each do |s|
+ if s.chars()[1] == "+"
+ p += 1
+ else
+ p -= 1
+ end
+ end
+ p
+end
+
+require 'test/unit'
+
+class TestIncrementdecrement < Test::Unit::TestCase
+
+ def test_ex1
+ assert_equal(1, incrementdecrement(['--x', 'x++', 'x++']))
+ end
+
+ def test_ex2
+ assert_equal(3, incrementdecrement(['x++', '++x', 'x++']))
+ end
+
+ def test_ex3
+ assert_equal(0, incrementdecrement(['x++', '++x', '--x', 'x--']))
+ end
+
+end
diff --git a/challenge-323/roger-bell-west/ruby/ch-2.rb b/challenge-323/roger-bell-west/ruby/ch-2.rb
new file mode 100755
index 0000000000..f41340b758
--- /dev/null
+++ b/challenge-323/roger-bell-west/ruby/ch-2.rb
@@ -0,0 +1,33 @@
+#! /usr/bin/ruby
+
+def taxamount(income, brackets)
+ tax = 0
+ lastbracket = 0
+ brackets.each do |bracket|
+ if income > lastbracket
+ tax += ([income, bracket[0]].min - lastbracket) * bracket[1]
+ else
+ break
+ end
+ lastbracket = bracket[0]
+ end
+ tax / 100.0
+end
+
+require 'test/unit'
+
+class TestTaxamount < Test::Unit::TestCase
+
+ def test_ex1
+ assert_equal(2.65, taxamount(10, [[3, 50], [7, 10], [12, 25]]))
+ end
+
+ def test_ex2
+ assert_equal(0.25, taxamount(2, [[1, 0], [4, 25], [5, 50]]))
+ end
+
+ def test_ex3
+ assert_equal(0, taxamount(0, [[2, 50]]))
+ end
+
+end
diff --git a/challenge-323/roger-bell-west/rust/ch-1.rs b/challenge-323/roger-bell-west/rust/ch-1.rs
new file mode 100755
index 0000000000..2b4702923b
--- /dev/null
+++ b/challenge-323/roger-bell-west/rust/ch-1.rs
@@ -0,0 +1,29 @@
+#! /bin/sh
+//usr/bin/env rustc --test $0 -o ${0}x && ./${0}x --nocapture; rm -f ${0}x ; exit
+
+#[test]
+fn test_ex1() {
+ assert_eq!(incrementdecrement(vec!["--x", "x++", "x++"]), 1);
+}
+
+#[test]
+fn test_ex2() {
+ assert_eq!(incrementdecrement(vec!["x++", "++x", "x++"]), 3);
+}
+
+#[test]
+fn test_ex3() {
+ assert_eq!(incrementdecrement(vec!["x++", "++x", "--x", "x--"]), 0);
+}
+
+fn incrementdecrement(operations: Vec<&str>) -> i32 {
+ let mut p = 0;
+ for s in operations {
+ if s.chars().nth(1).unwrap() == '+' {
+ p += 1;
+ } else {
+ p -= 1;
+ }
+ }
+ p
+}
diff --git a/challenge-323/roger-bell-west/rust/ch-2.rs b/challenge-323/roger-bell-west/rust/ch-2.rs
new file mode 100755
index 0000000000..bc33c44a88
--- /dev/null
+++ b/challenge-323/roger-bell-west/rust/ch-2.rs
@@ -0,0 +1,35 @@
+#! /bin/sh
+//usr/bin/env rustc --test $0 -o ${0}x && ./${0}x --nocapture; rm -f ${0}x ; exit
+
+#[test]
+fn test_ex1() {
+ assert_eq!(
+ taxamount(10, vec![vec![3, 50], vec![7, 10], vec![12, 25]]),
+ 2.65
+ );
+}
+
+#[test]
+fn test_ex2() {
+ assert_eq!(taxamount(2, vec![vec![1, 0], vec![4, 25], vec![5, 50]]), 0.25);
+}
+
+#[test]
+fn test_ex3() {
+ assert_eq!(taxamount(0, vec![vec![2, 50]]), 0.0);
+}
+
+fn taxamount(income: u32, brackets: Vec<Vec<u32>>) -> f64 {
+ let mut tax = 0;
+ let mut lastbracket = 0;
+ for bracket in brackets {
+ if income > lastbracket {
+ tax +=
+ (std::cmp::min(income, bracket[0]) - lastbracket) * bracket[1];
+ } else {
+ break;
+ }
+ lastbracket = bracket[0];
+ }
+ (tax as f64) / 100.0
+}
diff --git a/challenge-323/roger-bell-west/scala/ch-1.scala b/challenge-323/roger-bell-west/scala/ch-1.scala
new file mode 100644
index 0000000000..ef492e940d
--- /dev/null
+++ b/challenge-323/roger-bell-west/scala/ch-1.scala
@@ -0,0 +1,35 @@
+
+object Incrementdecrement {
+ def incrementdecrement(operations: List[String]): Int = {
+ var p = 0
+ for (s <- operations) {
+ if (s.charAt(1) == '+') {
+ p += 1
+ } else {
+ p -= 1
+ }
+ }
+ p
+ }
+ def main(args: Array[String]) {
+ if (incrementdecrement(List("--x", "x++", "x++")) == 1) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ print(" ")
+ if (incrementdecrement(List("x++", "++x", "x++")) == 3) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ print(" ")
+ if (incrementdecrement(List("x++", "++x", "--x", "x--")) == 0) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ println("")
+
+ }
+}
diff --git a/challenge-323/roger-bell-west/scala/ch-2.scala b/challenge-323/roger-bell-west/scala/ch-2.scala
new file mode 100644
index 0000000000..e06d6ded96
--- /dev/null
+++ b/challenge-323/roger-bell-west/scala/ch-2.scala
@@ -0,0 +1,35 @@
+
+object Taxamount {
+ def taxamount(income: Int, brackets: List[List[Int]]): Double = {
+ var tax = 0
+ var lastbracket = 0
+ for (bracket <- brackets) {
+ if (income > lastbracket) {
+ tax += (List(income, bracket(0)).min - lastbracket) * bracket(1)
+ }
+ lastbracket = bracket(0)
+ }
+ tax.toDouble / 100.0
+ }
+ def main(args: Array[String]) {
+ if (taxamount(10, List(List(3, 50), List(7, 10), List(12, 25))) == 2.65) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ print(" ")
+ if (taxamount(2, List(List(1, 0), List(4, 25), List(5, 50))) == 0.25) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ print(" ")
+ if (taxamount(0, List(List(2, 50))) == 0.0) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ println("")
+
+ }
+}
diff --git a/challenge-323/roger-bell-west/tests.json b/challenge-323/roger-bell-west/tests.json
new file mode 100644
index 0000000000..e2cb72854d
--- /dev/null
+++ b/challenge-323/roger-bell-west/tests.json
@@ -0,0 +1,44 @@
+{
+ "ch-1" : [
+ {
+ "function" : "incrementdecrement",
+ "arguments" : [ "--x", "x++", "x++" ],
+ "result" : 1
+ },
+ {
+ "arguments" : [ "x++", "++x", "x++" ],
+ "result" : 3
+ },
+ {
+ "arguments" : [ "x++", "++x", "--x", "x--" ],
+ "result" : 0
+ }
+ ],
+ "ch-2" : [
+ {
+ "function" : "taxamount",
+ "multiarg" : true,
+ "arguments" : [
+ 10.0,
+ [ [3, 50], [7, 10], [12, 25] ]
+ ],
+ "result" : 2.65
+ },
+ {
+ "multiarg" : true,
+ "arguments" : [
+ 2.0,
+ [ [1, 0], [4, 25], [5, 50] ]
+ ],
+ "result" : 0.25
+ },
+ {
+ "multiarg" : true,
+ "arguments" : [
+ 0.0,
+ [ [2, 50] ]
+ ],
+ "result" : 0.0
+ }
+ ]
+}
diff --git a/challenge-323/roger-bell-west/typst/ch-1.typ b/challenge-323/roger-bell-west/typst/ch-1.typ
new file mode 100644
index 0000000000..3f863e61c0
--- /dev/null
+++ b/challenge-323/roger-bell-west/typst/ch-1.typ
@@ -0,0 +1,29 @@
+#let incrementdecrement(operations) = {
+ let p = 0
+ for s in operations {
+ if s.at(1) == "+" {
+ p += 1
+ } else {
+ p -= 1
+ }
+ }
+ p
+}
+
+#let testresult(pass) = {
+ if pass {
+ text(fill: green, "Pass")
+ } else {
+ text(fill: red, "Fail")
+ }
+}
+
+Test 1:
+ #testresult(incrementdecrement(("--x", "x++", "x++")) == 1)
+
+Test 2:
+ #testresult(incrementdecrement(("x++", "++x", "x++")) == 3)
+
+Test 3:
+ #testresult(incrementdecrement(("x++", "++x", "--x", "x--")) == 0)
+
diff --git a/challenge-323/roger-bell-west/typst/ch-2.typ b/challenge-323/roger-bell-west/typst/ch-2.typ
new file mode 100644
index 0000000000..afc239f19b
--- /dev/null
+++ b/challenge-323/roger-bell-west/typst/ch-2.typ
@@ -0,0 +1,29 @@
+#let taxamount(income, brackets) = {
+ let tax = 0
+ let lastbracket = 0
+ for bracket in brackets {
+ if income > lastbracket {
+ tax += (calc.min(income, bracket.at(0)) - lastbracket) * bracket.at(1)
+ }
+ lastbracket = bracket.at(0)
+ }
+ float(tax) / 100.0
+}
+
+#let testresult(pass) = {
+ if pass {
+ text(fill: green, "Pass")
+ } else {
+ text(fill: red, "Fail")
+ }
+}
+
+Test 1:
+ #testresult(taxam