From 040328d0b0e2e528e06ba9e7f49cbaa38697ff9e Mon Sep 17 00:00:00 2001 From: 冯昶 Date: Sat, 20 Jul 2019 19:55:56 +0800 Subject: challenge 017 --- challenge-017/feng-chang/perl5/ch-1.pl | 27 +++++++++++++++++ challenge-017/feng-chang/perl5/ch-2.pl | 36 +++++++++++++++++++++++ challenge-017/feng-chang/perl6/ch-1.p6 | 22 ++++++++++++++ challenge-017/feng-chang/perl6/ch-2.p6 | 53 ++++++++++++++++++++++++++++++++++ 4 files changed, 138 insertions(+) create mode 100755 challenge-017/feng-chang/perl5/ch-1.pl create mode 100755 challenge-017/feng-chang/perl5/ch-2.pl create mode 100755 challenge-017/feng-chang/perl6/ch-1.p6 create mode 100755 challenge-017/feng-chang/perl6/ch-2.p6 diff --git a/challenge-017/feng-chang/perl5/ch-1.pl b/challenge-017/feng-chang/perl5/ch-1.pl new file mode 100755 index 0000000000..560139c16e --- /dev/null +++ b/challenge-017/feng-chang/perl5/ch-1.pl @@ -0,0 +1,27 @@ +#!/bin/env perl + +use Modern::Perl; + +say "A(0,$_) ", A(0, $_) for 0..9; +say "A(1,$_) ", A(1, $_) for 0..9; +say "A(2,$_) ", A(2, $_) for 0..9; +say "A(3,$_) ", A(3, $_) for 0..9; + +my @pool; + +sub A { + my ($m, $n) = @_; + die "parameter less than 0\n" if $m < 0 or $n < 0; + + return $pool[$m][$n] if defined $pool[$m][$n]; + + if ($m == 0) { + $pool[0][$n] = $n + 1; + } elsif ($n == 0) { + $pool[$m][0] = A($m - 1, 1); + } else { + $pool[$m][$n] = A($m - 1, A($m, $n - 1)); + } + + return $pool[$m][$n]; +} diff --git a/challenge-017/feng-chang/perl5/ch-2.pl b/challenge-017/feng-chang/perl5/ch-2.pl new file mode 100755 index 0000000000..a1f542e831 --- /dev/null +++ b/challenge-017/feng-chang/perl5/ch-2.pl @@ -0,0 +1,36 @@ +#!/bin/env perl + +use Modern::Perl; + +my $s = 'jdbc:mysql://user:password@localhost:3306/pwc?profile=true#h1'; + +# scheme:[//[userinfo@]host[:port]]path[?query][#fragment] +# e.g.: jdbc:mysql://user:password@localhost:3306/pwc?profile=true#h1 +if ($s =~ m/^ + (? [a-zA-Z][-+.a-zA-Z0-9]* (?: : [a-zA-Z][-+.a-zA-Z0-9]*)? ) + : (?: \/\/ + (?: + (? + (? [a-z][-+.a-zA-Z0-9]*) : + (? [-+.a-zA-Z0-9]*) + ) + @ + )? + (? [a-zA-Z0-9][-+.a-zA-Z0-9]*) + (?: : (? \d+) )? + )? + (? \/ (?: \w+? \/? )* ) + (?: \? (? [a-zA-Z][-+.a-zA-Z0-9]* = \w+ (?: & [a-zA-Z][-+.a-zA-Z0-9]* = \w+)* ))? + (?: \# (? [a-zA-Z][-+.a-zA-Z0-9]*))? + $/x + ) { + say 'scheme: ', $+{ scheme }; + say 'userinfo: ', $+{ userinfo } if defined $+{ userinfo }; + #say ' user: ', $+{ user } if defined $+{ user }; + #say ' password: ', $+{ password } if defined $+{ password }; + say 'host: ', $+{ host } if defined $+{ host }; + say 'port: ', $+{ port } if defined $+{ port }; + say 'path: ', $+{ path }; + say 'query: ', $+{ query } if defined $+{ query }; + say 'fragment: ', $+{ fragment } if defined $+{ fragment }; +} diff --git a/challenge-017/feng-chang/perl6/ch-1.p6 b/challenge-017/feng-chang/perl6/ch-1.p6 new file mode 100755 index 0000000000..9081f56910 --- /dev/null +++ b/challenge-017/feng-chang/perl6/ch-1.p6 @@ -0,0 +1,22 @@ +#!/bin/env perl6 + +my @pool; + +say "A(0,$_) ", A(0, $_) for 0..9; +say "A(1,$_) ", A(1, $_) for 0..9; +say "A(2,$_) ", A(2, $_) for 0..9; +say "A(3,$_) ", A(3, $_) for 0..9; + +sub A(UInt $m, UInt $n) returns UInt { + return @pool[$m][$n] if @pool[$m][$n].defined; + + if $m == 0 { + @pool[0][$n] = $n + 1; + } elsif $n == 0 { + @pool[$m][0] = A($m - 1, 1); + } else { + @pool[$m][$n] = A($m - 1, A($m, $n - 1)); + } + + return @pool[$m][$n]; +} diff --git a/challenge-017/feng-chang/perl6/ch-2.p6 b/challenge-017/feng-chang/perl6/ch-2.p6 new file mode 100755 index 0000000000..e9c140a149 --- /dev/null +++ b/challenge-017/feng-chang/perl6/ch-2.p6 @@ -0,0 +1,53 @@ +#!/bin/env perl6 + +# scheme:[//[userinfo@]host[:port]]path[?query][#fragment] +grammar URL { + token TOP { ^ + ':' + [ '//' + [ '@' ]? + + [ ':' ]? + ]? + + [ '?' ]? + [ '#' ]? + $ } + + token scheme { } + + token userinfo { [ ':' ]? } + token user { } + token password { \w+ } + + token host { [ | ] } + token IPv4-address { [\d ** 1..3] ** 4 % '.' } + token dname { <[a..zA..Z]> <[-a..zA..Z0..9]>* } + token domain-name { + % '.' } + + token port { \d+ } + + token path { '/' [<[a..zA..Z0..9]>+] *%% '/' } + + token key { } + token value { \w+ } + token query { '=' } + token queries { +% '&' } + + token fragment { } + + token id { <[a..zA..Z]> <[-+.a..zA..Z0..9]>* } +} + +sub MAIN(Str $url = 'jdbc://user:password@localhost:3306/pwc?profile=true#h1') { + my $m = URL.parse($url); + if $m { + say 'scheme: ', ~$m; + say 'userinfo: ', ~$m if $m; + say 'host: ', ~$m if $m; + say 'port: ', ~$m if $m; + say 'path: ', ~$m; + say 'query: ', ~$m if $m; + say 'fragment: ', ~$m if $m; + } +} -- cgit