diff options
| author | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2022-04-05 21:38:59 +0100 |
|---|---|---|
| committer | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2022-04-05 21:38:59 +0100 |
| commit | b2ad01584238b6bf7603faeb2748d93d431345a6 (patch) | |
| tree | 7262cba82ffdeaf2db763bd0753b437ee43f3dc4 /challenge-159 | |
| parent | 6aa5c270464f36c0fb846c3dfd8b95db8dc2fa66 (diff) | |
| download | perlweeklychallenge-club-b2ad01584238b6bf7603faeb2748d93d431345a6.tar.gz perlweeklychallenge-club-b2ad01584238b6bf7603faeb2748d93d431345a6.tar.bz2 perlweeklychallenge-club-b2ad01584238b6bf7603faeb2748d93d431345a6.zip | |
- Added solutions by Ulrich Rieke.
Diffstat (limited to 'challenge-159')
| -rw-r--r-- | challenge-159/ulrich-rieke/cpp/ch-1.cpp | 35 | ||||
| -rw-r--r-- | challenge-159/ulrich-rieke/cpp/ch-2.cpp | 41 | ||||
| -rw-r--r-- | challenge-159/ulrich-rieke/haskell/ch-1.hs | 36 | ||||
| -rw-r--r-- | challenge-159/ulrich-rieke/haskell/ch-2.hs | 45 | ||||
| -rw-r--r-- | challenge-159/ulrich-rieke/perl/ch-1.pl | 72 | ||||
| -rw-r--r-- | challenge-159/ulrich-rieke/perl/ch-2.pl | 45 | ||||
| -rw-r--r-- | challenge-159/ulrich-rieke/raku/ch-1.raku | 28 | ||||
| -rw-r--r-- | challenge-159/ulrich-rieke/raku/ch-2.raku | 37 |
8 files changed, 339 insertions, 0 deletions
diff --git a/challenge-159/ulrich-rieke/cpp/ch-1.cpp b/challenge-159/ulrich-rieke/cpp/ch-1.cpp new file mode 100644 index 0000000000..fd619c7af4 --- /dev/null +++ b/challenge-159/ulrich-rieke/cpp/ch-1.cpp @@ -0,0 +1,35 @@ +#include <vector> +#include <iostream> +#include <numeric> +#include <utility> +#include <cstdlib> +#include <algorithm> + +int main( int argc, char * argv[] ) { + int n = std::atoi( argv[1] ) ; + while ( n <= 0 ) { + std::cout << "Please enter an integer greater than 0!\n" ; + std::cin >> n ; + } + std::vector<int> numerators( n ) ; + std::vector<int> denominators( n + 1 ) ; + std::iota( numerators.begin( ) , numerators.end( ) , 1) ; + std::iota( denominators.begin( ) , denominators.end( ) , 0 ) ; + std::vector<std::pair<int, int>> fractions ; + fractions.push_back( std::make_pair( 0 , 1 ) ) ; + for ( int i : numerators ) { + for ( int j : denominators ) { + if ( i < j && (std::lcm( i , j ) == i * j)) { + fractions.push_back( std::make_pair( i , j )) ; + } + } + } + std::sort( fractions.begin( ) , fractions.end( ) , + []( const auto & a, const auto & b ) { return + (static_cast<double>(a.first) / static_cast<double>(a.second)) < + (static_cast<double>(b.first) / static_cast<double>(b.second));} ); + for ( auto & p : fractions ) + std::cout << p.first << '/' << p.second << ", " ; + std::cout << "1/1" << std::endl ; + return 0 ; +} diff --git a/challenge-159/ulrich-rieke/cpp/ch-2.cpp b/challenge-159/ulrich-rieke/cpp/ch-2.cpp new file mode 100644 index 0000000000..85ae8382fe --- /dev/null +++ b/challenge-159/ulrich-rieke/cpp/ch-2.cpp @@ -0,0 +1,41 @@ +#include <iostream> +#include <vector> +#include <set> +#include <cstdlib> + +//the smallest current divisor of a number is a prime number +std::vector<int> primeDecompose( int n ) { + std::vector<int> primes ; + int current = 2 ; + while ( n != 1 ) { + if ( n % current == 0 ) { + primes.push_back( current ) ; + n /= current ; + } + else + current++ ; + } + return primes ; +} + +int main( int argc, char * argv[] ) { + int n = std::atoi( argv[1] ) ; + while ( n <= 0 ) { + std::cout << "Please enter a number greater than 0!\n" ; + std::cin >> n ; + } + std::vector<int> primes { primeDecompose( n ) } ; + std::set<int> uniqueNums( primes.begin( ) , primes.end( ) ) ; + int pl = primes.size( ) ; + int ul = uniqueNums.size( ) ; + if ( pl == ul ) { + if ( pl % 2 == 0 ) + std::cout << 1 ; + else + std::cout << -1 ; + } + else + std::cout << 0 ; + std::cout << std::endl ; + return 0 ; +} diff --git a/challenge-159/ulrich-rieke/haskell/ch-1.hs b/challenge-159/ulrich-rieke/haskell/ch-1.hs new file mode 100644 index 0000000000..84c43f6cf3 --- /dev/null +++ b/challenge-159/ulrich-rieke/haskell/ch-1.hs @@ -0,0 +1,36 @@ +module Challenge159 + where +import Control.Applicative +import Data.List ( sortBy ) + +keepAskingForInput :: IO Int +keepAskingForInput = do + putStrLn "Please enter a number greater than 0!" + number <- getLine + if ( read number ) > 0 then return $ read number + else do + keepAskingForInput + +solution :: Int -> [String] +solution n = + let pairs = (,) <$> [1 .. n - 1] <*> [1 .. n] + fractions = filter (\p -> (fst p < snd p) && lcm ( fst p ) ( snd p) + == ( (fst p) * ( snd p ))) pairs + sorted = sortBy mySorter fractions + in ["0/1"] ++ map (\p -> (show $ fst p ) ++ "/" ++ ( show $ snd p )) + sorted ++ ["1/1"] + +mySorter :: (Int, Int) -> (Int,Int) -> Ordering +mySorter (a , b ) ( c , d ) + |firstFrac < secondFrac = LT + |firstFrac == secondFrac = EQ + |firstFrac > secondFrac = GT + where + firstFrac = fromIntegral a / fromIntegral b + secondFrac = fromIntegral c / fromIntegral d + +main :: IO ( ) +main = do + n <- keepAskingForInput + list <- return $ solution n + print list diff --git a/challenge-159/ulrich-rieke/haskell/ch-2.hs b/challenge-159/ulrich-rieke/haskell/ch-2.hs new file mode 100644 index 0000000000..1140981ce2 --- /dev/null +++ b/challenge-159/ulrich-rieke/haskell/ch-2.hs @@ -0,0 +1,45 @@ +module Challenge159_2 + where +import Control.Monad.State.Lazy +import Data.List ( nub ) + +divisors :: Int -> [Int] +divisors n = [d | d <- [2..n] , mod n d == 0] + +decompose :: State (Int , [Int]) [Int] +decompose = do + (d , factors ) <- get + if d == 1 + then return factors + else do + put ( div d ( head $ divisors d ) , factors ++ [ head $ divisors d]) + decompose + +myFactors :: Int -> [Int] +myFactors n = evalState decompose ( n , [] ) + +keepAskingForInput :: IO Int +keepAskingForInput = do + putStrLn "Please enter a number greater than 0!" + number <- getLine + if ( read number ) > 0 then return $ read number + else do + keepAskingForInput + +solution :: Int -> Int +solution n + |len1 == len2 && even len1 = 1 + |len1 == len2 && odd len1 = -1 + |otherwise = 0 + where + factors :: [Int] + factors = myFactors n + len1 :: Int + len1 = length factors + len2 :: Int + len2 = length $ nub factors + +main :: IO ( ) +main = do + n <- keepAskingForInput + putStrLn $ show $ solution n diff --git a/challenge-159/ulrich-rieke/perl/ch-1.pl b/challenge-159/ulrich-rieke/perl/ch-1.pl new file mode 100644 index 0000000000..0ce8192017 --- /dev/null +++ b/challenge-159/ulrich-rieke/perl/ch-1.pl @@ -0,0 +1,72 @@ +#!/usr/bin/perl ; +use strict ; +use warnings ; +use feature 'say' ; + +sub primeDecomposition { + my $number = shift ; + my @primes ; + my $current = 2 ; + do { + if ( $number % $current == 0 ) { + push @primes , $current ; + $number /= $current ; + } + else { + $current++ ; + } + } until ( $number == 1 ) ; + return @primes ; +} + +sub myOrder { ($a->[0] / $a->[1]) <=> ($b->[0] / $b->[1] ) } + +sub isCoprime { + my $numbera = shift ; + my $numberb = shift ; + my @firstPrimes = primeDecomposition( $numbera ) ; + my @secondPrimes = primeDecomposition( $numberb ) ; + my %firstFactors ; + for my $n ( @firstPrimes ) { + $firstFactors{$n}++ ; + } + my %secondFactors ; + for my $n ( @secondPrimes ) { + $secondFactors{$n}++ ; + } + my @common ; + for my $n ( keys %firstFactors ) { + if ( exists( $secondFactors{$n} ) ) { + push @common , $n ; + } + } + if ( scalar( @common ) == 0 ) { + return 1 ; + } + else { + return 0 ; + } +} + +my $n = $ARGV[0] ; +while ( $n <= 0 ) { + say "enter a number greater than 0! Re-enter!" ; + $n = <STDIN> ; + chomp $n ; +} +#find all coprime pairs of numerators and denominators between 1 and n - 1 +#and n respectively and order them in ascending order +my @pairs ; +push @pairs , [0 , 1] ; +for my $num (1 .. $n - 1) { + for my $denom( 0 .. $n ) { + if ( ($num < $denom ) && isCoprime( $num , $denom ) ) { + push @pairs , [$num , $denom] ; + } + } +} +my @sorted = sort myOrder @pairs ; +for my $p ( @sorted ) { + print "$p->[0]/$p->[1], " ; +} +say "1/1" ; diff --git a/challenge-159/ulrich-rieke/perl/ch-2.pl b/challenge-159/ulrich-rieke/perl/ch-2.pl new file mode 100644 index 0000000000..cd2862013a --- /dev/null +++ b/challenge-159/ulrich-rieke/perl/ch-2.pl @@ -0,0 +1,45 @@ +#!/usr/bin/perl ; +use strict ; +use warnings ; +use feature 'say' ; + +sub primeDecomposition { + my $number = shift ; + my @primes ; + my $current = 2 ; + do { + if ( $number % $current == 0 ) { + push @primes , $current ; + $number /= $current ; + } + else { + $current++ ; + } + } until ( $number == 1 ) ; + return @primes ; +} + +my $n = $ARGV[0] ; +while ( $n <= 0 ) { + say "Only positive integers are allowed!" ; + $n = <STDIN> ; + chomp $n ; +} +my %primeFactors ; +my @primes = primeDecomposition( $n ) ; +for my $p ( @primes ) { + $primeFactors{$p}++ ; +} +my $primesLen = scalar( @primes ) ; +my $factorLen = scalar( keys %primeFactors ) ; +if ( $primesLen == $factorLen ) { #square-free + if ( $primesLen % 2 == 0 ) { + say 1 ; + } + else { + say -1 ; + } +} +else { + say 0 ; +} diff --git a/challenge-159/ulrich-rieke/raku/ch-1.raku b/challenge-159/ulrich-rieke/raku/ch-1.raku new file mode 100644 index 0000000000..15691e9e97 --- /dev/null +++ b/challenge-159/ulrich-rieke/raku/ch-1.raku @@ -0,0 +1,28 @@ +use v6 ; +#find all numbers from 1 to n - 1 in the numerator and from 1 to n +#in the denominator where numerator and denominator are coprime to +#each other and order them in ascending order + +subset Positive of Int where * > 0 ; + +sub pairorder { ($^a[0] / $^a[1]) <=> ($^b[0] / $^b[1]) } + +sub MAIN( Positive $n is copy ) { + my @numerators = (1 .. $n - 1 ) ; + my @denominators = (1 .. $n ) ; + my @fractions ; + @fractions.push( (0 , 1 ) ) ; + for @numerators -> $num { + for @denominators -> $denom { + if ( ($num < $denom) && ($num lcm $denom == + $num * $denom) ) { + @fractions.push( ($num , $denom) ) ; + } + } + } + my @sorted = @fractions.sort( &pairorder ) ; + for @sorted -> $pair { + print "$pair[0]/$pair[1], " ; + } + say "1/1" ; +} diff --git a/challenge-159/ulrich-rieke/raku/ch-2.raku b/challenge-159/ulrich-rieke/raku/ch-2.raku new file mode 100644 index 0000000000..bc66f875b3 --- /dev/null +++ b/challenge-159/ulrich-rieke/raku/ch-2.raku @@ -0,0 +1,37 @@ +use v6 ; + +#for theoretical reasons, the smallest divisor of a number must be prime + +subset Positive of Int where * > 0 ; +sub primeDecomposition( Positive $n is copy ) { + my @primeNumbers ; + my $current = 1 ; + while ( $n != 1 ) { + repeat { + $current++ ; + } until ( $n %% $current ) ; + @primeNumbers.push( $current ) ; + $n div= $current ; + $current-- ; # a prime factor might be repeated, in the non-squarefree + # numbers + } + return @primeNumbers ; +} + +sub MAIN( Positive $n is copy ) { + my @primeNumbers = primeDecomposition( $n ) ; + my $primeSet = @primeNumbers.Set ; + my $setLen = $primeSet.elems ; + my $arrayLen = @primeNumbers.elems ; + if ( $setLen == $arrayLen ) { # square-free! + if ( $arrayLen %% 2 ) { + say 1 ; + } + else { + say -1 ; + } + } + else { + say 0 ; + } +} |
