diff options
| author | Roger Bell_West <roger@firedrake.org> | 2025-07-10 11:38:49 +0100 |
|---|---|---|
| committer | Roger Bell_West <roger@firedrake.org> | 2025-07-10 11:38:49 +0100 |
| commit | f58411275cf5fd072541f3d2db60ef748cebe329 (patch) | |
| tree | ce32bafbfdfdb35e4263a9cf6f2b14c442e5a04d | |
| parent | 6a1bc860b02b7d2b0b1806cb9aa6a1e00a2d966e (diff) | |
| download | perlweeklychallenge-club-f58411275cf5fd072541f3d2db60ef748cebe329.tar.gz perlweeklychallenge-club-f58411275cf5fd072541f3d2db60ef748cebe329.tar.bz2 perlweeklychallenge-club-f58411275cf5fd072541f3d2db60ef748cebe329.zip | |
RogerBW solutions for challenge no. 329
| -rwxr-xr-x | challenge-329/roger-bell-west/perl/ch-1.pl | 26 | ||||
| -rwxr-xr-x | challenge-329/roger-bell-west/perl/ch-2.pl | 46 | ||||
| -rwxr-xr-x | challenge-329/roger-bell-west/rust/ch-1.rs | 38 | ||||
| -rwxr-xr-x | challenge-329/roger-bell-west/rust/ch-2.rs | 44 | ||||
| -rw-r--r-- | challenge-329/roger-bell-west/tests.json | 32 |
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" : "" + } + ] +} |
