aboutsummaryrefslogtreecommitdiff
path: root/challenge-042
diff options
context:
space:
mode:
authorJörg Sommrey <28217714+jo-37@users.noreply.github.com>2023-03-29 23:16:08 +0200
committerJörg Sommrey <28217714+jo-37@users.noreply.github.com>2023-04-19 18:48:47 +0200
commit09b2eb8e9e0ba34dd5f3fa48882c6268855b8a78 (patch)
treeb20fa015559c571e7bd3087b2bb52637ab0701e6 /challenge-042
parentc92401f4203b3af0c44e0fe507f65fafa57fae37 (diff)
downloadperlweeklychallenge-club-09b2eb8e9e0ba34dd5f3fa48882c6268855b8a78.tar.gz
perlweeklychallenge-club-09b2eb8e9e0ba34dd5f3fa48882c6268855b8a78.tar.bz2
perlweeklychallenge-club-09b2eb8e9e0ba34dd5f3fa48882c6268855b8a78.zip
Challenge 042 task 2
Diffstat (limited to 'challenge-042')
-rwxr-xr-xchallenge-042/jo-37/perl/ch-2.pl48
1 files changed, 48 insertions, 0 deletions
diff --git a/challenge-042/jo-37/perl/ch-2.pl b/challenge-042/jo-37/perl/ch-2.pl
new file mode 100755
index 0000000000..92b26e6fcd
--- /dev/null
+++ b/challenge-042/jo-37/perl/ch-2.pl
@@ -0,0 +1,48 @@
+#!/usr/bin/perl -s
+
+use strict;
+use warnings;
+
+use constant MAX_B => 5;
+
+die <<EOS unless @ARGV == 1;
+usage: $0 N
+
+N
+ generate N random bracket strings, each having a size of 2, 4, 6, 8
+ or 10. Then check for balanced brackets.
+
+EOS
+
+
+### Input and Output
+
+for (1 .. shift) {
+ my $brackets = gen_brackets();
+ printf "%-10s - %sOK\n", $brackets, 'NOT ' x !check_brackets($brackets);
+}
+
+
+### Implementation
+
+sub gen_brackets {
+ # Generate even sized strings only.
+ my $len = 2 * (1 + int rand MAX_B);
+ # First generate a number having the required number of bits. Then
+ # translate the bits to brackets.
+ sprintf('%0*b', $len, int rand 2 ** $len) =~ tr/01/()/r;
+}
+
+sub check_brackets {
+ shift =~ m{
+ ^ # anchor start
+ ( # capture subexpression
+ (?: # non-capturing group
+ \( # opening bracket
+ (?-1) # balanced subgroup: recursive regex
+ \) # closing bracket
+ )* # repeated bracket embraced balanced group
+ )
+ $ # anchor end
+ }x;
+}