aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2019-07-21 23:25:07 +0100
committerGitHub <noreply@github.com>2019-07-21 23:25:07 +0100
commit89e883cd26f284393fd30ebb133f3b3caab5343f (patch)
treed1ea792c88e710537cffe5c9d26dfeeaeec93854
parentaa8ae1dbba6a8e9560e2919a99b974d9b97380c2 (diff)
parentc55aa437564ab66881ba12ab9240d1c434ddd55d (diff)
downloadperlweeklychallenge-club-89e883cd26f284393fd30ebb133f3b3caab5343f.tar.gz
perlweeklychallenge-club-89e883cd26f284393fd30ebb133f3b3caab5343f.tar.bz2
perlweeklychallenge-club-89e883cd26f284393fd30ebb133f3b3caab5343f.zip
Merge pull request #411 from jaldhar/challenge-017
Challenge 17 by Jaldhar H. Vyas
-rw-r--r--challenge-017/jaldhar-h-vyas/blog.txt1
-rwxr-xr-xchallenge-017/jaldhar-h-vyas/perl5/ch-1.pl24
-rwxr-xr-xchallenge-017/jaldhar-h-vyas/perl5/ch-2.pl39
-rwxr-xr-xchallenge-017/jaldhar-h-vyas/perl5/ch-3.pl272
-rwxr-xr-xchallenge-017/jaldhar-h-vyas/perl6/ch-1.p624
-rwxr-xr-xchallenge-017/jaldhar-h-vyas/perl6/ch-2.p672
6 files changed, 432 insertions, 0 deletions
diff --git a/challenge-017/jaldhar-h-vyas/blog.txt b/challenge-017/jaldhar-h-vyas/blog.txt
new file mode 100644
index 0000000000..7a3401fdd9
--- /dev/null
+++ b/challenge-017/jaldhar-h-vyas/blog.txt
@@ -0,0 +1 @@
+https://www.braincells.com/perl/2019/07/perl_weekly_challenge_week_17.html
diff --git a/challenge-017/jaldhar-h-vyas/perl5/ch-1.pl b/challenge-017/jaldhar-h-vyas/perl5/ch-1.pl
new file mode 100755
index 0000000000..6fdef19af0
--- /dev/null
+++ b/challenge-017/jaldhar-h-vyas/perl5/ch-1.pl
@@ -0,0 +1,24 @@
+#!/usr/bin/perl
+use warnings;
+use strict;
+use 5.010;
+
+sub ackermann {
+ my ($m, $n) = @_;
+
+ if ($m < 0 || $n < 0) {
+ return undef;
+ }
+
+ if ($m == 0) {
+ return $n + 1;
+ }
+
+ if ($n == 0) {
+ return ackermann($m - 1, 1);
+ }
+
+ return ackermann($m - 1, ackermann($m, $n - 1));
+}
+
+say ackermann(1, 2);
diff --git a/challenge-017/jaldhar-h-vyas/perl5/ch-2.pl b/challenge-017/jaldhar-h-vyas/perl5/ch-2.pl
new file mode 100755
index 0000000000..ad42d12a70
--- /dev/null
+++ b/challenge-017/jaldhar-h-vyas/perl5/ch-2.pl
@@ -0,0 +1,39 @@
+#!/usr/bin/perl
+use warnings;
+use strict;
+use 5.010;
+
+my $dec_octet = qr / \d | [1-9]\d | 1\d\d | 2[0-4]\d | 25[0-5] /x;
+my $hex_octet = qr / [ 0-9 A-F a-f ]{2} /x;
+my $pct_encoded = qr/ % $hex_octet /x;
+my $sub_delim = qr/ [ ! $ & ' ( ) * + , ; = ] /x;
+my $scheme = qr/ [ A-Z a-z 0-9 + - . ] /x;
+my $unreserved = qr/ [ A-Z a-z 0-9 - . _ ~ ] /x;
+
+my $ipv4 = qr/$dec_octet \. $dec_octet \. $dec_octet \. $dec_octet /x;
+my $userinfo = qr/ $unreserved | $pct_encoded | $sub_delim | : /x;
+my $pchar = qr/ $userinfo | @ /x;
+my $path = qr / $pchar | \/ /x;
+my $query_or_fragment = qr/ $pchar | \/ | \? /x;
+
+my $url = shift;
+
+$url =~ /
+ \A
+ (?<scheme>$scheme+)
+ :
+ (?:
+ \/\/?
+ (?: (?<userinfo> $userinfo+? ) @ )?
+ (?<host> $ipv4 | $unreserved+ )
+ (?: : (?<port> \d+ ) )?
+ )?
+ (?<path> $path+ )?
+ (?: \? (?<query> $query_or_fragment+ ) )?
+ (?: \# (?<fragment> $query_or_fragment+ ) )?
+ # \z
+/msx;
+
+for my $part (qw/ scheme userinfo host port path query fragment /) {
+ say "$part: ", $+{$part} // q{};
+}
diff --git a/challenge-017/jaldhar-h-vyas/perl5/ch-3.pl b/challenge-017/jaldhar-h-vyas/perl5/ch-3.pl
new file mode 100755
index 0000000000..dc567b3dc1
--- /dev/null
+++ b/challenge-017/jaldhar-h-vyas/perl5/ch-3.pl
@@ -0,0 +1,272 @@
+#!/usr/bin/perl
+
+# A properly modularized version of this script will be uploaded to CPAN soon.
+
+package WWW::Bhagavadgita::Chapter;
+
+use Moo;
+use namespace::clean;
+
+has [qw/
+ chapter_number
+ chapter_summary
+ name
+ name_meaning
+ name_translation
+ name_transliterated
+ verses_count
+ /] => (
+ is => 'ro',
+ required => 1
+);
+
+1; # End of WWW::Bhagavadgita::Chapter
+
+package WWW::Bhagavadgita::Verse;
+
+use Moo;
+use namespace::clean;
+
+has [qw/
+ meaning
+ text
+ transliteration
+ verse_number
+ word_meanings
+ /] => (
+ is => 'ro',
+ required => 1
+);
+
+1; # End of WWW::Bhagavadgita::Verse
+
+package WWW::Bhagavadgita;
+
+use Moo;
+use HTTP::Request::Common qw/ GET POST /;
+use JSON qw/ decode_json /;
+use LWP::UserAgent;
+use WWW::Bhagavadgita::Chapter;
+use WWW::Bhagavadgita::Verse;
+use utf8;
+use namespace::clean;
+
+has [qw/ client_id client_secret /] => (
+ is => 'ro',
+ required => 1
+);
+
+has token => (
+ is => 'rw',
+);
+
+has ua => (
+ is => 'lazy',
+);
+
+sub _build_ua {
+ my ($self) = @_;
+
+ my $ua = LWP::UserAgent->new(
+ # bhagavadgita.io blocks user agents it doesn't recognize so let's
+ # pretend to be cUrl.
+ agent => "curl/7.58.0",
+ );
+ $ua->default_header( 'Accept' => 'application/json' );
+
+ return $ua;
+}
+
+sub _get_token {
+ my ($self) = @_;
+
+ my $request = POST(
+ 'https://bhagavadgita.io/auth/oauth/token',
+ [
+ client_id => $self->client_id,
+ client_secret => $self->client_secret,
+ grant_type => 'client_credentials',
+ scope => 'verse chapter',
+ ],
+ Content_Type => 'application/x-www-form-urlencoded',
+ );
+
+ my $response = $self->ua->request($request);
+ if ($response->is_success) {
+ my $results = decode_json($response->decoded_content);
+ $self->token($results->{access_token});
+ } else {
+ $self->token(undef);
+ }
+}
+
+
+sub _call {
+ my ($self, @args) = @_;
+ my $url = 'https://bhagavadgita.io/api/v1/';
+
+ if (scalar @args) {
+ $url .= join(q{/}, @args);
+
+ } else {
+ return { error => "Not enough arguments." };
+
+ }
+
+ $self->token // $self->_get_token();
+ if (!defined $self->token) {
+ return { error => "Couldn't get auth token." };
+ }
+
+ my $request = GET($url,
+ authorization => 'Bearer ' . $self->token
+ );
+
+ my $response = $self->ua->request($request);
+ if ($response->is_success) {
+ return { data => $response->decoded_content };
+ } else {
+ return { error => $response->status_line };
+ }
+
+}
+
+=head2 chapters()
+
+Get all the 18 Chapters of the Bhagavad Gita.
+
+Returns an array of L<WWW::Bhagavadgita::Chapter> objects or undef if there
+has been an error.
+
+=cut
+
+sub chapters {
+ my ($self) = @_;
+
+ my $result = $self->_call('chapters');
+
+ if (defined $result->{error}) {
+ return undef;
+ } else {
+ my @chapters;
+ for my $chapter (@{ decode_json( $result->{data} ) }) {
+ push @chapters, WWW::Bhagavadgita::Chapter->new($chapter);
+ };
+ return @chapters;
+ }
+}
+
+=head2 chapter($chapter_number)
+
+Get a specific chapter from the Bhagavad Gita.
+
+Returns a L<WWW::Bhagavadgita::Chapter> object or undef if there
+has been an error.
+
+=cut
+
+sub chapter {
+ my ($self, $chapter_number) = @_;
+
+ my $result = $self->_call('chapters', $chapter_number);
+
+ if (defined $result->{error}) {
+ return undef;
+ } else {
+ return WWW::Bhagavadgita::Chapter->new(decode_json($result->{data}));
+ }
+}
+
+=head2 verses()
+
+Get all the verses in the Bhagavad Gita.
+
+Returns an array of L<WWW::Bhagavadgita::Verse> objects or undef if there
+has been an error.
+
+=cut
+
+sub verses {
+ my ($self) = @_;
+
+ my $result = $self->_call('verses');
+
+ if (defined $result->{error}) {
+ return undef;
+ } else {
+ my @verses;
+ for my $verse (@{ decode_json( $result->{data} ) }) {
+ push @verses, WWW::Bhagavadgita::Verse->new($verse);
+ };
+ return @verses;
+ }
+}
+
+=head2 verse($chapter_number, $verse_number)
+
+Get a particular verse from a chapter.
+
+Returns a L<WWW::Bhagavadgita::Verse> object or undef if there
+has been an error.
+
+=cut
+
+sub verse {
+ my ($self, $chapter_number, $verse_number) = @_;
+
+ my $result =
+ $self->_call('chapters', $chapter_number, 'verses', $verse_number);
+
+ if (defined $result->{error}) {
+ return undef;
+ } else {
+ return WWW::Bhagavadgita::Verse->new(decode_json($result->{data}));
+ }
+}
+
+=head2 chapter_verses($chapter_number)
+
+Get all the Verses from a Chapter.
+
+Returns an array of L<WWW::Bhagavadgita::Verse> objects or undef if there
+has been an error.
+
+=cut
+
+sub chapter_verses {
+ my ($self, $chapter_number, $verse_number) = @_;
+
+ my $result =
+ $self->_call('chapters', $chapter_number, 'verses');
+
+ if (defined $result->{error}) {
+ return undef;
+ } else {
+ my @verses;
+ for my $verse (@{ decode_json( $result->{data} ) }) {
+ push @verses, WWW::Bhagavadgita::Verse->new($verse);
+ };
+ return @verses;
+ }
+}
+1; # End of WWW::Bhagavadgita
+
+package main;
+use 5.010;
+
+binmode STDOUT, ':utf8';
+
+my $bg = WWW::Bhagavadgita->new(
+ client_id => "YOUR CLIENT ID",
+ client_secret => "YOUR CLIENT SECRET"
+);
+
+for my $chapter ($bg->chapters) {
+ say $chapter->name_translation;
+}
+
+say "\n", $bg->chapter(2)->chapter_summary, "\n";
+
+say $bg->verse(18, 66)->transliteration;
+
+# etc... \ No newline at end of file
diff --git a/challenge-017/jaldhar-h-vyas/perl6/ch-1.p6 b/challenge-017/jaldhar-h-vyas/perl6/ch-1.p6
new file mode 100755
index 0000000000..e8f6a7489d
--- /dev/null
+++ b/challenge-017/jaldhar-h-vyas/perl6/ch-1.p6
@@ -0,0 +1,24 @@
+#!/usr/bin/perl6
+
+multi sub ackermann (
+ Int $m where { $m == 0 },
+ Int $n where { $n >= 0 },
+) {
+ return $n + 1;
+}
+
+multi sub ackermann (
+ Int $m where { $m >= 0 },
+ Int $n where { $n == 0 },
+) {
+ return ackermann($m - 1, 1);
+}
+
+multi sub ackermann (
+ Int $m where { $m >= 0 },
+ Int $n where { $n >= 0 },
+) {
+ return ackermann($m - 1, ackermann($m, $n - 1));
+}
+
+say ackermann(1, 2);
diff --git a/challenge-017/jaldhar-h-vyas/perl6/ch-2.p6 b/challenge-017/jaldhar-h-vyas/perl6/ch-2.p6
new file mode 100755
index 0000000000..59df443c54
--- /dev/null
+++ b/challenge-017/jaldhar-h-vyas/perl6/ch-2.p6
@@ -0,0 +1,72 @@
+#!/usr/bin/perl6
+
+grammar URL {
+ token TOP {
+ <Scheme>
+ ':'
+ [
+ '//'?
+ [ <Userinfo> '@' ]?
+ <Host>
+ [ ':' <Port> ]?
+ ]?
+ <Path>?
+ [ '?' <Query> ]?
+ [ '#' <Fragment> ]?
+ }
+
+ token Scheme { <SchemeChar>+ }
+ token Userinfo { <UserinfoChar>+ }
+ token Host { <IPv4> | <Unreserved>+ }
+ token Port { \d+ }
+ token Path { <PathChar>+ }
+ token Query { <QueryOrFragment>+ }
+ token Fragment { <QueryOrFragment>+ }
+
+ token SchemeChar { <[ A..Z a..z 0..9 + \- . ]> }
+ token DecOctet { \d | <[1..9]>\d | 1\d\d | 2<[0..4]>\d | 25<[0..5]> }
+ token HexOctet { <[ 0..9 A..F a..f ]> ** 2 }
+ token IPv4 { <DecOctet> \. <DecOctet> \. <DecOctet> \. <DecOctet> }
+ token PChar { <UserinfoChar> | '@' }
+ token PathChar { <PChar> | '/' }
+ token PctEncoded { \% <HexOctet> }
+ token QueryOrFragment { <PChar> | \/ | \? }
+ token SubDelim { <[ \! $ & \' \( \) * \+ \, \; \= ]> }
+ token Unreserved { <[ A..Z a..z 0..9 \- . _ \~ ]> }
+ token UserinfoChar { <Unreserved> | <PctEncoded> | <SubDelim> | ':' }
+}
+
+class URLAction {
+
+ method Scheme($/) {
+ say 'Scheme: ', $/.Str;
+ }
+
+ method Userinfo($/) {
+ say 'Userinfo: ', $/.Str;
+ }
+
+ method Host($/) {
+ say 'Host: ', $/.Str;
+ }
+
+ method Port($/) {
+ say 'Port: ', $/.Str;
+ }
+ method Path($/) {
+ say 'Path: ', $/.Str;
+ }
+
+ method Query($/) {
+ say 'Query: ', $/.Str;
+ }
+
+ method Fragment($/) {
+ say 'Fragment: ', $/.Str;
+ }
+
+}
+
+multi sub MAIN($url) {
+ URL.parse($url, actions => URLAction.new);
+} \ No newline at end of file