aboutsummaryrefslogtreecommitdiff
path: root/challenge-159
diff options
context:
space:
mode:
authorMohammad S Anwar <mohammad.anwar@yahoo.com>2022-04-05 21:38:59 +0100
committerMohammad S Anwar <mohammad.anwar@yahoo.com>2022-04-05 21:38:59 +0100
commitb2ad01584238b6bf7603faeb2748d93d431345a6 (patch)
tree7262cba82ffdeaf2db763bd0753b437ee43f3dc4 /challenge-159
parent6aa5c270464f36c0fb846c3dfd8b95db8dc2fa66 (diff)
downloadperlweeklychallenge-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.cpp35
-rw-r--r--challenge-159/ulrich-rieke/cpp/ch-2.cpp41
-rw-r--r--challenge-159/ulrich-rieke/haskell/ch-1.hs36
-rw-r--r--challenge-159/ulrich-rieke/haskell/ch-2.hs45
-rw-r--r--challenge-159/ulrich-rieke/perl/ch-1.pl72
-rw-r--r--challenge-159/ulrich-rieke/perl/ch-2.pl45
-rw-r--r--challenge-159/ulrich-rieke/raku/ch-1.raku28
-rw-r--r--challenge-159/ulrich-rieke/raku/ch-2.raku37
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 ;
+ }
+}