aboutsummaryrefslogtreecommitdiff
path: root/challenge-146
diff options
context:
space:
mode:
authorMohammad S Anwar <mohammad.anwar@yahoo.com>2022-01-04 22:23:00 +0000
committerMohammad S Anwar <mohammad.anwar@yahoo.com>2022-01-04 22:23:00 +0000
commit193cf97fb78400ef9659a67f506cec6b1179c40e (patch)
tree71f75baa6eeb69731911852f9182fc71c16bff3c /challenge-146
parentaf32440afeb5e13f3b57b154ba27cfba2efd4fce (diff)
downloadperlweeklychallenge-club-193cf97fb78400ef9659a67f506cec6b1179c40e.tar.gz
perlweeklychallenge-club-193cf97fb78400ef9659a67f506cec6b1179c40e.tar.bz2
perlweeklychallenge-club-193cf97fb78400ef9659a67f506cec6b1179c40e.zip
- Added solutions by Ulrich Rieke.
Diffstat (limited to 'challenge-146')
-rw-r--r--challenge-146/ulrich-rieke/cpp/ch-1.cpp23
-rw-r--r--challenge-146/ulrich-rieke/cpp/ch-2.cpp70
-rw-r--r--challenge-146/ulrich-rieke/haskell/ch-1.hs14
-rw-r--r--challenge-146/ulrich-rieke/haskell/ch-2.hs47
-rw-r--r--challenge-146/ulrich-rieke/perl/ch-1.pl23
-rw-r--r--challenge-146/ulrich-rieke/perl/ch-2.pl81
-rw-r--r--challenge-146/ulrich-rieke/raku/ch-1.raku11
-rw-r--r--challenge-146/ulrich-rieke/raku/ch-2.raku93
8 files changed, 362 insertions, 0 deletions
diff --git a/challenge-146/ulrich-rieke/cpp/ch-1.cpp b/challenge-146/ulrich-rieke/cpp/ch-1.cpp
new file mode 100644
index 0000000000..415867763f
--- /dev/null
+++ b/challenge-146/ulrich-rieke/cpp/ch-1.cpp
@@ -0,0 +1,23 @@
+#include <iostream>
+#include <cmath>
+
+bool isPrime( int number ) {
+ int stop = std::sqrt( static_cast<double>( number ) ) ;
+ for ( int i = 2 ; i <= stop ; ++i )
+ if ( number % i == 0 )
+ return false ;
+ return true ;
+}
+
+int main( ) {
+ int current = 1 ;
+ int numberOfPrimes = 0 ;
+ while ( numberOfPrimes != 10001 ) {
+ current++ ;
+ if ( isPrime( current ) ) {
+ numberOfPrimes++ ;
+ }
+ }
+ std::cout << current << std::endl ;
+ return 0 ;
+}
diff --git a/challenge-146/ulrich-rieke/cpp/ch-2.cpp b/challenge-146/ulrich-rieke/cpp/ch-2.cpp
new file mode 100644
index 0000000000..e9d58c88d8
--- /dev/null
+++ b/challenge-146/ulrich-rieke/cpp/ch-2.cpp
@@ -0,0 +1,70 @@
+#include <iostream>
+#include <string>
+#include <algorithm>
+#include <utility>
+
+std::pair<int,int> createParent( int dividend , int divisor , int bdividend ,
+ int bdivisor ) {
+ std::pair<int , int> node ;
+ double product = ( (static_cast<double>( dividend ) /
+ static_cast<double>( divisor )) *
+ ( static_cast<double>( bdividend ) / static_cast<double>(bdivisor))) ;
+ int firstMin = std::min( dividend, divisor ) ;
+ int secondMin = std::min( bdividend, bdivisor ) ;
+ if ( product > 1.0 ) {
+ node = std::make_pair( std::max( firstMin , secondMin ) ,
+ std::min( firstMin, secondMin ) ) ;
+ }
+ if ( product < 1.0 ) {
+ node = std::make_pair( std::min( firstMin , secondMin ) ,
+ std::max( firstMin, secondMin ) ) ;
+ }
+ if ( product == 1.0 )
+ node = std::make_pair( 1 , 1 ) ;
+ return node ;
+}
+
+std::pair<int, int> createBrother( int dividend , int divisor ) {
+ int maximum = std::max( dividend , divisor ) ;
+ int minimum = std::min( dividend, divisor ) ;
+ if ( maximum == dividend ) {
+ return std::make_pair( maximum - minimum , maximum ) ;
+ }
+ else {
+ return std::make_pair( maximum , maximum - minimum ) ;
+ }
+}
+
+int main( ) {
+ std::cout << "Enter a fraction as dividend/divisor!\n" ;
+ std::string input ;
+ std::cin >> input ;
+ std::string::size_type found = input.find( "/" ) ;
+ while ( found == std::string::npos ) {
+ std::cout << "Please enter a fraction as dividend/divisor!\n" ;
+ std::cin >> input ;
+ found = input.find( "/" ) ;
+ }
+ int howmany = static_cast<int>( found ) ;
+ int dividend = std::stoi( input.substr( 0 , howmany ) ) ;
+ int divisor = std::stoi( input.substr( howmany + 1 ) ) ;
+ if ( dividend == 1 && divisor == 1 )
+ std::cout << "parent = and grandparent = " << std::endl ;
+ else {
+ double fraction = static_cast<double>( dividend ) / static_cast<double>( divisor) ;
+ if ( fraction == 0.5 || fraction == 2.0 )
+ std::cout << "parent = 1/1 and grandparent = !" << std::endl ;
+ else {
+ std::pair<int , int> brother = createBrother( dividend , divisor ) ;
+ std::pair<int , int> parent = createParent( dividend, divisor , brother.first ,
+ brother.second ) ;
+ std::pair<int , int> uncle = createBrother( parent.first , parent.second ) ;
+ std::pair<int , int> grandParent = createParent( parent.first , parent.second ,
+ uncle.first , uncle.second ) ;
+ std::cout << "parent = " << parent.first << '/' << parent.second ;
+ std::cout << " and grandparent = " << grandParent.first << '/' <<
+ grandParent.second << std::endl ;
+ }
+ }
+ return 0 ;
+}
diff --git a/challenge-146/ulrich-rieke/haskell/ch-1.hs b/challenge-146/ulrich-rieke/haskell/ch-1.hs
new file mode 100644
index 0000000000..d46c5332dd
--- /dev/null
+++ b/challenge-146/ulrich-rieke/haskell/ch-1.hs
@@ -0,0 +1,14 @@
+module Challenge146
+ where
+
+isPrime :: Int -> Bool
+isPrime n
+ |n == 2 = True
+ |n == 1 = False
+ |otherwise = null $ filter (\i -> mod n i == 0 ) [2 .. root]
+ where
+ root :: Int
+ root = floor $ sqrt $ fromIntegral n
+
+solution :: Int
+solution = head $ drop 10000 $ filter isPrime [2 , 3 ..]
diff --git a/challenge-146/ulrich-rieke/haskell/ch-2.hs b/challenge-146/ulrich-rieke/haskell/ch-2.hs
new file mode 100644
index 0000000000..0e55eafa7f
--- /dev/null
+++ b/challenge-146/ulrich-rieke/haskell/ch-2.hs
@@ -0,0 +1,47 @@
+module Challenge146_2
+ where
+import Data.List.Split ( splitOn )
+
+createBrother :: (Int , Int ) -> ( Int , Int )
+createBrother ( dividend , divisor )
+ |maxi == dividend = (maxi - mini , maxi)
+ |mini == dividend = ( maxi , maxi - mini )
+ where
+ maxi :: Int
+ maxi = maximum [ dividend , divisor]
+ mini :: Int
+ mini = minimum [ dividend , divisor ]
+
+createParent :: (Int , Int) -> (Int , Int) -> (Int , Int)
+createParent ( dividend , divisor ) ( bdividend , bdivisor )
+ |product > 1.0 = ( maximum [firstMin , secondMin] , minimum [firstMin , secondMin])
+ |product < 1.0 = ( minimum [firstMin , secondMin] , maximum [firstMin , secondMin])
+ |product == 1.0 = ( 1 , 1 )
+ where
+ product :: Double
+ product = (fromIntegral dividend / fromIntegral divisor) * ( fromIntegral
+ bdividend / fromIntegral bdivisor )
+ firstMin :: Int
+ firstMin = minimum [ dividend , divisor ]
+ secondMin :: Int
+ secondMin = minimum [bdividend , bdivisor]
+
+solution :: String -> String
+solution input
+ |input == "1/2" = "parent = 1/1 and grandparent ="
+ |input == "2/1" = "parent = 1/1 and grandparent ="
+ |otherwise = "parent = " ++ (show $ fst parent) ++ "/" ++ ( show $ snd parent )
+ ++ " and grandparent = " ++ ( show $ fst grandparent ) ++ "/" ++
+ (show $ snd grandparent)
+ where
+ fracNumbers :: [Int]
+ fracNumbers = map read $ splitOn "/" input
+ brother :: (Int , Int)
+ brother = createBrother ( head fracNumbers , last fracNumbers )
+ parent :: (Int , Int )
+ parent = createParent ( head fracNumbers , last fracNumbers ) ( fst brother ,
+ snd brother )
+ uncle :: (Int , Int)
+ uncle = createBrother (fst parent , snd parent)
+ grandparent :: ( Int , Int )
+ grandparent = createParent (fst parent , snd parent) (fst uncle , snd uncle)
diff --git a/challenge-146/ulrich-rieke/perl/ch-1.pl b/challenge-146/ulrich-rieke/perl/ch-1.pl
new file mode 100644
index 0000000000..90c3bcce81
--- /dev/null
+++ b/challenge-146/ulrich-rieke/perl/ch-1.pl
@@ -0,0 +1,23 @@
+#!/usr/bin/perl ;
+use strict ;
+use warnings ;
+use feature 'say' ;
+
+sub isPrime {
+ my $number = shift ;
+ return 1 if ( $number == 2 ) ;
+ for my $i ( 2..int( $number / 2 ) ) {
+ return 0 if $number % $i == 0 ;
+ }
+ return 1 ;
+}
+
+my $current = 1 ;
+my $num_of_primes = 0 ;
+do {
+ $current++ ;
+ if ( isPrime( $current ) ) {
+ $num_of_primes++ ;
+ }
+} while ( $num_of_primes != 10001 ) ;
+say $current ;
diff --git a/challenge-146/ulrich-rieke/perl/ch-2.pl b/challenge-146/ulrich-rieke/perl/ch-2.pl
new file mode 100644
index 0000000000..49d13f5d36
--- /dev/null
+++ b/challenge-146/ulrich-rieke/perl/ch-2.pl
@@ -0,0 +1,81 @@
+#!/usr/bin/perl ;
+use strict ;
+use warnings ;
+use feature 'say' ;
+use List::Util qw ( min max ) ;
+
+sub createParent {
+ my $dividend = shift ;
+ my $divisor = shift ;
+ my $bdividend = shift ;
+ my $bdivisor = shift ;
+ my $product = ( $dividend / $divisor ) * ( $bdividend / $bdivisor ) ;
+ my $firstMin = min( $dividend , $divisor ) ;
+ my $secondMin = min( $bdividend , $bdivisor ) ;
+ if ( $product > 1 ) {
+ return max( $firstMin , $secondMin ) . '/' .
+ min( $firstMin, $secondMin ) ;
+ }
+ if ( $product < 1 ) {
+ return min( $firstMin , $secondMin ) . '/' .
+ max( $firstMin , $secondMin ) ;
+ }
+ if ( $product == 1 ) {
+ return "1/1" ;
+ }
+}
+
+sub createBrother {
+ my @brotherresult ;
+ my $brotherDividend ;
+ my $brotherDivisor ;
+ my $dividend = shift ;
+ my $divisor = shift ;
+ my $maximum = max( $dividend , $divisor ) ;
+ my $minimum = min( $dividend , $divisor ) ;
+ if ( $maximum == $dividend ) {
+ $brotherDivisor = $maximum ;
+ $brotherDividend = $maximum - $minimum ;
+ }
+ else {
+ $brotherDividend = $maximum ;
+ $brotherDivisor = $maximum - $minimum ;
+ }
+ push @brotherresult , $brotherDividend, $brotherDivisor ;
+ return @brotherresult ;
+}
+
+say "Enter a fraction as dividend / divisor!" ;
+my $member = <STDIN> ;
+chomp $member ;
+while ( $member !~ /\A(\d+)\s*\/\s*(\d+)\z/ ) {
+ say "Please enter a fraction as dividend / divisor!" ;
+ $member = <STDIN> ;
+ chomp $member ;
+}
+if ( $member =~ /\A(\d+)\s*\/\s*(\d+)\z/ ) {
+ my $dividend = $1 ;
+ my $divisor = $2 ;
+ if ( $dividend eq '1' && $divisor eq '1' ) {
+ say "parent = and grandparent = " ;
+ }
+ elsif ( $dividend / $divisor == 0.5 || $dividend / $divisor == 2 ) {
+ say "parent = 1/1 and grandparent = !" ;
+ }
+ else {
+ my @brotherFraction = createBrother( $dividend , $divisor ) ;
+ my $parent = createParent( $dividend , $divisor , $brotherFraction[ 0 ] ,
+ $brotherFraction[1] ) ;
+ my $grandParent ;
+ if ( $parent =~ /\A(\d+)\/(\d+)\z/ ) {
+ my @uncle = createBrother( $1 , $2 ) ;
+ $grandParent = createParent( $1 , $2, $uncle[ 0 ] , $uncle[ 1 ] ) ;
+ }
+ if ( $parent ) {
+ print "parent = $parent" ;
+ }
+ if ( $grandParent ) {
+ say " and grandparent = $grandParent" ;
+ }
+ }
+}
diff --git a/challenge-146/ulrich-rieke/raku/ch-1.raku b/challenge-146/ulrich-rieke/raku/ch-1.raku
new file mode 100644
index 0000000000..e2080cf456
--- /dev/null
+++ b/challenge-146/ulrich-rieke/raku/ch-1.raku
@@ -0,0 +1,11 @@
+use v6 ;
+
+my $current = 1 ;
+my $number_of_primes = 0 ;
+repeat {
+ $current++ ;
+ if ( $current.is-prime ) {
+ $number_of_primes++ ;
+ }
+} until ( $number_of_primes == 10001 ) ;
+say $current ;
diff --git a/challenge-146/ulrich-rieke/raku/ch-2.raku b/challenge-146/ulrich-rieke/raku/ch-2.raku
new file mode 100644
index 0000000000..5d7a3c23be
--- /dev/null
+++ b/challenge-146/ulrich-rieke/raku/ch-2.raku
@@ -0,0 +1,93 @@
+use v6 ;
+
+sub myMin( $a , $b ) {
+ if ( $a < $b ) {
+ return $a ;
+ }
+ else {
+ return $b ;
+ }
+}
+
+sub myMax( $a , $b ) {
+ if ( $a > $b ) {
+ return $a ;
+ }
+ else {
+ return $b ;
+ }
+}
+
+sub createParent( $dividend is copy, $divisor is copy , $bdividend is copy ,
+ $bdivisor is copy ) {
+ my $product = ( $dividend / $divisor ) * ( $bdividend / $bdivisor ) ;
+ my $firstMin = myMin( $dividend, $divisor ) ;
+ my $secondMin = myMin( $bdividend, $bdivisor ) ;
+ if ( $product > 1 ) {
+ return myMax( $firstMin, $secondMin ) ~ "/" ~ myMin( $firstMin ,
+ $secondMin) ;
+ }
+ if ( $product < 1 ) {
+ return myMin( $firstMin, $secondMin) ~ "/" ~ myMax( $firstMin ,
+ $secondMin ) ;
+ }
+ if ( $product == 1 ) {
+ return "1/1" ;
+ }
+}
+
+sub createBrother( $dividend is copy, $divisor is copy ) {
+ my @result ;
+ my $maximum ;
+ my $minimum ;
+ if ( $dividend > $divisor ) {
+ $maximum = $dividend ;
+ $minimum = $divisor ;
+ }
+ else {
+ $maximum = $divisor ;
+ $minimum = $dividend ;
+ }
+ my $brotherDividend ;
+ my $brotherDivisor ;
+ if ( $maximum == $dividend ) {
+ $brotherDivisor = $maximum ;
+ $brotherDividend = $maximum - $minimum ;
+ }
+ else {
+ $brotherDividend = $maximum ;
+ $brotherDivisor = $maximum - $minimum ;
+ }
+ @result.push( $brotherDividend , $brotherDivisor ) ;
+ return @result ;
+}
+
+say "Enter a member as as fraction: 'dividend / divisor' !" ;
+my $member = $*IN.get ;
+while ( $member !~~ /^(\d+) \s* '/' \s* (\d+) $/ ) {
+ say "Please enter a fraction as 'dividend / divisor' !" ;
+ $member = $*IN.get ;
+}
+my $dividend = +$0 ;
+my $divisor = +$1 ;
+if ( $dividend == 1 && $divisor == 1 ) {
+ say "parent = " ~ " " ~ " and grandparent =" ~ " " ;
+}
+elsif ( $dividend / $divisor == 0.5 || $dividend / $divisor == 2 ) {
+ say "parent = 1/1 and grandparent = !" ;
+}
+else {
+ my @brotherFraction = createBrother( $dividend , $divisor ) ;
+ my $parent = createParent( $dividend, $divisor , |@brotherFraction ) ;
+ my $grandparent ;
+ if ( $parent ~~ /^(\d+) '/' (\d+) $/ ) {
+ my @uncle = createBrother( +$0 , +$1 ) ;
+ $grandparent = createParent( +$0 , +$1 , |@uncle ) ;
+ }
+ if ( $parent ) {
+ print "parent = $parent " ;
+ }
+ if ( $grandparent ) {
+ say " and grandparent = $grandparent" ;
+ }
+}