aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoger Bell_West <roger@firedrake.org>2025-09-30 11:48:10 +0100
committerRoger Bell_West <roger@firedrake.org>2025-09-30 11:48:10 +0100
commit46aae2ffd5fc0fce803e3a7d0d02dc045f799373 (patch)
tree7066df2dbc633c9e032f398c05a7e7a09e811b22
parent46c9f9879bd1c7180e15feac6c070fe4c3307ae9 (diff)
downloadperlweeklychallenge-club-46aae2ffd5fc0fce803e3a7d0d02dc045f799373.tar.gz
perlweeklychallenge-club-46aae2ffd5fc0fce803e3a7d0d02dc045f799373.tar.bz2
perlweeklychallenge-club-46aae2ffd5fc0fce803e3a7d0d02dc045f799373.zip
RogerBW solutions for challenge no. 341
-rwxr-xr-xchallenge-341/roger-bell-west/crystal/ch-1.cr32
-rwxr-xr-xchallenge-341/roger-bell-west/crystal/ch-2.cr32
-rwxr-xr-xchallenge-341/roger-bell-west/javascript/ch-1.js47
-rwxr-xr-xchallenge-341/roger-bell-west/javascript/ch-2.js47
-rw-r--r--challenge-341/roger-bell-west/kotlin/ch-1.kt46
-rw-r--r--challenge-341/roger-bell-west/kotlin/ch-2.kt45
-rwxr-xr-xchallenge-341/roger-bell-west/lua/ch-1.lua95
-rwxr-xr-xchallenge-341/roger-bell-west/lua/ch-2.lua79
-rwxr-xr-xchallenge-341/roger-bell-west/perl/ch-1.pl32
-rwxr-xr-xchallenge-341/roger-bell-west/perl/ch-2.pl24
-rw-r--r--challenge-341/roger-bell-west/postscript/ch-1.ps153
-rw-r--r--challenge-341/roger-bell-west/postscript/ch-2.ps86
-rwxr-xr-xchallenge-341/roger-bell-west/python/ch-1.py32
-rwxr-xr-xchallenge-341/roger-bell-west/python/ch-2.py32
-rwxr-xr-xchallenge-341/roger-bell-west/raku/ch-1.p623
-rwxr-xr-xchallenge-341/roger-bell-west/raku/ch-2.p623
-rwxr-xr-xchallenge-341/roger-bell-west/ruby/ch-1.rb41
-rwxr-xr-xchallenge-341/roger-bell-west/ruby/ch-2.rb39
-rwxr-xr-xchallenge-341/roger-bell-west/rust/ch-1.rs45
-rwxr-xr-xchallenge-341/roger-bell-west/rust/ch-2.rs40
-rw-r--r--challenge-341/roger-bell-west/scala/ch-1.scala48
-rw-r--r--challenge-341/roger-bell-west/scala/ch-2.scala46
-rw-r--r--challenge-341/roger-bell-west/tests.json88
-rw-r--r--challenge-341/roger-bell-west/typst/ch-1.typ40
-rw-r--r--challenge-341/roger-bell-west/typst/ch-2.typ35
25 files changed, 1250 insertions, 0 deletions
diff --git a/challenge-341/roger-bell-west/crystal/ch-1.cr b/challenge-341/roger-bell-west/crystal/ch-1.cr
new file mode 100755
index 0000000000..68861b61c7
--- /dev/null
+++ b/challenge-341/roger-bell-west/crystal/ch-1.cr
@@ -0,0 +1,32 @@
+#! /usr/bin/crystal
+
+def brokenkeyboard(a, b)
+ bk = Set.new(b.map{|x| x.downcase.chars[0]})
+ ct = 0
+ a.downcase.split(" ").each do |w|
+ nk = Set.new(w.chars)
+ if (bk & nk).size == 0
+ ct += 1
+ end
+ end
+ ct
+end
+
+require "spec"
+describe "brokenkeyboard" do
+ it "test_ex1" do
+ brokenkeyboard("Hello World", ["d"]).should eq 1
+ end
+ it "test_ex2" do
+ brokenkeyboard("apple banana cherry", ["a", "e"]).should eq 0
+ end
+ it "test_ex3" do
+ brokenkeyboard("Coding is fun", [] of String).should eq 3
+ end
+ it "test_ex4" do
+ brokenkeyboard("The Weekly Challenge", ["a", "b"]).should eq 2
+ end
+ it "test_ex5" do
+ brokenkeyboard("Perl and Python", ["p"]).should eq 1
+ end
+end
diff --git a/challenge-341/roger-bell-west/crystal/ch-2.cr b/challenge-341/roger-bell-west/crystal/ch-2.cr
new file mode 100755
index 0000000000..e699af0d21
--- /dev/null
+++ b/challenge-341/roger-bell-west/crystal/ch-2.cr
@@ -0,0 +1,32 @@
+#! /usr/bin/crystal
+
+def reverseprefix(a, f)
+ c = a.split("")
+ p = a.index(f)
+ if !p.nil?
+ jr = c[0, p + 1].reverse
+ jr.each_with_index do |ch, i|
+ c[i] = ch
+ end
+ end
+ c.join("")
+end
+
+require "spec"
+describe "reverseprefix" do
+ it "test_ex1" do
+ reverseprefix("programming", "g").should eq "gorpramming"
+ end
+ it "test_ex2" do
+ reverseprefix("hello", "h").should eq "hello"
+ end
+ it "test_ex3" do
+ reverseprefix("abcdefghij", "h").should eq "hgfedcbaij"
+ end
+ it "test_ex4" do
+ reverseprefix("reverse", "s").should eq "srevere"
+ end
+ it "test_ex5" do
+ reverseprefix("perl", "r").should eq "repl"
+ end
+end
diff --git a/challenge-341/roger-bell-west/javascript/ch-1.js b/challenge-341/roger-bell-west/javascript/ch-1.js
new file mode 100755
index 0000000000..950b9e944d
--- /dev/null
+++ b/challenge-341/roger-bell-west/javascript/ch-1.js
@@ -0,0 +1,47 @@
+#! /usr/bin/node
+
+"use strict"
+
+function brokenkeyboard(a, b) {
+ const bk = new Set(b.map( k => k.toLowerCase().split('')[0] ));
+ let ct = 0;
+ for (let w of a.split(" ")) {
+ const nk = new Set(w.toLowerCase().split(""));
+ const intersect = new Set([...bk].filter(i => nk.has(i)));
+ if (intersect.size == 0) {
+ ct += 1;
+ }
+ }
+ return ct;
+}
+
+if (brokenkeyboard('Hello World', ['d']) == 1) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write(" ");
+if (brokenkeyboard('apple banana cherry', ['a', 'e']) == 0) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write(" ");
+if (brokenkeyboard('Coding is fun', []) == 3) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write(" ");
+if (brokenkeyboard('The Weekly Challenge', ['a', 'b']) == 2) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write(" ");
+if (brokenkeyboard('Perl and Python', ['p']) == 1) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write("\n");
diff --git a/challenge-341/roger-bell-west/javascript/ch-2.js b/challenge-341/roger-bell-west/javascript/ch-2.js
new file mode 100755
index 0000000000..f5ec32ce22
--- /dev/null
+++ b/challenge-341/roger-bell-west/javascript/ch-2.js
@@ -0,0 +1,47 @@
+#! /usr/bin/node
+
+"use strict"
+
+function reverseprefix(a, f) {
+ let c = a.split('');
+ const fc = f.split('')[0];
+ const p = c.indexOf(fc);
+ if (p >= 0) {
+ let jr = c.slice(0, p + 1);
+ jr.reverse();
+ let cr = c.slice(p + 1);
+ c = jr.concat(cr);
+ }
+ return c.join("");
+}
+
+if (reverseprefix('programming', 'g') == 'gorpramming') {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write(" ");
+if (reverseprefix('hello', 'h') == 'hello') {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write(" ");
+if (reverseprefix('abcdefghij', 'h') == 'hgfedcbaij') {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write(" ");
+if (reverseprefix('reverse', 's') == 'srevere') {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write(" ");
+if (reverseprefix('perl', 'r') == 'repl') {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write("\n");
diff --git a/challenge-341/roger-bell-west/kotlin/ch-1.kt b/challenge-341/roger-bell-west/kotlin/ch-1.kt
new file mode 100644
index 0000000000..182fa1a24e
--- /dev/null
+++ b/challenge-341/roger-bell-west/kotlin/ch-1.kt
@@ -0,0 +1,46 @@
+fun brokenkeyboard(a: String, b: List<String>): Int {
+ val bk = b.map{ it.lowercase().toList()[0] }.toSet()
+ var ct = 0
+ for (w in a.split(" ")) {
+ val nl = w.lowercase().toSet()
+ if (bk.intersect(nl).isEmpty()) {
+ ct += 1
+ }
+ }
+ return ct
+}
+
+fun main() {
+
+ if (brokenkeyboard("Hello World", listOf("d")) == 1) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ print(" ")
+ if (brokenkeyboard("apple banana cherry", listOf("a", "e")) == 0) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ print(" ")
+ if (brokenkeyboard("Coding is fun", emptyList<String>()) == 3) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ print(" ")
+ if (brokenkeyboard("The Weekly Challenge", listOf("a", "b")) == 2) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ print(" ")
+ if (brokenkeyboard("Perl and Python", listOf("p")) == 1) {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ println("")
+
+}
diff --git a/challenge-341/roger-bell-west/kotlin/ch-2.kt b/challenge-341/roger-bell-west/kotlin/ch-2.kt
new file mode 100644
index 0000000000..d40b410335
--- /dev/null
+++ b/challenge-341/roger-bell-west/kotlin/ch-2.kt
@@ -0,0 +1,45 @@
+fun reverseprefix(a: String, f: String): String {
+ var c = a.toList()
+ val fc = f.toList()[0]
+ val p = c.indexOf(fc)
+ if (p >= 0) {
+ val jr = c.slice(0 .. p).asReversed()
+ c = jr + c.asReversed().slice(0 .. c.size - p - 2).asReversed()
+ }
+ return c.joinToString("")
+}
+
+fun main() {
+
+ if (reverseprefix("programming", "g") == "gorpramming") {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ print(" ")
+ if (reverseprefix("hello", "h") == "hello") {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ print(" ")
+ if (reverseprefix("abcdefghij", "h") == "hgfedcbaij") {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ print(" ")
+ if (reverseprefix("reverse", "s") == "srevere") {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ print(" ")
+ if (reverseprefix("perl", "r") == "repl") {
+ print("Pass")
+ } else {
+ print("Fail")
+ }
+ println("")
+
+}
diff --git a/challenge-341/roger-bell-west/lua/ch-1.lua b/challenge-341/roger-bell-west/lua/ch-1.lua
new file mode 100755
index 0000000000..e563dedeb4
--- /dev/null
+++ b/challenge-341/roger-bell-west/lua/ch-1.lua
@@ -0,0 +1,95 @@
+#! /usr/bin/lua
+
+function split(t)
+ local cl = {}
+ string.gsub(t,
+ "(.)",
+ function(c)
+ table.insert(cl, c)
+ end
+ )
+ return cl
+end
+
+function splits(inputstr, sep)
+ sep = sep or '%s'
+ local starts = {1}
+ local ends = {}
+ local n = 1
+ while true do
+ local fs, fe = string.find(inputstr, sep, n)
+ if fs == nil then
+ break
+ end
+ table.insert(ends, fs - 1)
+ table.insert(starts, fe + 1)
+ n = fe + 1
+ end
+ table.insert(ends, #inputstr)
+ local t = {}
+ for i = 1, #starts do
+ local s = starts[i]
+ local e = ends[i]
+ if e >= s then
+ table.insert(t, string.sub(inputstr, s, e))
+ end
+ end
+ return t
+end
+
+function brokenkeyboard(a, b)
+ local bk = {}
+ for _, c in ipairs(b) do
+ bk[string.lower(c)] = true
+ end
+ local ct = 0
+ for _, w in ipairs(splits(string.lower(a), " ")) do
+ local valid = true
+ for __, c in ipairs(split(w)) do
+ if bk[c] ~= nil then
+ valid = false
+ break
+ end
+ end
+ if valid then
+ ct = ct + 1
+ end
+ end
+ return ct
+end
+
+if brokenkeyboard("Hello World", {"d"}) == 1 then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+io.write(" ")
+
+if brokenkeyboard("apple banana cherry", {"a", "e"}) == 0 then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+io.write(" ")
+
+if brokenkeyboard("Coding is fun", {}) == 3 then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+io.write(" ")
+
+if brokenkeyboard("The Weekly Challenge", {"a", "b"}) == 2 then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+io.write(" ")
+
+if brokenkeyboard("Perl and Python", {"p"}) == 1 then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+print("")
+
diff --git a/challenge-341/roger-bell-west/lua/ch-2.lua b/challenge-341/roger-bell-west/lua/ch-2.lua
new file mode 100755
index 0000000000..3c031d8074
--- /dev/null
+++ b/challenge-341/roger-bell-west/lua/ch-2.lua
@@ -0,0 +1,79 @@
+#! /usr/bin/lua
+
+function split(t)
+ local cl = {}
+ string.gsub(t,
+ "(.)",
+ function(c)
+ table.insert(cl, c)
+ end
+ )
+ return cl
+end
+
+function join(t)
+ local out=""
+ for i, v in ipairs(t) do
+ out = out .. v
+ end
+ return out
+end
+
+function deepcopy(src)
+ local dst = {}
+ for k, v in pairs(src) do
+ if type(v) == "table" then
+ v = deepcopy(v)
+ end
+ dst[k] = v
+ end
+ return dst
+end
+
+function reverseprefix(a, b)
+ local c = split(a)
+ local p = string.find(a, b)
+ if p ~= nil then
+ local jr = deepcopy(c)
+ for i = 1, p do
+ c[p + 1 - i] = jr[i]
+ end
+ end
+ return join(c)
+end
+
+if reverseprefix("programming", "g") == "gorpramming" then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+io.write(" ")
+
+if reverseprefix("hello", "h") == "hello" then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+io.write(" ")
+
+if reverseprefix("abcdefghij", "h") == "hgfedcbaij" then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+io.write(" ")
+
+if reverseprefix("reverse", "s") == "srevere" then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+io.write(" ")
+
+if reverseprefix("perl", "r") == "repl" then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+print("")
+
diff --git a/challenge-341/roger-bell-west/perl/ch-1.pl b/challenge-341/roger-bell-west/perl/ch-1.pl
new file mode 100755
index 0000000000..e0aa74cce2
--- /dev/null
+++ b/challenge-341/roger-bell-west/perl/ch-1.pl
@@ -0,0 +1,32 @@
+#! /usr/bin/perl
+
+use strict;
+use warnings;
+use experimental 'signatures';
+
+use Test::More tests => 5;
+
+is(brokenkeyboard('Hello World', ['d']), 1, 'example 1');
+is(brokenkeyboard('apple banana cherry', ['a', 'e']), 0, 'example 2');
+is(brokenkeyboard('Coding is fun', []), 3, 'example 3');
+is(brokenkeyboard('The Weekly Challenge', ['a', 'b']), 2, 'example 4');
+is(brokenkeyboard('Perl and Python', ['p']), 1, 'example 5');
+
+sub brokenkeyboard($a, $b) {
+ my %bk;
+ foreach my $ch (@{$b}) {
+ $bk{lc($ch)} = 1;
+ }
+ my $ct = 0;
+ foreach my $w (split ' ', $a) {
+ my %nk;
+ foreach my $ch (split '', lc($w)) {
+ $nk{$ch} = 1;
+ }
+ my @intersect = grep {exists $nk{$_}} keys %bk;
+ if (scalar @intersect == 0) {
+ $ct += 1;
+ }
+ }
+ $ct;
+}
diff --git a/challenge-341/roger-bell-west/perl/ch-2.pl b/challenge-341/roger-bell-west/perl/ch-2.pl
new file mode 100755
index 0000000000..013fc1ca47
--- /dev/null
+++ b/challenge-341/roger-bell-west/perl/ch-2.pl
@@ -0,0 +1,24 @@
+#! /usr/bin/perl
+
+use strict;
+use warnings;
+use experimental 'signatures';
+
+use Test::More tests => 5;
+
+is(reverseprefix('programming', 'g'), 'gorpramming', 'example 1');
+is(reverseprefix('hello', 'h'), 'hello', 'example 2');
+is(reverseprefix('abcdefghij', 'h'), 'hgfedcbaij', 'example 3');
+is(reverseprefix('reverse', 's'), 'srevere', 'example 4');
+is(reverseprefix('perl', 'r'), 'repl', 'example 5');
+
+sub reverseprefix($a, $f) {
+ my @c = split '', $a;
+ my $p = index($a, $f);
+ if ( $p > -1 ) {
+ my @jr = @c[0 .. $p];
+ @jr = reverse @jr;
+ splice @c, 0, $p + 1, @jr;
+ }
+ join('', @c);
+}
diff --git a/challenge-341/roger-bell-west/postscript/ch-1.ps b/challenge-341/roger-bell-west/postscript/ch-1.ps
new file mode 100644
index 0000000000..bb9cdf01da
--- /dev/null
+++ b/challenge-341/roger-bell-west/postscript/ch-1.ps
@@ -0,0 +1,153 @@
+%!PS
+
+% begin included library code
+% see https://codeberg.org/Firedrake/postscript-libraries/
+/strsplit % (ajbjc) (j) -> [ (a) (b) (c) ]
+{
+ 1 dict begin
+ /sep exch def
+ [ exch
+ {
+ dup length 0 eq {
+ pop
+ exit
+ } {
+ sep search {
+ exch pop
+ dup length 0 eq {
+ pop
+ } {
+ exch
+ } ifelse
+ } {
+ ()
+ } ifelse
+ } ifelse
+ } loop
+ ]
+ end
+} bind def
+
+/test.start {
+ print (:) print
+ /test.pass 0 def
+ /test.count 0 def
+} bind def
+
+/toset { % array -> dict of (value, true)
+ << exch
+ {
+ true
+ } forall
+ >>
+} bind def
+
+/tolower {
+ s2a
+ [ exch
+ {
+ dup dup 65 ge exch 90 le and {
+ 32 add
+ } if
+ } forall
+ ] a2s
+} 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
+
+/a2s {
+ 2 dict begin
+ /i exch def
+ i length dup string /o exch def
+ 1 sub 0 exch 1 exch {
+ dup i 3 -1 roll get o 3 1 roll put
+ } for
+ o
+ end
+} bind def
+
+/set.intersection {
+ 4 dict begin
+ /s 0 dict def
+ /b exch def
+ /a exch def
+ a keys {
+ /k exch def
+ b k known {
+ s k true put
+ } if
+ } forall
+ s
+ end
+} bind def
+
+/map { % array proc -> array
+ 2 dict begin
+ /p exch def
+ [ exch
+ {
+ p
+ } forall
+ ]
+ end
+} bind def
+
+/keys { % dict -> array of dict keys
+ [ exch
+ {
+ pop
+ } forall
+ ]
+} bind def
+
+/s2a {
+ [ exch { } forall ]
+} bind def
+
+
+
+% end included library code
+
+/brokenkeyboard {
+ 0 dict begin
+ /bk exch { tolower s2a 0 get } map toset def
+ 0 exch
+ tolower ( ) strsplit {
+ /valid true def
+ s2a toset bk set.intersection length 0 eq {
+ 1 add
+ } if
+ } forall
+ end
+} bind def
+
+(brokenkeyboard) test.start
+(Hello World) [(d)] brokenkeyboard 1 eq test
+(apple banana cherry) [(a) (e)] brokenkeyboard 0 eq test
+(Coding is fun) [] brokenkeyboard 3 eq test
+(The Weekly Challenge) [(a) (b)] brokenkeyboard 2 eq test
+(Perl and Python) [(p)] brokenkeyboard 1 eq test
+test.end
diff --git a/challenge-341/roger-bell-west/postscript/ch-2.ps b/challenge-341/roger-bell-west/postscript/ch-2.ps
new file mode 100644
index 0000000000..a87784699c
--- /dev/null
+++ b/challenge-341/roger-bell-west/postscript/ch-2.ps
@@ -0,0 +1,86 @@
+%!PS
+
+% begin included library code
+% see https://codeberg.org/Firedrake/postscript-libraries/
+/s2a {
+ [ exch { } forall ]
+} bind def
+
+/a2s {
+ 2 dict begin
+ /i exch def
+ i length dup string /o exch def
+ 1 sub 0 exch 1 exch {
+ dup i 3 -1 roll get o 3 1 roll put
+ } for
+ o
+ end
+} 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
+
+/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
+
+/reverse {
+ 1 dict begin
+ dup length /l exch def
+ [ exch
+ aload pop
+ 2 1 l {
+ -1 roll
+ } for
+ ]
+ end
+} bind def
+
+
+% end included library code
+
+/reverseprefix {
+ /f exch def
+ /a exch def
+ /c a s2a def
+ a f search {
+ length /p exch def pop pop
+ c 0 p 1 add getinterval reverse
+ c exch 0 exch putinterval
+ } {
+ pop
+ } ifelse
+ c a2s
+} bind def
+
+(reverseprefix) test.start
+(programming) (g) reverseprefix (gorpramming) eq test
+(hello) (h) reverseprefix (hello) eq test
+(abcdefghij) (h) reverseprefix (hgfedcbaij) eq test
+(reverse) (s) reverseprefix (srevere) eq test
+(perl) (r) reverseprefix (repl) eq test
+test.end
diff --git a/challenge-341/roger-bell-west/python/ch-1.py b/challenge-341/roger-bell-west/python/ch-1.py
new file mode 100755
index 0000000000..61330f6f9a
--- /dev/null
+++ b/challenge-341/roger-bell-west/python/ch-1.py
@@ -0,0 +1,32 @@
+#! /usr/bin/python3
+
+def brokenkeyboard(a, b):
+ bk = set([x.lower() for x in b])
+ ct = 0
+ for w in a.split(" "):
+ nk = set(w.lower())
+ inter = nk.intersection(bk)
+ if len(inter) == 0:
+ ct += 1
+ return ct
+
+import unittest
+
+class TestBrokenkeyboard(unittest.TestCase):
+
+ def test_ex1(self):
+ self.assertEqual(brokenkeyboard("Hello World", ["d"]), 1, 'example 1')
+
+ def test_ex2(self):
+ self.assertEqual(brokenkeyboard("apple banana cherry", ["a", "e"]), 0, 'example 2')
+
+ def test_ex3(self):
+ self.assertEqual(brokenkeyboard("Coding is fun", []), 3, 'example 3')
+
+ def test_ex4(self):
+ self.assertEqual(brokenkeyboard("The Weekly Challenge", ["a", "b"]), 2, 'example 4')
+
+ def test_ex5(self):
+ self.assertEqual(brokenkeyboard("Perl and Python", ["p"]), 1, 'example 5')
+
+unittest.main()
diff --git a/challenge-341/roger-bell-west/python/ch-2.py b/challenge-341/roger-bell-west/python/ch-2.py
new file mode 100755
index 0000000000..e36ec84643
--- /dev/null
+++ b/challenge-341/roger-bell-west/python/ch-2.py
@@ -0,0 +1,32 @@
+#! /usr/bin/python3
+
+def reverseprefix(a, f):
+ c = list(a)
+ p = a.find(f)
+ if p > -1:
+ jr = c[0:p + 1]
+ jr = jr[::-1]
+ for i, l in enumerate(jr):
+ c[i] = l
+ return "".join(c)
+
+import unittest
+
+class TestReverseprefix(unittest.TestCase):
+
+ def test_ex1(self):
+ self.assertEqual(reverseprefix("programming", "g"), "gorpramming", 'example 1')
+
+ def test_ex2(self):
+ self.assertEqual(reverseprefix("hello", "h"), "hello", 'example 2')
+
+ def test_ex3(self):
+ self.assertEqual(reverseprefix("abcdefghij", "h"), "hgfedcbaij", 'example 3')
+
+ def test_ex4(self):
+ self.assertEqual(reverseprefix("reverse", "s"), "srevere", 'example 4')
+
+ def test_ex5(self):
+ self.assertEqual(reverseprefix("perl", "r"), "repl", 'example 5')
+
+unittest.main()
diff --git a/challenge-341/roger-bell-west/raku/ch-1.p6 b/challenge-341/roger-bell-west/raku/ch-1.p6
new file mode 100755
index 0000000000..3b4ca5d0aa
--- /dev/null
+++ b/challenge-341/roger-bell-west/raku/ch-1.p6
@@ -0,0 +1,23 @@
+#! /usr/bin/raku
+
+use Test;
+
+plan 5;
+
+is(brokenkeyboard('Hello World', ['d']), 1, 'example 1');
+is(brokenkeyboard('apple banana cherry', ['a', 'e']), 0, 'example 2');
+is(brokenkeyboard('Coding is fun', []), 3, 'example 3');
+is(brokenkeyboard('The Weekly Challenge', ['a', 'b']), 2, 'example 4');
+is(brokenkeyboard('Perl and Python', ['p']), 1, 'example 5');
+
+sub brokenkeyboard($a, @b) {
+ my %bk = Set.new(@b.map({lc($_)}));
+ my $ct = 0;
+ for $a.split(' ') -> $w {
+ my %nk = Set.new($w.lc.comb);
+ if ((%nk (&) %bk).elems == 0) {
+ $ct += 1;
+ }
+ }
+ $ct;
+}
diff --git a/challenge-341/roger-bell-west/raku/ch-2.p6 b/challenge-341/roger-bell-west/raku/ch-2.p6
new file mode 100755
index 0000000000..f7669e5a7a
--- /dev/null
+++ b/challenge-341/roger-bell-west/raku/ch-2.p6
@@ -0,0 +1,23 @@
+#! /usr/bin/raku
+
+use Test;
+
+plan 5;
+
+is(reverseprefix('programming', 'g'), 'gorpramming', 'example 1');
+is(reverseprefix('hello', 'h'), 'hello', 'example 2');
+is(reverseprefix('abcdefghij', 'h'), 'hgfedcbaij', 'example 3');
+is(reverseprefix('reverse', 's'), 'srevere', 'example 4');
+is(reverseprefix('perl', 'r'), 'repl', 'example 5');
+
+
+sub reverseprefix($a, $f) {
+ my @c = $a.comb;
+ my $p = index($a, $f);
+ with ($p) {
+ my @jr = @c[0 .. $p];
+ @jr = @jr.reverse;
+ splice @c, 0, $p + 1, @jr;
+ }
+ join('', @c);
+}
diff --git a/challenge-341/roger-bell-west/ruby/ch-1.rb b/challenge-341/roger-bell-west/ruby/ch-1.rb
new file mode 100755
index 0000000000..6fb5548710
--- /dev/null
+++ b/challenge-341/roger-bell-west/ruby/ch-1.rb
@@ -0,0 +1,41 @@
+#! /usr/bin/ruby
+
+require 'set'
+
+def brokenkeyboard(a, b)
+ bk = Set.new(b.map{|x| x.downcase})
+ ct = 0
+ a.downcase.split(" ").each do |w|
+ nk = Set.new(w.chars)
+ if (bk & nk).length == 0
+ ct += 1
+ end
+ end
+ ct
+end
+
+require 'test/unit'
+
+class TestBrokenkeyboard < Test::Unit::TestCase
+
+ def test_ex1
+ assert_equal(1, brokenkeyboard('Hello World', ['d']))
+ end
+
+ def test_ex2
+ assert_equal(0, brokenkeyboard('apple banana cherry', ['a', 'e']))
+ end
+
+ def test_ex3
+ assert_equal(3, brokenkeyboard('Coding is fun', []))
+ end
+
+ def test_ex4
+ assert_equal(2, brokenkeyboard('The Weekly Challenge', ['a', 'b']))
+ end
+
+ def test_ex5
+ assert_equal(1, brokenkeyboard('Perl and Python', ['p']))
+ end
+
+end
diff --git a/challenge-341/roger-bell-west/ruby/ch-2.rb b/challenge-341/roger-bell-west/ruby/ch-2.rb
new file mode 100755
index 0000000000..6dd7f0df84
--- /dev/null
+++ b/challenge-341/roger-bell-west/ruby/ch-2.rb
@@ -0,0 +1,39 @@
+#! /usr/bin/ruby
+
+def reverseprefix(a, f)
+ c = a.split("")
+ p = a.index(f)
+ if p >= 0
+ jr = c.slice(0, p + 1).reverse
+ jr.each_with_index do |ch, i|
+ c[i] = ch
+ end
+ end
+ c.join("")
+end
+
+require 'test/unit'
+
+class TestReverseprefix < Test::Unit::TestCase
+
+ def test_ex1
+ assert_equal('gorpramming', reverseprefix('programming', 'g'))
+ end
+
+ def test_ex2
+ assert_equal('hello', reverseprefix('hello', 'h'))
+ end
+
+ def test_ex3
+ assert_equal('hgfedcbaij', reverseprefix('abcdefghij', 'h'))
+ end
+
+ def test_ex4
+ assert_equal('srevere', reverseprefix('reverse', 's'))
+ end
+