From a439475c2d02388ada7dcf1ce5062ff024f0235d Mon Sep 17 00:00:00 2001 From: Joelle Maslak Date: Fri, 16 Aug 2019 23:22:56 -0600 Subject: Joelle's Solutions to 21.1 --- challenge-021/joelle-maslak/perl5/ch-1.pl | 43 +++++++++++++++++++++++++++++++ challenge-021/joelle-maslak/perl6/ch-1.p6 | 39 ++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+) create mode 100755 challenge-021/joelle-maslak/perl5/ch-1.pl create mode 100755 challenge-021/joelle-maslak/perl6/ch-1.p6 diff --git a/challenge-021/joelle-maslak/perl5/ch-1.pl b/challenge-021/joelle-maslak/perl5/ch-1.pl new file mode 100755 index 0000000000..e8c7e19b3b --- /dev/null +++ b/challenge-021/joelle-maslak/perl5/ch-1.pl @@ -0,0 +1,43 @@ +#!/usr/bin/env perl +use v5.22; +use strict; +use warnings; + + +use Math::BigRat; + +sub main() { + die "Usage: $0 " if @ARGV > 1; + my $digits = ( shift @ARGV ) // 10; + die "Usage: $0 " if $digits !~ m/^[0-9]+$/ms; + + return unless $digits; + if ( $digits == 1 ) { + say "2"; + return; + } + + my $e = Math::BigRat->new(2); + my $current = Math::BigRat->new(1); + my $denom = Math::BigRat->new(1); + + my $chkdigits = $digits; + + do { + $current++; + $denom *= $current; + + $e += Math::BigRat->new("1/$denom"); + if (length($denom) >= $chkdigits + 3) { # 2 should be enough, but we'll be safe + my $digit = ((int $e * (Math::BigRat->new(10)**$chkdigits)) % 10); + if ($digit =~ m/[49]$/) { + $chkdigits++; + } + } + } while ( length($denom) < $chkdigits + 3 ); + + say $e->as_float($digits); + return; +} + +main(); diff --git a/challenge-021/joelle-maslak/perl6/ch-1.p6 b/challenge-021/joelle-maslak/perl6/ch-1.p6 new file mode 100755 index 0000000000..f4b281f286 --- /dev/null +++ b/challenge-021/joelle-maslak/perl6/ch-1.p6 @@ -0,0 +1,39 @@ +#!/usr/bin/env perl6 +use v6; + +# +# Copyright © 2019 Joelle Maslak +# All Rights Reserved - See License +# + +multi sub MAIN(UInt:D $digits where * == 0) { return; } +multi sub MAIN(UInt:D $digits where * == 1) { say "2"; return; } +multi sub MAIN(UInt:D $digits = 10) { + return unless $digits; + + my FatRat $limit = FatRat.new(1, 10**$digits); + + my FatRat $e = FatRat.new(2); + my $current = 1; + my $denom = 1; + + my $chkdigits = $digits; + repeat { + $current++; + $denom *= $current; + + $e += FatRat.new(1, $denom); + + if $denom.chars >= ($chkdigits + 3) { # 2 should be enough, but we'll be safe + if $e.substr(0, $chkdigits+2) ~~ / <[4 9]> $/ { + $chkdigits++; + } + } + } while $denom.chars < $chkdigits+3; + + $e += FatRat.new(5, (10**$digits+1) ); + say $e.substr(0, $digits+1); + return; +} + + -- cgit