From e8ed467d1c33495ed7827caec1821e032354eb9c Mon Sep 17 00:00:00 2001 From: Randy Lauen Date: Wed, 14 Aug 2019 23:31:29 -0500 Subject: challenge 1 in perl5 --- challenge-021/randy-lauen/perl5/ch-1.pl | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 challenge-021/randy-lauen/perl5/ch-1.pl diff --git a/challenge-021/randy-lauen/perl5/ch-1.pl b/challenge-021/randy-lauen/perl5/ch-1.pl new file mode 100644 index 0000000000..ddd6c78111 --- /dev/null +++ b/challenge-021/randy-lauen/perl5/ch-1.pl @@ -0,0 +1,32 @@ +#!/usr/bin/env perl + +use 5.020; +use strict; +use warnings; + +use Math::Big (); +use Math::NumberCruncher (); +use Math::Pari (); +use Math::Symbolic (); +use Math::AnyNum (); +use Sidef (); +use Text::Table::Tiny (); + +my @eulers = ( + [ 'Math::Big::euler', sub { Math::Big::euler(1, 47) } ], + [ 'Math::NumberCruncher::ECONST', sub { Math::NumberCruncher::ECONST( 46 ) } ], + [ 'Math::Symbolic::EULER', sub { Math::Symbolic::EULER } ], + [ 'Math::AnyNum::euler', sub { Math::AnyNum->e } ], + [ 'Sidef', sub { Sidef->new()->execute_code("Number.e()") } ], + # [ 'Math::Pari::Euler', sub { Math::Pari::Euler() } ], NOPE! Euler's constant is not the same as Euler's number! +); + +my @table = [ 'Module', q{Euler's Number} ]; +foreach my $euler ( @eulers ) { + push @table, [ $euler->[0], $euler->[1]->() ]; +} + +say Text::Table::Tiny::generate_table( header_row => 1, rows => \@table ); + +exit 0; + -- cgit From 9b4ee579b7202e132821028ed67ce6beb163be2a Mon Sep 17 00:00:00 2001 From: Randy Lauen Date: Fri, 16 Aug 2019 16:42:18 -0500 Subject: perl6 solution for challenge 1 --- challenge-021/randy-lauen/perl6/ch-1.p6 | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 challenge-021/randy-lauen/perl6/ch-1.p6 diff --git a/challenge-021/randy-lauen/perl6/ch-1.p6 b/challenge-021/randy-lauen/perl6/ch-1.p6 new file mode 100644 index 0000000000..f2e000010f --- /dev/null +++ b/challenge-021/randy-lauen/perl6/ch-1.p6 @@ -0,0 +1,15 @@ +#!/usr/bin/env perl6 + +# Write a script to calculate the value of e, also known as Euler’s number and Napier’s constant. + +my $e = 0; +for ^20 -> $n { + $e += 1/factorial($n); +} +say "Calculated e = $e"; +say "Perl6 e = {e}"; + +sub factorial( Int $n where * >= 0 ) { + return 1 if $n == 0; + return $n * factorial( $n - 1 ); +} -- cgit From bd7d9876b41b4cca6440225855bdf88cdd17a1dc Mon Sep 17 00:00:00 2001 From: Randy Lauen Date: Fri, 16 Aug 2019 23:30:37 -0500 Subject: comments plus another module --- challenge-021/randy-lauen/perl5/ch-1.pl | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/challenge-021/randy-lauen/perl5/ch-1.pl b/challenge-021/randy-lauen/perl5/ch-1.pl index ddd6c78111..d39415e039 100644 --- a/challenge-021/randy-lauen/perl5/ch-1.pl +++ b/challenge-021/randy-lauen/perl5/ch-1.pl @@ -4,9 +4,13 @@ use 5.020; use strict; use warnings; +# Write a script to calculate the value of e, also known as Euler’s number and Napier’s constant. + +# Instead of implementing it myself, I took a tour through +# some of the CPAN modules that do it for you. + use Math::Big (); use Math::NumberCruncher (); -use Math::Pari (); use Math::Symbolic (); use Math::AnyNum (); use Sidef (); @@ -15,10 +19,11 @@ use Text::Table::Tiny (); my @eulers = ( [ 'Math::Big::euler', sub { Math::Big::euler(1, 47) } ], [ 'Math::NumberCruncher::ECONST', sub { Math::NumberCruncher::ECONST( 46 ) } ], + [ 'Math::NumberCruncher::_e_', sub { substr( $Math::NumberCruncher::_e_, 0, 48 ) . '...' } ], [ 'Math::Symbolic::EULER', sub { Math::Symbolic::EULER } ], [ 'Math::AnyNum::euler', sub { Math::AnyNum->e } ], - [ 'Sidef', sub { Sidef->new()->execute_code("Number.e()") } ], - # [ 'Math::Pari::Euler', sub { Math::Pari::Euler() } ], NOPE! Euler's constant is not the same as Euler's number! + [ 'Sidef Number.e', sub { Sidef->new()->execute_code("Number.e()") } ], + [ 'bigrat::e', sub { require bigrat; bigrat::e() } ], ); my @table = [ 'Module', q{Euler's Number} ]; @@ -28,5 +33,3 @@ foreach my $euler ( @eulers ) { say Text::Table::Tiny::generate_table( header_row => 1, rows => \@table ); -exit 0; - -- cgit From 6f1606aa134f39ea5bec4938723ecc551025394d Mon Sep 17 00:00:00 2001 From: Randy Lauen Date: Sat, 17 Aug 2019 12:56:10 -0500 Subject: calculate e --- challenge-021/randy-lauen/perl5/ch-1.pl | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/challenge-021/randy-lauen/perl5/ch-1.pl b/challenge-021/randy-lauen/perl5/ch-1.pl index d39415e039..182d37cde1 100644 --- a/challenge-021/randy-lauen/perl5/ch-1.pl +++ b/challenge-021/randy-lauen/perl5/ch-1.pl @@ -6,10 +6,13 @@ use warnings; # Write a script to calculate the value of e, also known as Euler’s number and Napier’s constant. -# Instead of implementing it myself, I took a tour through -# some of the CPAN modules that do it for you. +# In addition to calculating it myself, I took a tour through +# some of the CPAN modules that do it for you. Some modules, +# like Math::Pari, have a function called Euler that returns +# Euler's constant, which is not the same as Euler's number. use Math::Big (); +use Math::BigFloat (); use Math::NumberCruncher (); use Math::Symbolic (); use Math::AnyNum (); @@ -24,6 +27,8 @@ my @eulers = ( [ 'Math::AnyNum::euler', sub { Math::AnyNum->e } ], [ 'Sidef Number.e', sub { Sidef->new()->execute_code("Number.e()") } ], [ 'bigrat::e', sub { require bigrat; bigrat::e() } ], + # My calculated version of e starts to differ around the 35th decimal. + [ 'Calculated e', sub { substr( e(), 0, 48 ) . '...' } ], ); my @table = [ 'Module', q{Euler's Number} ]; @@ -33,3 +38,21 @@ foreach my $euler ( @eulers ) { say Text::Table::Tiny::generate_table( header_row => 1, rows => \@table ); +exit 0; + + +sub e { + my $e = Math::BigFloat->bzero; + for my $n ( 0 .. 50 ) { + $e += Math::BigFloat->bone / Math::BigFloat->new( factorial( $n ) ); + } + return $e; +} + + +sub factorial { + my $n = shift; + return 1 if $n == 0; + return $n * factorial( $n - 1 ); +} + -- cgit From db66c8cc4afba119dbd81af9da81e6a4352ae8a8 Mon Sep 17 00:00:00 2001 From: Randy Lauen Date: Sat, 17 Aug 2019 13:31:59 -0500 Subject: comments --- challenge-021/randy-lauen/perl5/ch-1.pl | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/challenge-021/randy-lauen/perl5/ch-1.pl b/challenge-021/randy-lauen/perl5/ch-1.pl index 182d37cde1..3f727cb405 100644 --- a/challenge-021/randy-lauen/perl5/ch-1.pl +++ b/challenge-021/randy-lauen/perl5/ch-1.pl @@ -1,15 +1,33 @@ #!/usr/bin/env perl -use 5.020; +use v5.28; use strict; use warnings; -# Write a script to calculate the value of e, also known as Euler’s number and Napier’s constant. +=head1 SYNOPSIS -# In addition to calculating it myself, I took a tour through -# some of the CPAN modules that do it for you. Some modules, -# like Math::Pari, have a function called Euler that returns -# Euler's constant, which is not the same as Euler's number. +Task: Write a script to calculate the value of e, also known as Euler’s number and Napier’s constant. + +In addition to calculating it myself, I took a tour through some of the CPAN modules that +do it for you. Some modules, like Math::Pari, have a function called Euler() that returns +Euler's constant, which is not the same as Euler's number. + +Example output: + $ perl ch-1.pl + +------------------------------+-----------------------------------------------------+ + | Module | Euler's Number | + +------------------------------+-----------------------------------------------------+ + | Math::Big::euler | 2.7182818284590452353602874713526624977572470937 | + | Math::NumberCruncher::ECONST | 2.7182818284590452353602874713526624977572470937 | + | Math::NumberCruncher::_e_ | 2.7182818284590452353602874713526624977572470936... | + | Math::Symbolic::EULER | 2.71828182845905 | + | Math::AnyNum::euler | 2.7182818284590452353602874713526624977572470937 | + | Sidef Number.e | 2.7182818284590452353602874713526624977572470937 | + | bigrat::e | 2.718281828459045235360287471352662497757 | + | Calculated e | 2.7182818284590452353602874713526625112110646491... | + +------------------------------+-----------------------------------------------------+ + +=cut use Math::Big (); use Math::BigFloat (); -- cgit From 5795cdedab8fbf920064abcc571afa534bab68c4 Mon Sep 17 00:00:00 2001 From: Randy Lauen Date: Sat, 17 Aug 2019 13:32:41 -0500 Subject: solution to task 3 --- challenge-021/randy-lauen/perl5/ch-3.pl | 43 +++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 challenge-021/randy-lauen/perl5/ch-3.pl diff --git a/challenge-021/randy-lauen/perl5/ch-3.pl b/challenge-021/randy-lauen/perl5/ch-3.pl new file mode 100644 index 0000000000..1cdb31766d --- /dev/null +++ b/challenge-021/randy-lauen/perl5/ch-3.pl @@ -0,0 +1,43 @@ +#!/usr/bin/env perl + +use v5.28; +use strict; +use warnings; + +=head1 SYNOPSIS + +Task: Write a script to use BC Gov News API. + +This script prints out the top and feature post headlines. + +Example output: + $ perl ch-3.pl + topPostKey + * News Release: Third urgent and primary care centre opens in Greater Vancouver + * Backgrounder: North Vancouver UPCC + + featurePostKey + * News Release: Province seeks feedback to ban, reduce, recycle more plastics + +=cut + +use HTTP::API::Client; + +my $agent = HTTP::API::Client->new( + base_url => URI->new('https://news.api.gov.bc.ca'), + pre_defined_data => { 'api-version' => '1.0' }, +); + +$agent->get('/api/Home'); +my $homeInfo = $agent->json_response(); + +foreach my $key (qw( topPostKey featurePostKey )) { + $agent->get("/api/Posts/$homeInfo->{$key}"); + my $postInfo = $agent->json_response(); + + say $key; + foreach my $document ( $postInfo->{documents}->@* ) { + say "* $document->{pageTitle}: $document->{headline}"; + } + say ''; +} -- cgit From c0308242591792881f13f6182752206c5408a500 Mon Sep 17 00:00:00 2001 From: Randy Lauen Date: Sat, 17 Aug 2019 13:34:40 -0500 Subject: comments --- challenge-021/randy-lauen/perl6/ch-1.p6 | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/challenge-021/randy-lauen/perl6/ch-1.p6 b/challenge-021/randy-lauen/perl6/ch-1.p6 index f2e000010f..334c847ec4 100644 --- a/challenge-021/randy-lauen/perl6/ch-1.p6 +++ b/challenge-021/randy-lauen/perl6/ch-1.p6 @@ -1,6 +1,15 @@ #!/usr/bin/env perl6 -# Write a script to calculate the value of e, also known as Euler’s number and Napier’s constant. +=begin SYNOPSIS + +Task: Write a script to calculate the value of e, also known as Euler’s number and Napier’s constant. + +Example output: + $ perl6 ch-1.p6 + Calculated e = 2.718281828459045 + Perl6 e = 2.718281828459045 + +=end SYNOPSIS my $e = 0; for ^20 -> $n { -- cgit From ab6aecbbe767d193b05ca04c083d2a3b3b268cf0 Mon Sep 17 00:00:00 2001 From: Randy Lauen Date: Sat, 17 Aug 2019 18:50:53 -0500 Subject: solution for task 3 --- challenge-021/randy-lauen/perl6/ch-3.p6 | 61 +++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 challenge-021/randy-lauen/perl6/ch-3.p6 diff --git a/challenge-021/randy-lauen/perl6/ch-3.p6 b/challenge-021/randy-lauen/perl6/ch-3.p6 new file mode 100644 index 0000000000..ca51f8a140 --- /dev/null +++ b/challenge-021/randy-lauen/perl6/ch-3.p6 @@ -0,0 +1,61 @@ +#!/usr/bin/env perl6 + +=begin SYNOPSIS + +Task: Write a script to use BC Gov News API. + +This script prints out the top and feature post headlines. + +Example output: + + $ perl6 ch-3.p6 + topPostKey + * News Release: Third urgent and primary care centre opens in Greater Vancouver + * Backgrounder: North Vancouver UPCC + + featurePostKey + * News Release: Province seeks feedback to ban, reduce, recycle more plastics + +=end SYNOPSIS + +use Cro::HTTP::Client; +use URI::Encode; + +class ApiClient { + has %.params; + has $.base-uri; + has $!client = Cro::HTTP::Client.new( + :http('1.1'), + :base-uri( $!base-uri ) + :headers( [ Accept => 'application/json' ] ), + ); + + method get( $path ) { + return self!get-json( "$path?" ~ %!params.pairs.map( { .key ~ '=' ~ .value } ).join('&') ); + } + + method !get-json( $uri ) { + my $encoded = uri_encode( $uri ); + my $response = await $!client.get( $encoded ); + return await $response.body; + } +} + + +sub MAIN() { + my $client = ApiClient.new( + base-uri => 'https://news.api.gov.bc.ca', + params => %( :api-version('1.0') ), + ); + my %homeInfo = $client.get( '/api/Home' ); + + for -> $key { + my %postInfo = $client.get( "/api/Posts/%homeInfo{$key}" ); + say $key; + + for %postInfo.flat -> $doc { + say "* $doc: $doc"; + } + say ''; + } +} -- cgit