From c55aa437564ab66881ba12ab9240d1c434ddd55d Mon Sep 17 00:00:00 2001 From: "Jaldhar H. Vyas" Date: Sun, 21 Jul 2019 18:12:03 -0400 Subject: Challenge 17 by Jaldhar H. Vyas --- challenge-017/jaldhar-h-vyas/blog.txt | 1 + challenge-017/jaldhar-h-vyas/perl5/ch-1.pl | 24 +++ challenge-017/jaldhar-h-vyas/perl5/ch-2.pl | 39 +++++ challenge-017/jaldhar-h-vyas/perl5/ch-3.pl | 272 +++++++++++++++++++++++++++++ challenge-017/jaldhar-h-vyas/perl6/ch-1.p6 | 24 +++ challenge-017/jaldhar-h-vyas/perl6/ch-2.p6 | 72 ++++++++ 6 files changed, 432 insertions(+) create mode 100644 challenge-017/jaldhar-h-vyas/blog.txt create mode 100755 challenge-017/jaldhar-h-vyas/perl5/ch-1.pl create mode 100755 challenge-017/jaldhar-h-vyas/perl5/ch-2.pl create mode 100755 challenge-017/jaldhar-h-vyas/perl5/ch-3.pl create mode 100755 challenge-017/jaldhar-h-vyas/perl6/ch-1.p6 create mode 100755 challenge-017/jaldhar-h-vyas/perl6/ch-2.p6 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+) + : + (?: + \/\/? + (?: (? $userinfo+? ) @ )? + (? $ipv4 | $unreserved+ ) + (?: : (? \d+ ) )? + )? + (? $path+ )? + (?: \? (? $query_or_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 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 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 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 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 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 { + + ':' + [ + '//'? + [ '@' ]? + + [ ':' ]? + ]? + ? + [ '?' ]? + [ '#' ]? + } + + token Scheme { + } + token Userinfo { + } + token Host { | + } + token Port { \d+ } + token Path { + } + token Query { + } + token Fragment { + } + + 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 { \. \. \. } + token PChar { | '@' } + token PathChar { | '/' } + token PctEncoded { \% } + token QueryOrFragment { | \/ | \? } + token SubDelim { <[ \! $ & \' \( \) * \+ \, \; \= ]> } + token Unreserved { <[ A..Z a..z 0..9 \- . _ \~ ]> } + token UserinfoChar { | | | ':' } +} + +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 -- cgit