diff options
| author | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2022-01-04 22:23:00 +0000 |
|---|---|---|
| committer | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2022-01-04 22:23:00 +0000 |
| commit | 193cf97fb78400ef9659a67f506cec6b1179c40e (patch) | |
| tree | 71f75baa6eeb69731911852f9182fc71c16bff3c /challenge-146 | |
| parent | af32440afeb5e13f3b57b154ba27cfba2efd4fce (diff) | |
| download | perlweeklychallenge-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.cpp | 23 | ||||
| -rw-r--r-- | challenge-146/ulrich-rieke/cpp/ch-2.cpp | 70 | ||||
| -rw-r--r-- | challenge-146/ulrich-rieke/haskell/ch-1.hs | 14 | ||||
| -rw-r--r-- | challenge-146/ulrich-rieke/haskell/ch-2.hs | 47 | ||||
| -rw-r--r-- | challenge-146/ulrich-rieke/perl/ch-1.pl | 23 | ||||
| -rw-r--r-- | challenge-146/ulrich-rieke/perl/ch-2.pl | 81 | ||||
| -rw-r--r-- | challenge-146/ulrich-rieke/raku/ch-1.raku | 11 | ||||
| -rw-r--r-- | challenge-146/ulrich-rieke/raku/ch-2.raku | 93 |
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" ; + } +} |
