diff options
| author | Jörg Sommrey <28217714+jo-37@users.noreply.github.com> | 2023-03-29 23:16:08 +0200 |
|---|---|---|
| committer | Jörg Sommrey <28217714+jo-37@users.noreply.github.com> | 2023-04-19 18:48:47 +0200 |
| commit | 09b2eb8e9e0ba34dd5f3fa48882c6268855b8a78 (patch) | |
| tree | b20fa015559c571e7bd3087b2bb52637ab0701e6 /challenge-042 | |
| parent | c92401f4203b3af0c44e0fe507f65fafa57fae37 (diff) | |
| download | perlweeklychallenge-club-09b2eb8e9e0ba34dd5f3fa48882c6268855b8a78.tar.gz perlweeklychallenge-club-09b2eb8e9e0ba34dd5f3fa48882c6268855b8a78.tar.bz2 perlweeklychallenge-club-09b2eb8e9e0ba34dd5f3fa48882c6268855b8a78.zip | |
Challenge 042 task 2
Diffstat (limited to 'challenge-042')
| -rwxr-xr-x | challenge-042/jo-37/perl/ch-2.pl | 48 |
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; +} |
