From 12f235597417a6d1853624e20d9dfda9ea9d8616 Mon Sep 17 00:00:00 2001 From: Ruben Westerberg Date: Sun, 13 Oct 2019 16:53:33 +1000 Subject: Added ch-1.pl --- challenge-029/ruben-westerberg/README | 12 ++++++-- challenge-029/ruben-westerberg/perl5/ch-1.pl | 41 ++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 2 deletions(-) create mode 100755 challenge-029/ruben-westerberg/perl5/ch-1.pl diff --git a/challenge-029/ruben-westerberg/README b/challenge-029/ruben-westerberg/README index aa0fd9c8d2..52b861edc1 100644 --- a/challenge-029/ruben-westerberg/README +++ b/challenge-029/ruben-westerberg/README @@ -2,9 +2,17 @@ Solution by Ruben Westerberg ch-1.pl and ch-1.p6 === -Run the program with command line arguments representing file names. The extension of the file name is matched against known file types. +Run the program with commanline arguments enclosed in single quotes to prevent the shell from performing its own brace expansion. This will to multiple levels of expension and generate all combinations; + eg + ./ch-1.pl '{Bob,Tim} say hello to {Mary,Rose}' + + this will ouput 4 lines + Bob say hellow to Mary + Bob say hellow to Rose + Tim say hellow to Mary + Tim say hellow to Rose + ch-2.pl and ch-2.p6 === -Run the program to show a simple digital clock diff --git a/challenge-029/ruben-westerberg/perl5/ch-1.pl b/challenge-029/ruben-westerberg/perl5/ch-1.pl new file mode 100755 index 0000000000..9e5631577f --- /dev/null +++ b/challenge-029/ruben-westerberg/perl5/ch-1.pl @@ -0,0 +1,41 @@ +#!/usr/bin/env perl +use warnings; +use strict; +use v5.26; + +$_=join " ", @ARGV; + +my @positions; +my @entries; + +#Match multiple brace expansions in a single string +while (/{[^}]*}/g) { + push @positions,[$-[0], $+[0]]; + push @entries, [ split /[{},]/, substr $_, $-[0]+1,$+[0]-$-[0]-1]; +} + +print expand($_,[],\@entries, \@positions); + +sub expand { + my @results; + my ($line,$stack,$entries,$positions)=@_; + if (@$stack == @$entries) { + my $l=$line; + my $offset=0; + for (0..@$stack-1) { + substr $l, $$positions[$_]->[0]+$offset, $$positions[$_]->[1]-$$positions[$_]->[0], $$stack[$_]; + $offset+=($$positions[$_]->[0]-$$positions[$_]->[1]) +length $$stack[$_]; + } + return $l."\n"; + } + else { + my @s; + my $e= $$entries[@$stack]; + for (0..@$e-1) { + @s=(@$stack, $$e[$_]); + push @results, expand($line,\@s,$entries,$positions); + } + return @results; + } +} + -- cgit From dcf2ec43cf070c20ad9a0baf26c626b94fc2061e Mon Sep 17 00:00:00 2001 From: Ruben Westerberg Date: Sun, 13 Oct 2019 22:41:00 +1000 Subject: Added ch-1.p6 --- challenge-029/ruben-westerberg/perl6/ch-1.p6 | 30 ++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100755 challenge-029/ruben-westerberg/perl6/ch-1.p6 diff --git a/challenge-029/ruben-westerberg/perl6/ch-1.p6 b/challenge-029/ruben-westerberg/perl6/ch-1.p6 new file mode 100755 index 0000000000..a5c161bec4 --- /dev/null +++ b/challenge-029/ruben-westerberg/perl6/ch-1.p6 @@ -0,0 +1,30 @@ +#!/usr/bin/env perl6 + +$_= @*ARGS.join(" "); +my $matches=m:g/\{.*?\}/; +my @entries; +@entries.push: [.Str.split: /<[\{\}\,]>/, :skip-empty] for $matches.list; + +expand($_,[],@entries,$matches.list).map(*.say); + +sub expand($line,@stack,@entries, @positions) { + my @results; + if (@stack == @entries ) { + my $l=$line; + my $offset=0; + for @stack.keys { + $l.substr-rw(@positions[$_].from-$offset, @positions[$_].chars)=@stack[$_]; + $offset+=@positions[$_].chars-@stack[$_].chars; + } + return ($l,); + } + else { + my @s; + my @e=|@entries[@stack.elems]; + for @e { + @s= (|@stack[], |$_); + @results.push( |expand($line, @s,@entries, @positions)); + } + return @results; + } +} -- cgit From bce9e84105a83f6ddec3f9b98365a69c0339fbc9 Mon Sep 17 00:00:00 2001 From: Ruben Westerberg Date: Sun, 13 Oct 2019 23:21:37 +1000 Subject: Added ch-2.p6 --- challenge-029/ruben-westerberg/perl6/ch-2.p6 | 5 +++++ 1 file changed, 5 insertions(+) create mode 100755 challenge-029/ruben-westerberg/perl6/ch-2.p6 diff --git a/challenge-029/ruben-westerberg/perl6/ch-2.p6 b/challenge-029/ruben-westerberg/perl6/ch-2.p6 new file mode 100755 index 0000000000..6340f809e9 --- /dev/null +++ b/challenge-029/ruben-westerberg/perl6/ch-2.p6 @@ -0,0 +1,5 @@ +#!/usr/bin/env perl6 + +use NativeCall; +sub getuid() returns uint32 is native { * }; +put getuid; -- cgit From c65eeecf854439cf46f363ef7df01a275432dfb7 Mon Sep 17 00:00:00 2001 From: Ruben Westerberg Date: Mon, 14 Oct 2019 05:28:21 +1000 Subject: Added ch-2.pl --- challenge-029/ruben-westerberg/README | 2 +- challenge-029/ruben-westerberg/perl5/ch-2.pl | 13 +++++++++++++ challenge-029/ruben-westerberg/perl6/ch-2.p6 | 2 +- 3 files changed, 15 insertions(+), 2 deletions(-) create mode 100755 challenge-029/ruben-westerberg/perl5/ch-2.pl diff --git a/challenge-029/ruben-westerberg/README b/challenge-029/ruben-westerberg/README index 52b861edc1..e6f292a7cb 100644 --- a/challenge-029/ruben-westerberg/README +++ b/challenge-029/ruben-westerberg/README @@ -15,4 +15,4 @@ Run the program with commanline arguments enclosed in single quotes to prevent t ch-2.pl and ch-2.p6 === - +Run the program to demonstrate calling a C function diff --git a/challenge-029/ruben-westerberg/perl5/ch-2.pl b/challenge-029/ruben-westerberg/perl5/ch-2.pl new file mode 100755 index 0000000000..3694d1ae5f --- /dev/null +++ b/challenge-029/ruben-westerberg/perl5/ch-2.pl @@ -0,0 +1,13 @@ +#!/usr/bin/env perl +use warnings; +use strict; + +use Inline C => <<'__END__'; + +int wgetuid() { + return getuid(); +} +__END__ + +print "User ID: ".wgetuid()."\n"; + diff --git a/challenge-029/ruben-westerberg/perl6/ch-2.p6 b/challenge-029/ruben-westerberg/perl6/ch-2.p6 index 6340f809e9..3362743b22 100755 --- a/challenge-029/ruben-westerberg/perl6/ch-2.p6 +++ b/challenge-029/ruben-westerberg/perl6/ch-2.p6 @@ -2,4 +2,4 @@ use NativeCall; sub getuid() returns uint32 is native { * }; -put getuid; +put "User ID: "~getuid; -- cgit