From 49f74fa573d3551a8b1a18ee1e89c5a99f2e50f2 Mon Sep 17 00:00:00 2001 From: Peter Campbell Smith Date: Mon, 6 Oct 2025 18:11:31 +0100 Subject: Week 342 - Fun with characters --- challenge-342/peter-campbell-smith/blog.txt | 1 + challenge-342/peter-campbell-smith/perl/ch-1.pl | 48 +++++++++++++++++++++++++ challenge-342/peter-campbell-smith/perl/ch-2.pl | 46 ++++++++++++++++++++++++ 3 files changed, 95 insertions(+) create mode 100644 challenge-342/peter-campbell-smith/blog.txt create mode 100755 challenge-342/peter-campbell-smith/perl/ch-1.pl create mode 100755 challenge-342/peter-campbell-smith/perl/ch-2.pl diff --git a/challenge-342/peter-campbell-smith/blog.txt b/challenge-342/peter-campbell-smith/blog.txt new file mode 100644 index 0000000000..9fcbd0bb93 --- /dev/null +++ b/challenge-342/peter-campbell-smith/blog.txt @@ -0,0 +1 @@ +http://ccgi.campbellsmiths.force9.co.uk/challenge/342 diff --git a/challenge-342/peter-campbell-smith/perl/ch-1.pl b/challenge-342/peter-campbell-smith/perl/ch-1.pl new file mode 100755 index 0000000000..228022e410 --- /dev/null +++ b/challenge-342/peter-campbell-smith/perl/ch-1.pl @@ -0,0 +1,48 @@ +#!/usr/bin/perl + +# Blog: http://ccgi.campbellsmiths.force9.co.uk/challenge + +use v5.26; # The Weekly Challenge - 2025-10-06 +use utf8; # Week 342 - task 1 - Balance string +use warnings; # Peter Campbell Smith +binmode STDOUT, ':utf8'; +use Encode; + +balance_string('a0b1c2'); +balance_string('abc12'); +balance_string('0a2b1c3'); +balance_string('1a23'); +balance_string('ab123'); +balance_string('theweeklychallenge987654321098765432'); +balance_string(''); +balance_string('z'); +balance_string('9'); + +sub balance_string { + + my (@symbols, @letters, @numbers, $c, $result, $diff, $paired); + + # sort string + @symbols = sort(split('', $_[0])); + @numbers = @letters = (); + + # separate numbers and letters + for $c (@symbols) { + if ($c lt 'a') { push(@numbers, $c) } + else { push(@letters, $c) } + } + + # create result + $diff = @letters - @numbers; + if (abs($diff) <= 1 and @symbols) { + $paired = $diff < 0 ? @letters : @numbers; + $result = shift(@letters) if $diff == 1; + $result .= shift(@numbers) . shift(@letters) for 1 .. $paired; + $result .= shift(@numbers) if $diff == -1; + } else { + $result = ''; + } + + say qq[\nInput: '$_[0]']; + say qq[Output: '$result']; +} diff --git a/challenge-342/peter-campbell-smith/perl/ch-2.pl b/challenge-342/peter-campbell-smith/perl/ch-2.pl new file mode 100755 index 0000000000..371d97ae43 --- /dev/null +++ b/challenge-342/peter-campbell-smith/perl/ch-2.pl @@ -0,0 +1,46 @@ +#!/usr/bin/perl + +# Blog: http://ccgi.campbellsmiths.force9.co.uk/challenge + +use v5.26; # The Weekly Challenge - 2025-10-06 +use utf8; # Week 342 - task 2 - Max score +use warnings; # Peter Campbell Smith +binmode STDOUT, ':utf8'; +use Encode; + +max_score('0011'); +max_score('0000'); +max_score('1111'); +max_score('011101'); +max_score('10'); + +my $string; +$string .= int(rand(2)) for 0..99; +max_score($string); + +sub max_score { + + my ($string, @numbers, $score, $best, $j, $explain); + + # initialise + $string = shift; + @numbers = split('', $string); + $best = -1; + + # count all the 1s + $score += $_ for @numbers; + + # move the boundary steadily right, adjusting the score + for $j (0 .. length($string) - 2) { + $score += $numbers[$j] == 1 ? -1 : 1; + + # check if this is the best + next unless $score > $best; + $best = $score; + $explain = substr($string, 0, $j + 1) . '~' . substr($string, $j + 1); + } + + # report + say qq[\nInput: '$string']; + say qq[Output: $best: $explain]; +} -- cgit