From ccfa09d13e484e4bc7239419af7bfa6d674c53f4 Mon Sep 17 00:00:00 2001 From: Mohammad S Anwar Date: Sun, 13 Oct 2019 22:36:12 +0100 Subject: - Renamed solutions by Markus Holzer. --- challenge-029/markus-holzer/perl6/ch-1.p6 | 89 ++++++++++++++++++++++++++++++ challenge-029/markus-holzer/perl6/ch-1.pl6 | 89 ------------------------------ challenge-029/markus-holzer/perl6/ch-2.p6 | 20 +++++++ challenge-029/markus-holzer/perl6/ch-2.pl6 | 20 ------- 4 files changed, 109 insertions(+), 109 deletions(-) create mode 100644 challenge-029/markus-holzer/perl6/ch-1.p6 delete mode 100644 challenge-029/markus-holzer/perl6/ch-1.pl6 create mode 100644 challenge-029/markus-holzer/perl6/ch-2.p6 delete mode 100644 challenge-029/markus-holzer/perl6/ch-2.pl6 diff --git a/challenge-029/markus-holzer/perl6/ch-1.p6 b/challenge-029/markus-holzer/perl6/ch-1.p6 new file mode 100644 index 0000000000..f979619a00 --- /dev/null +++ b/challenge-029/markus-holzer/perl6/ch-1.p6 @@ -0,0 +1,89 @@ +use Test; +use Data::Dump; + +my %tests = + + #well-formed + 'A{1..3}' => ["A1", "A2", "A3"], + 'B{1..6..2}' => ["B1", "B3", "B5"], + 'B{6..2..2}' => ["B6", "B4", "B2"], + 'B{6..2..-2}' => ["B6", "B4", "B2"], + 'C{a..c}' => ["Ca", "Cb", "Cc"], + 'C{c..a}' => ["Cc", "Cb", "Ca"], + 'D{a..f..2}' => ["Da", "Dc", "De"], + 'D{f..a..2}' => ["Df", "Dd", "Db"], + 'D{f..a..-2}' => ["Df", "Dd", "Db"], + 'E{1,2}' => ["E1", "E2"], + 'F{1,2,3}' => ["F1", "F2", "F3"], + + #malformed + 'A{a..c..d}' => ['A{a..c..d}'], + + #nested + 'Ba..z..{1,2,3}' => ["Ba..z..1", "Ba..z..2", "Ba..z..3"], + 'C{a,b,{1,2,3}}' => ["Ca", "Cb", "C1", "C2", "C3"], + + #multiple + '{a..b}X{1,2}' => ["aX1", "bX1", "aX2", "bX2"]; + +for %tests.kv -> $test, $expected +{ + is-deeply( brace-expand( $test ).Array, $expected, $test ); +} + +grammar BraceExpansion +{ + regex TOP { [ | ] } + regex start-txt { .* || ]> } + regex end-txt { *? } + regex save-char { <-[ \" \& \( \) \` \' \; \< \> \| \{ \} ]> } + regex list-element { | <-[ \" \! \$ \& \( \) \` \' \; \< \> \|]> } + regex a-to-z { <[ a..z A..Z ]> } + regex num { \-? <[ 0..9 ]>+ } + regex range { | } + regex num-range { \{ \. \. [ \. \. ]? \} } + regex alpha-range { \{ \. \. [ \. \. ]? \} } + regex list { \{ + % ',' \} } +} + + +sub num-range( $match ) +{ + my @num = |$match.list>>.Int; + my @range = @num[0] ... @num[1]; + my $steps = ( @num[2] // 1 ).abs; + @range.batch( $steps )>>.[0]; +} + + +sub alpha-range( $match ) +{ + my @num = |$match.list>>.Str; + my @range = @num[0] ... @num[1]; + my $steps = ( $match // 1 ).abs; + @range.batch($steps)>>.[0]; +} + +sub list( $match ) +{ + $match.list>>.Str; +} + +sub brace-expand( $str ) +{ + my $match = BraceExpansion.parse( $str ); + + my @alternatives = + $match ?? num-range( $match ) !! + $match ?? alpha-range( $match ) !! + $match ?? list( $match ) !! + (); + + return $str + unless @alternatives; + + @alternatives + .map( -> $element { $match.Str ~ $element ~ $match.Str } ) + .map( -> $result { |brace-expand( $result ) } ) + ; +} \ No newline at end of file diff --git a/challenge-029/markus-holzer/perl6/ch-1.pl6 b/challenge-029/markus-holzer/perl6/ch-1.pl6 deleted file mode 100644 index f979619a00..0000000000 --- a/challenge-029/markus-holzer/perl6/ch-1.pl6 +++ /dev/null @@ -1,89 +0,0 @@ -use Test; -use Data::Dump; - -my %tests = - - #well-formed - 'A{1..3}' => ["A1", "A2", "A3"], - 'B{1..6..2}' => ["B1", "B3", "B5"], - 'B{6..2..2}' => ["B6", "B4", "B2"], - 'B{6..2..-2}' => ["B6", "B4", "B2"], - 'C{a..c}' => ["Ca", "Cb", "Cc"], - 'C{c..a}' => ["Cc", "Cb", "Ca"], - 'D{a..f..2}' => ["Da", "Dc", "De"], - 'D{f..a..2}' => ["Df", "Dd", "Db"], - 'D{f..a..-2}' => ["Df", "Dd", "Db"], - 'E{1,2}' => ["E1", "E2"], - 'F{1,2,3}' => ["F1", "F2", "F3"], - - #malformed - 'A{a..c..d}' => ['A{a..c..d}'], - - #nested - 'Ba..z..{1,2,3}' => ["Ba..z..1", "Ba..z..2", "Ba..z..3"], - 'C{a,b,{1,2,3}}' => ["Ca", "Cb", "C1", "C2", "C3"], - - #multiple - '{a..b}X{1,2}' => ["aX1", "bX1", "aX2", "bX2"]; - -for %tests.kv -> $test, $expected -{ - is-deeply( brace-expand( $test ).Array, $expected, $test ); -} - -grammar BraceExpansion -{ - regex TOP { [ | ] } - regex start-txt { .* || ]> } - regex end-txt { *? } - regex save-char { <-[ \" \& \( \) \` \' \; \< \> \| \{ \} ]> } - regex list-element { | <-[ \" \! \$ \& \( \) \` \' \; \< \> \|]> } - regex a-to-z { <[ a..z A..Z ]> } - regex num { \-? <[ 0..9 ]>+ } - regex range { | } - regex num-range { \{ \. \. [ \. \. ]? \} } - regex alpha-range { \{ \. \. [ \. \. ]? \} } - regex list { \{ + % ',' \} } -} - - -sub num-range( $match ) -{ - my @num = |$match.list>>.Int; - my @range = @num[0] ... @num[1]; - my $steps = ( @num[2] // 1 ).abs; - @range.batch( $steps )>>.[0]; -} - - -sub alpha-range( $match ) -{ - my @num = |$match.list>>.Str; - my @range = @num[0] ... @num[1]; - my $steps = ( $match // 1 ).abs; - @range.batch($steps)>>.[0]; -} - -sub list( $match ) -{ - $match.list>>.Str; -} - -sub brace-expand( $str ) -{ - my $match = BraceExpansion.parse( $str ); - - my @alternatives = - $match ?? num-range( $match ) !! - $match ?? alpha-range( $match ) !! - $match ?? list( $match ) !! - (); - - return $str - unless @alternatives; - - @alternatives - .map( -> $element { $match.Str ~ $element ~ $match.Str } ) - .map( -> $result { |brace-expand( $result ) } ) - ; -} \ No newline at end of file diff --git a/challenge-029/markus-holzer/perl6/ch-2.p6 b/challenge-029/markus-holzer/perl6/ch-2.p6 new file mode 100644 index 0000000000..18ebced54f --- /dev/null +++ b/challenge-029/markus-holzer/perl6/ch-2.p6 @@ -0,0 +1,20 @@ +use NativeCall; + +constant WCHAR = uint16; +constant INT = int32; +constant UINT = uint32; +constant HANDLE = Pointer[void]; +constant LPWCTSTR = CArray[WCHAR]; +constant MB_ICONEXCLAMATION = 0x00000030; + +sub MessageBoxW( HANDLE, LPWCTSTR, LPWCTSTR, UINT ) is native('user32') returns INT { * }; + +MessageBoxW( my $handle, to-c-str("Raku is awesome"), to-c-str("Hello World"), MB_ICONEXCLAMATION ); + +sub to-c-str( Str $str ) returns CArray[WCHAR] +{ + my @str := CArray[WCHAR].new; + for ( $str.comb ).kv -> $i, $char { @str[$i] = $char.ord; } + @str[ $str.chars ] = 0; + @str; +} diff --git a/challenge-029/markus-holzer/perl6/ch-2.pl6 b/challenge-029/markus-holzer/perl6/ch-2.pl6 deleted file mode 100644 index 18ebced54f..0000000000 --- a/challenge-029/markus-holzer/perl6/ch-2.pl6 +++ /dev/null @@ -1,20 +0,0 @@ -use NativeCall; - -constant WCHAR = uint16; -constant INT = int32; -constant UINT = uint32; -constant HANDLE = Pointer[void]; -constant LPWCTSTR = CArray[WCHAR]; -constant MB_ICONEXCLAMATION = 0x00000030; - -sub MessageBoxW( HANDLE, LPWCTSTR, LPWCTSTR, UINT ) is native('user32') returns INT { * }; - -MessageBoxW( my $handle, to-c-str("Raku is awesome"), to-c-str("Hello World"), MB_ICONEXCLAMATION ); - -sub to-c-str( Str $str ) returns CArray[WCHAR] -{ - my @str := CArray[WCHAR].new; - for ( $str.comb ).kv -> $i, $char { @str[$i] = $char.ord; } - @str[ $str.chars ] = 0; - @str; -} -- cgit