From b687fe1babaa737f2d4d409338262c2f9ad1618c Mon Sep 17 00:00:00 2001 From: Alexander Pankoff Date: Tue, 8 Dec 2020 13:39:52 +0100 Subject: add solutions for challenge-090 in perl --- challenge-090/alexander-pankoff/perl/ch-1.pl | 17 ++++++++++++++ challenge-090/alexander-pankoff/perl/ch-2.pl | 34 ++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100755 challenge-090/alexander-pankoff/perl/ch-1.pl create mode 100755 challenge-090/alexander-pankoff/perl/ch-2.pl diff --git a/challenge-090/alexander-pankoff/perl/ch-1.pl b/challenge-090/alexander-pankoff/perl/ch-1.pl new file mode 100755 index 0000000000..15f2c016bc --- /dev/null +++ b/challenge-090/alexander-pankoff/perl/ch-1.pl @@ -0,0 +1,17 @@ +#!/usr/bin/env perl +use v5.20; +use utf8; +use strict; +use warnings; +use feature qw(say signatures); +no warnings 'experimental::signatures'; + +{ + my ( $sequence ) = @ARGV; + die 'need dna sequence' unless $sequence; + my %complements = ( T => 'A', G => 'C' ); + %complements = ( %complements, reverse %complements ); + + say 'Nucleiobase count: ' . length( $sequence ); + say 'Complementary sequence: ' . join( '', map { $complements{$_} } split( '', $sequence ) ); +} diff --git a/challenge-090/alexander-pankoff/perl/ch-2.pl b/challenge-090/alexander-pankoff/perl/ch-2.pl new file mode 100755 index 0000000000..51f636cc6f --- /dev/null +++ b/challenge-090/alexander-pankoff/perl/ch-2.pl @@ -0,0 +1,34 @@ +#!/usr/bin/env perl +use v5.20; +use utf8; +use strict; +use warnings; +use feature qw(say signatures); +no warnings 'experimental::signatures'; + +use List::Util qw(sum0); + +use Test::Simple tests => 20; + +{ + for ( 0 .. 19 ) { + my ( $a, $b ) = map { int( rand( 1000 ) ) + 1 } 0 .. 1; + my $expected = $a * $b; + ok( ethopian_mul( $a, $b ) == $expected, "ethopian_mul($a, $b) = $a * $b = $expected" ); + } +} + +sub ethopian_mul ( $a, $b ) { + return sum0( map { $_->[1] } grep { odd( $_->[0] ) } ethopian_mul_chain( $a, $b ) ); +} + +sub ethopian_mul_chain ( $a, $b ) { + return [ $a, $b ] if $a <= 1; + + # using bit shifts to avoid use of multiplication + return ( [ $a, $b ], ethopian_mul_chain( $a >> 1, $b << 1 ) ); +} + +sub odd($x) { + $x != ( ( $x >> 1 ) << 1 ); +} -- cgit From 958a003d916036a4f72aa87fa5a3d5ea2717d952 Mon Sep 17 00:00:00 2001 From: Alexander Pankoff Date: Tue, 8 Dec 2020 14:10:52 +0100 Subject: reimplement odd --- challenge-090/alexander-pankoff/perl/ch-2.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/challenge-090/alexander-pankoff/perl/ch-2.pl b/challenge-090/alexander-pankoff/perl/ch-2.pl index 51f636cc6f..eb588779f8 100755 --- a/challenge-090/alexander-pankoff/perl/ch-2.pl +++ b/challenge-090/alexander-pankoff/perl/ch-2.pl @@ -30,5 +30,5 @@ sub ethopian_mul_chain ( $a, $b ) { } sub odd($x) { - $x != ( ( $x >> 1 ) << 1 ); + $x & 1; } -- cgit From 92d41f92a59d5ebad74d12edec19e86ad1d53aed Mon Sep 17 00:00:00 2001 From: Alexander Pankoff Date: Tue, 8 Dec 2020 14:11:00 +0100 Subject: add verbose mode --- challenge-090/alexander-pankoff/perl/ch-2.pl | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/challenge-090/alexander-pankoff/perl/ch-2.pl b/challenge-090/alexander-pankoff/perl/ch-2.pl index eb588779f8..a66c4feea7 100755 --- a/challenge-090/alexander-pankoff/perl/ch-2.pl +++ b/challenge-090/alexander-pankoff/perl/ch-2.pl @@ -10,6 +10,8 @@ use List::Util qw(sum0); use Test::Simple tests => 20; +use constant VERBOSE => $ENV{VERBOSE} // 0; + { for ( 0 .. 19 ) { my ( $a, $b ) = map { int( rand( 1000 ) ) + 1 } 0 .. 1; @@ -19,7 +21,16 @@ use Test::Simple tests => 20; } sub ethopian_mul ( $a, $b ) { - return sum0( map { $_->[1] } grep { odd( $_->[0] ) } ethopian_mul_chain( $a, $b ) ); + my @chain = ethopian_mul_chain( $a, $b ); + verbose( "halving $a, doubling $b, till $a becomes 1" ); + verbose( $_->[0] . ' & ' . $_->[1] ) for @chain; + + my @filtered = map { $_->[1] } grep { odd( $_->[0] ) } @chain; + verbose( "taking right values where left value is odd" ); + verbose( $_ ) for @filtered; + my $product = sum0( @filtered ); + verbose( "product is $product" ); + return $product; } sub ethopian_mul_chain ( $a, $b ) { -- cgit