aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoger Bell_West <roger@firedrake.org>2025-07-10 11:38:49 +0100
committerRoger Bell_West <roger@firedrake.org>2025-07-10 11:38:49 +0100
commitf58411275cf5fd072541f3d2db60ef748cebe329 (patch)
treece32bafbfdfdb35e4263a9cf6f2b14c442e5a04d
parent6a1bc860b02b7d2b0b1806cb9aa6a1e00a2d966e (diff)
downloadperlweeklychallenge-club-f58411275cf5fd072541f3d2db60ef748cebe329.tar.gz
perlweeklychallenge-club-f58411275cf5fd072541f3d2db60ef748cebe329.tar.bz2
perlweeklychallenge-club-f58411275cf5fd072541f3d2db60ef748cebe329.zip
RogerBW solutions for challenge no. 329
-rwxr-xr-xchallenge-329/roger-bell-west/perl/ch-1.pl26
-rwxr-xr-xchallenge-329/roger-bell-west/perl/ch-2.pl46
-rwxr-xr-xchallenge-329/roger-bell-west/rust/ch-1.rs38
-rwxr-xr-xchallenge-329/roger-bell-west/rust/ch-2.rs44
-rw-r--r--challenge-329/roger-bell-west/tests.json32
5 files changed, 186 insertions, 0 deletions
diff --git a/challenge-329/roger-bell-west/perl/ch-1.pl b/challenge-329/roger-bell-west/perl/ch-1.pl
new file mode 100755
index 0000000000..40d882aeb5
--- /dev/null
+++ b/challenge-329/roger-bell-west/perl/ch-1.pl
@@ -0,0 +1,26 @@
+#! /usr/bin/perl
+
+use strict;
+use warnings;
+use experimental 'signatures';
+
+use Test::More tests => 3;
+
+is_deeply(counterintegers('the1weekly2challenge2'), [1, 2], 'example 1');
+is_deeply(counterintegers('go21od1lu5c7k'), [21, 1, 5, 7], 'example 2');
+is_deeply(counterintegers('4p3e2r1l'), [4, 3, 2, 1], 'example 3');
+
+sub counterintegers($a) {
+ my @numbers = grep /./, split /\D+/, $a;
+ my $i = 0;
+ my %seen;
+ while ($i < scalar @numbers) {
+ if (exists $seen{$numbers[$i]}) {
+ splice @numbers, $i, 1;
+ } else {
+ $seen{$numbers[$i]} = 1;
+ $i++;
+ }
+ }
+ \@numbers;
+}
diff --git a/challenge-329/roger-bell-west/perl/ch-2.pl b/challenge-329/roger-bell-west/perl/ch-2.pl
new file mode 100755
index 0000000000..b739bfe832
--- /dev/null
+++ b/challenge-329/roger-bell-west/perl/ch-2.pl
@@ -0,0 +1,46 @@
+#! /usr/bin/perl
+
+use strict;
+use warnings;
+use experimental 'signatures';
+
+use Test::More tests => 3;
+
+is(nicestring('YaaAho'), 'aaA', 'example 1');
+is(nicestring('Cc'), 'Cc', 'example 2');
+is(nicestring('A'), '', 'example 3');
+
+sub nicestring($a) {
+ my @c = split '', $a;
+ my $l = scalar @c;
+ for (my $sl = $l; $sl >= 2; $sl--) {
+ foreach my $start (0 .. $l - $sl) {
+ my @s = @c[$start .. $start + $sl - 1];
+ my %lower;
+ my %upper;
+ foreach my $ch (@s) {
+ if ($ch =~ /[a-z]/) {
+ $lower{$ch} = 1;
+ } elsif ($ch =~ /[A-Z]/) {
+ $upper{lc($ch)} = 1;
+ }
+ }
+ my $valid = 1;
+ foreach my $k (keys %lower) {
+ if (exists $upper{$k}) {
+ delete $upper{$k};
+ } else {
+ $valid = 0;
+ last;
+ }
+ }
+ if (scalar keys %upper != 0) {
+ $valid = 0;
+ }
+ if ($valid) {
+ return join('', @s);
+ }
+ }
+ }
+ "";
+}
diff --git a/challenge-329/roger-bell-west/rust/ch-1.rs b/challenge-329/roger-bell-west/rust/ch-1.rs
new file mode 100755
index 0000000000..3421492f84
--- /dev/null
+++ b/challenge-329/roger-bell-west/rust/ch-1.rs
@@ -0,0 +1,38 @@
+#! /bin/sh
+//usr/bin/env rustc --test $0 -o ${0}x && ./${0}x --nocapture; rm -f ${0}x ; exit
+
+use std::collections::HashSet;
+
+#[test]
+fn test_ex1() {
+ assert_eq!(counterintegers("the1weekly2challenge2"), vec![1, 2]);
+}
+
+#[test]
+fn test_ex2() {
+ assert_eq!(counterintegers("go21od1lu5c7k"), vec![21, 1, 5, 7]);
+}
+
+#[test]
+fn test_ex3() {
+ assert_eq!(counterintegers("4p3e2r1l"), vec![4, 3, 2, 1]);
+}
+
+fn counterintegers(a: &str) -> Vec<u32> {
+ let mut numbers = a
+ .split(|x: char| !(x.is_numeric()))
+ .filter(|x| *x != "")
+ .map(|x| x.parse::<u32>().unwrap())
+ .collect::<Vec<u32>>();
+ let mut i = 0;
+ let mut seen = HashSet::new();
+ while i < numbers.len() {
+ if seen.contains(&numbers[i]) {
+ numbers.splice(i..=i, []);
+ } else {
+ seen.insert(numbers[i]);
+ i += 1;
+ }
+ }
+ numbers
+}
diff --git a/challenge-329/roger-bell-west/rust/ch-2.rs b/challenge-329/roger-bell-west/rust/ch-2.rs
new file mode 100755
index 0000000000..a97e12dfd9
--- /dev/null
+++ b/challenge-329/roger-bell-west/rust/ch-2.rs
@@ -0,0 +1,44 @@
+#! /bin/sh
+//usr/bin/env rustc --test $0 -o ${0}x && ./${0}x --nocapture; rm -f ${0}x ; exit
+
+use std::collections::HashSet;
+
+#[test]
+fn test_ex1() {
+ assert_eq!(nicestring("YaaAho"), "aaA");
+}
+
+#[test]
+fn test_ex2() {
+ assert_eq!(nicestring("Cc"), "Cc");
+}
+
+#[test]
+fn test_ex3() {
+ assert_eq!(nicestring("A"), "");
+}
+
+fn nicestring(a: &str) -> String {
+ let c = a.chars().collect::<Vec<char>>();
+ let l = c.len();
+ for sl in (2..=l).rev() {
+ for start in 0..=l - sl {
+ let s = &c[start..start + sl];
+ let mut lower = HashSet::new();
+ let mut upper = HashSet::new();
+ for ch in s {
+ if ch.is_ascii_lowercase() {
+ lower.insert(ch.clone());
+ } else if ch.is_ascii_uppercase() {
+ let mut cl = ch.clone();
+ cl.make_ascii_lowercase();
+ upper.insert(cl);
+ }
+ }
+ if lower == upper {
+ return s.into_iter().collect();
+ }
+ }
+ }
+ "".to_string()
+}
diff --git a/challenge-329/roger-bell-west/tests.json b/challenge-329/roger-bell-west/tests.json
new file mode 100644
index 0000000000..477a292e75
--- /dev/null
+++ b/challenge-329/roger-bell-west/tests.json
@@ -0,0 +1,32 @@
+{
+ "ch-1" : [
+ {
+ "function" : "counterintegers",
+ "arguments" : "the1weekly2challenge2",
+ "result" : [ 1, 2 ]
+ },
+ {
+ "arguments" : "go21od1lu5c7k",
+ "result" : [ 21, 1, 5, 7 ]
+ },
+ {
+ "arguments" : "4p3e2r1l",
+ "result" : [ 4, 3, 2, 1 ]
+ }
+ ],
+ "ch-2" : [
+ {
+ "function" : "nicestring",
+ "arguments" : "YaaAho",
+ "result" : "aaA"
+ },
+ {
+ "arguments" : "Cc",
+ "result" : "Cc"
+ },
+ {
+ "arguments" : "A",
+ "result" : ""
+ }
+ ]
+}