aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <mohammad.anwar@yahoo.com>2021-10-26 04:59:10 +0100
committerMohammad S Anwar <mohammad.anwar@yahoo.com>2021-10-26 04:59:10 +0100
commit489add6ac10297e7ba88002c37ea5ccfe2def977 (patch)
tree0ba3abf84aeed6bdf09b1d53fb4225d6ecea0305
parent507fd0912e870f496ea2826cb21ab694c3ab0166 (diff)
downloadperlweeklychallenge-club-489add6ac10297e7ba88002c37ea5ccfe2def977.tar.gz
perlweeklychallenge-club-489add6ac10297e7ba88002c37ea5ccfe2def977.tar.bz2
perlweeklychallenge-club-489add6ac10297e7ba88002c37ea5ccfe2def977.zip
- Added solutions by Ulrich Rieke.
-rw-r--r--challenge-136/ulrich-rieke/cpp/ch-1.cpp20
-rw-r--r--challenge-136/ulrich-rieke/haskell/ch-1.hs13
-rw-r--r--challenge-136/ulrich-rieke/haskell/ch-2.hs26
-rw-r--r--challenge-136/ulrich-rieke/perl/ch-1.pl38
-rw-r--r--challenge-136/ulrich-rieke/perl/ch-2.pl33
-rw-r--r--challenge-136/ulrich-rieke/raku/ch-1.raku10
-rw-r--r--challenge-136/ulrich-rieke/raku/ch-2.raku23
7 files changed, 163 insertions, 0 deletions
diff --git a/challenge-136/ulrich-rieke/cpp/ch-1.cpp b/challenge-136/ulrich-rieke/cpp/ch-1.cpp
new file mode 100644
index 0000000000..51c0f4359b
--- /dev/null
+++ b/challenge-136/ulrich-rieke/cpp/ch-1.cpp
@@ -0,0 +1,20 @@
+#include <iostream>
+#include <cmath>
+#include <cstdlib>
+#include <numeric>
+
+double log2( int n ) {
+ return std::log( static_cast<double>( n )) / std::log( 2 ) ;
+}
+
+int main( int argc , char * argv[] ) {
+ int m = std::atoi( argv[ 1 ] ) ;
+ int n = std::atoi( argv[ 2 ] ) ;
+ int commonDiv = std::gcd( m , n ) ;
+ double theLog = log2( commonDiv ) ;
+ if ( std::floor( theLog ) == theLog )
+ std::cout << 1 << std::endl ;
+ else
+ std::cout << 0 << std::endl ;
+ return 0 ;
+}
diff --git a/challenge-136/ulrich-rieke/haskell/ch-1.hs b/challenge-136/ulrich-rieke/haskell/ch-1.hs
new file mode 100644
index 0000000000..166fcc2fb6
--- /dev/null
+++ b/challenge-136/ulrich-rieke/haskell/ch-1.hs
@@ -0,0 +1,13 @@
+module Challenge136
+ where
+
+log2 :: Int -> Float
+log2 n = log (fromIntegral n) / log 2.0
+
+solution :: Int -> Int -> Int
+solution m n
+ |(realToFrac $ floor theNum) == theNum = 1
+ |otherwise = 0
+ where
+ theNum :: Float
+ theNum = log2 $ gcd m n
diff --git a/challenge-136/ulrich-rieke/haskell/ch-2.hs b/challenge-136/ulrich-rieke/haskell/ch-2.hs
new file mode 100644
index 0000000000..e33449ca5b
--- /dev/null
+++ b/challenge-136/ulrich-rieke/haskell/ch-2.hs
@@ -0,0 +1,26 @@
+module Challenge136_2
+ where
+import Data.List ( subsequences )
+
+fibonacci :: Int -> Int
+fibonacci 0 = 0
+fibonacci 1 = 1
+fibonacci n = fibonacci ( n - 2 ) + fibonacci ( n - 1 )
+
+findFibos :: Int -> [Int]
+findFibos n = drop 2 $ map fibonacci [0..n]--we drop the first 2, see the task
+
+solution :: Int -> Int
+solution n
+ |elem n theFibos = 1 + ( length possibleCombis )
+ |otherwise = length possibleCombis
+ where
+ theFibos :: [Int]
+ theFibos = takeWhile ( <= n ) $ findFibos n
+ theSequences :: [[Int]]
+ theSequences = subsequences theFibos
+ allCombis :: [[Int]]
+ allCombis = foldl1 (++) $ map (\i -> filter ( (== i ) . length )
+ theSequences ) [2 .. length theFibos]
+ possibleCombis :: [[Int]]
+ possibleCombis = filter ((== n ) . sum ) allCombis
diff --git a/challenge-136/ulrich-rieke/perl/ch-1.pl b/challenge-136/ulrich-rieke/perl/ch-1.pl
new file mode 100644
index 0000000000..a2374474db
--- /dev/null
+++ b/challenge-136/ulrich-rieke/perl/ch-1.pl
@@ -0,0 +1,38 @@
+#!/usr/bin/perl ;
+use strict ;
+use warnings ;
+use feature 'say' ;
+use List::Util qw( max ) ;
+use POSIX ;
+
+sub log2 {
+ my $number = shift ;
+ return log( $number ) / log( 2 ) ;
+}
+
+sub gcd {
+ my $firstNumber = shift ;
+ my $secondNumber = shift ;
+ my %divisors ;
+ for my $i ( 1 .. $firstNumber ) {
+ if ( $firstNumber % $i == 0 ) {
+ $divisors{ $i }++ ;
+ }
+ }
+ for my $i ( 1 .. $secondNumber ) {
+ if ( $secondNumber % $i == 0 ) {
+ $divisors{ $i }++ ;
+ }
+ }
+ return max ( grep { $divisors{ $_ } == 2 } keys %divisors ) ;
+}
+
+my $m = $ARGV[ 0 ] ;
+my $n = $ARGV[ 1 ] ;
+my $theLog = log2( gcd( $m , $n ) ) ;
+if ( floor( $theLog ) == $theLog ) {
+ say 1 ;
+}
+else {
+ say 0 ;
+}
diff --git a/challenge-136/ulrich-rieke/perl/ch-2.pl b/challenge-136/ulrich-rieke/perl/ch-2.pl
new file mode 100644
index 0000000000..5c181dc479
--- /dev/null
+++ b/challenge-136/ulrich-rieke/perl/ch-2.pl
@@ -0,0 +1,33 @@
+#!/usr/bin/perl ;
+use strict ;
+use warnings ;
+use feature 'say' ;
+use Algorithm::Combinatorics qw( combinations ) ;
+use List::Util qw ( sum ) ;
+
+my $n = $ARGV[ 0 ] ;
+if ( $n == 1 || $n == 2 ) {
+ say 1 ;
+ exit( 0 ) ;
+}
+else {
+ my @fibonacci = (1 , 2 ) ;
+ my %fibonums ;
+ while ( $fibonacci[ -1 ] + $fibonacci[ -2 ] < $n ) {
+ push ( @fibonacci , $fibonacci[ -1 ] + $fibonacci[ - 2 ] ) ;
+ }
+ map { $fibonums{$_}++ } @fibonacci ;
+ my $sequencesFound = 0 ;
+ for my $i ( 2 .. scalar( @fibonacci ) - 1 ) {
+ my $iter = combinations( \@fibonacci , $i ) ;
+ while ( my $c = $iter->next ) {
+ if ( sum( @{$c} ) == $n ) {
+ $sequencesFound++ ;
+ }
+ }
+ }
+ if ( exists ( $fibonums{ $n } ) ) {
+ $sequencesFound++ ;
+ }
+ say $sequencesFound ;
+}
diff --git a/challenge-136/ulrich-rieke/raku/ch-1.raku b/challenge-136/ulrich-rieke/raku/ch-1.raku
new file mode 100644
index 0000000000..a80abeb938
--- /dev/null
+++ b/challenge-136/ulrich-rieke/raku/ch-1.raku
@@ -0,0 +1,10 @@
+use v6 ;
+
+sub MAIN( Int $m is copy , Int $n is copy ) {
+ if ( log2( $m gcd $n) %% 1 ) {
+ say 1 ;
+ }
+ else {
+ say 0 ;
+ }
+}
diff --git a/challenge-136/ulrich-rieke/raku/ch-2.raku b/challenge-136/ulrich-rieke/raku/ch-2.raku
new file mode 100644
index 0000000000..15d9da1b5a
--- /dev/null
+++ b/challenge-136/ulrich-rieke/raku/ch-2.raku
@@ -0,0 +1,23 @@
+use v6 ;
+
+sub MAIN( Int $n is copy ) {
+ my @fibonacci = (1 , 2 ) ;
+ my $sequencesFound = 0 ;
+ if ( $n == 1 || $n == 2 ) {
+ say 1 ;
+ exit( 0 ) ;
+ }
+ else {
+ repeat {
+ @fibonacci.push( @fibonacci[* - 1] + @fibonacci[ * - 2] ) ;
+ } until ( @fibonacci[ * - 1] >= $n ) ;
+ }
+ for (2 .. @fibonacci.elems - 1) -> $i {
+ my @combis = @fibonacci.combinations( $i ) ;
+ $sequencesFound += @combis.grep( {$_.sum == $n} ) ;
+ }
+ if ( $n (elem) @fibonacci.Set ) {
+ $sequencesFound++ ; #we should add one sequence that contains $n only
+ }
+ say $sequencesFound ;
+}