aboutsummaryrefslogtreecommitdiff
path: root/challenge-156
diff options
context:
space:
mode:
authorMohammad S Anwar <mohammad.anwar@yahoo.com>2022-03-16 00:02:05 +0000
committerMohammad S Anwar <mohammad.anwar@yahoo.com>2022-03-16 00:02:05 +0000
commit47cc91ffed790a5373e7227d50cbf5e5c68f40ef (patch)
tree2dbefa97d7df8d03aad0bae43b39eae265224097 /challenge-156
parent081071c9a5eb941107c40373971d46f700d1421d (diff)
downloadperlweeklychallenge-club-47cc91ffed790a5373e7227d50cbf5e5c68f40ef.tar.gz
perlweeklychallenge-club-47cc91ffed790a5373e7227d50cbf5e5c68f40ef.tar.bz2
perlweeklychallenge-club-47cc91ffed790a5373e7227d50cbf5e5c68f40ef.zip
- Added solutions by Ulrich Rieke.
Diffstat (limited to 'challenge-156')
-rw-r--r--challenge-156/ulrich-rieke/cpp/ch-1.cpp45
-rw-r--r--challenge-156/ulrich-rieke/haskell/ch-1.hs37
-rw-r--r--challenge-156/ulrich-rieke/haskell/ch-2.hs16
-rw-r--r--challenge-156/ulrich-rieke/perl/ch-1.pl51
-rw-r--r--challenge-156/ulrich-rieke/perl/ch-2.pl40
-rw-r--r--challenge-156/ulrich-rieke/raku/ch-1.raku22
-rw-r--r--challenge-156/ulrich-rieke/raku/ch-2.raku37
7 files changed, 248 insertions, 0 deletions
diff --git a/challenge-156/ulrich-rieke/cpp/ch-1.cpp b/challenge-156/ulrich-rieke/cpp/ch-1.cpp
new file mode 100644
index 0000000000..abcbd0512b
--- /dev/null
+++ b/challenge-156/ulrich-rieke/cpp/ch-1.cpp
@@ -0,0 +1,45 @@
+#include <vector>
+#include <iostream>
+#include <algorithm>
+#include <cmath>
+
+bool isPrime( int n ) {
+ if ( n == 1 )
+ return false ;
+ if ( n == 2 )
+ return true ;
+ int root = static_cast<int>( floor( sqrt( static_cast<double>( n ) ))) ;
+ for ( int i = 2 ; i < root + 1 ; i++ )
+ if ( n % i == 0 )
+ return false ;
+ return true ;
+}
+
+std::vector<int> toBinary( int n ) {
+ std::vector<int> binaryDigits ;
+ while ( n != 0 ) {
+ binaryDigits.push_back( n % 2 ) ;
+ n /= 2 ;
+ }
+ return binaryDigits ;
+}
+
+bool isPernicious( int n ) {
+ std::vector<int> binaryDigits { toBinary( n ) } ;
+ return isPrime( std::count( binaryDigits.begin( ) , binaryDigits.end( ) ,
+ 1 )) ;
+}
+
+int main( ) {
+ std::vector<int> perniciousNumbers ;
+ int current = 0 ;
+ while ( perniciousNumbers.size( ) != 10 ) {
+ current++ ;
+ if ( isPernicious( current ) )
+ perniciousNumbers.push_back( current ) ;
+ }
+ for ( int i : perniciousNumbers )
+ std::cout << i << ' ' ;
+ std::cout << std::endl ;
+ return 0 ;
+}
diff --git a/challenge-156/ulrich-rieke/haskell/ch-1.hs b/challenge-156/ulrich-rieke/haskell/ch-1.hs
new file mode 100644
index 0000000000..bf2ea90b69
--- /dev/null
+++ b/challenge-156/ulrich-rieke/haskell/ch-1.hs
@@ -0,0 +1,37 @@
+module Challenge156
+ where
+import Control.Monad.State.Lazy
+import Data.Maybe ( fromJust )
+import Data.Char ( intToDigit )
+
+findBases :: Int -> State ( Int , String ) String
+findBases theBase = do
+ (number , basenumberstring) <- get
+ if number == 0
+ then return (reverse basenumberstring)
+ else do
+ put ( div number theBase , basenumberstring ++
+ [ fromJust $ lookup ( mod number theBase ) positions ] )
+ findBases theBase
+
+convertToBase :: Int -> Int -> String
+convertToBase number base = evalState (findBases base ) ( number , [] )
+
+isPrime :: Integer -> Bool
+isPrime n
+ |n == 1 = False
+ |n == 2 = True
+ |otherwise = null $ filter (\i -> mod n i == 0 ) [2 .. toInteger root]
+ where
+ root :: Int
+ root = round $ sqrt $ fromIntegral n
+
+positions :: [(Int , Char) ]
+positions = zip [0..35] ( (map intToDigit [0..9]) ++ ['A'..'Z'] )
+
+isPernicious :: Int -> Bool
+isPernicious n = isPrime $ toInteger $ length $ filter ( == '1' )
+$ convertToBase n 2
+
+solution :: [Int]
+solution = take 10 $ filter isPernicious [1 , 2 ..]
diff --git a/challenge-156/ulrich-rieke/haskell/ch-2.hs b/challenge-156/ulrich-rieke/haskell/ch-2.hs
new file mode 100644
index 0000000000..c24db6a493
--- /dev/null
+++ b/challenge-156/ulrich-rieke/haskell/ch-2.hs
@@ -0,0 +1,16 @@
+module Challenge156_2
+ where
+import Data.List ( any , subsequences )
+
+isWeird :: Int -> Bool
+isWeird n = (sum properDivisors > n) && ( not $ any ( == n ) $ map sum $
+filter (\li -> (length li > 1) && (length li < len) ) $ subsequences
+properDivisors )
+where
+ properDivisors :: [Int]
+ properDivisors = [d | d <- [1 .. div n 2 + 1] , mod n d == 0]
+ len :: Int
+ len = length properDivisors
+
+solution :: Int -> Int
+solution n = if isWeird n then 1 else 0
diff --git a/challenge-156/ulrich-rieke/perl/ch-1.pl b/challenge-156/ulrich-rieke/perl/ch-1.pl
new file mode 100644
index 0000000000..0d9e665940
--- /dev/null
+++ b/challenge-156/ulrich-rieke/perl/ch-1.pl
@@ -0,0 +1,51 @@
+#!/usr/bin/perl ;
+use strict ;
+use warnings ;
+use feature 'say' ;
+use POSIX ;
+
+sub isPrime {
+ my $number = shift ;
+ if ( $number == 1 ) {
+ return 0 ;
+ }
+ elsif ( $number == 2 ) {
+ return 1 ;
+ }
+ else {
+ my $root = ceil( sqrt( $number ) ) ;
+ for my $i ( 2 .. $root ) {
+ if ( $number % $i == 0 ) {
+ return 0 ;
+ }
+ }
+ return 1 ;
+ }
+}
+
+sub toBinary {
+ my $num = shift ;
+ my @nums ;
+ while ( $num != 0 ) {
+ my $remainder = $num % 2 ;
+ push @nums, $remainder ;
+ $num = floor ( $num / 2 ) ;
+ }
+ return reverse @nums ;
+}
+
+sub isPernicious {
+ my $number = shift ;
+ my @binary = toBinary( $number ) ;
+ return isPrime( scalar( grep { $_ == 1 } @binary ) ) ;
+}
+
+my @perniciousNumbers ;
+my $current = 0 ;
+while ( scalar( @perniciousNumbers ) != 10 ) {
+ $current++ ;
+ if ( isPernicious( $current ) ) {
+ push @perniciousNumbers, $current ;
+ }
+}
+say join( ',' , @perniciousNumbers ) ;
diff --git a/challenge-156/ulrich-rieke/perl/ch-2.pl b/challenge-156/ulrich-rieke/perl/ch-2.pl
new file mode 100644
index 0000000000..db655eac8a
--- /dev/null
+++ b/challenge-156/ulrich-rieke/perl/ch-2.pl
@@ -0,0 +1,40 @@
+#!/usr/bin/perl ;
+use strict ;
+use warnings ;
+use feature 'say' ;
+use List::Util qw ( sum ) ;
+use Algorithm::Combinatorics qw( combinations ) ;
+
+sub findProperDivisors {
+ my $number = shift ;
+ my @divisors = ( 1 ) ;
+ for my $i ( 2 .. int( $number / 2 ) + 1 ) {
+ if ( $number % $i == 0 ) {
+ push @divisors , $i ;
+ }
+ }
+ return @divisors ;
+}
+
+my $n = $ARGV[0] ;
+my $isWeird = 1 ;
+my @divisors = findProperDivisors( $n ) ;
+if ( sum( @divisors ) <= $n ) {
+ $isWeird = 0 ;
+}
+else {
+ for my $i ( 2 .. scalar( @divisors ) - 1 ) {
+ my $iter = combinations( \@divisors , $i ) ;
+ while ( my $c = $iter->next ) {
+ if ( sum( @$c ) == $n ) {
+ $isWeird = 0 ;
+ }
+ }
+ }
+}
+if ( $isWeird == 1 ) {
+ say 1 ;
+}
+else {
+ say 0 ;
+}
diff --git a/challenge-156/ulrich-rieke/raku/ch-1.raku b/challenge-156/ulrich-rieke/raku/ch-1.raku
new file mode 100644
index 0000000000..eb5005b97a
--- /dev/null
+++ b/challenge-156/ulrich-rieke/raku/ch-1.raku
@@ -0,0 +1,22 @@
+use v6 ;
+
+sub isPernicious( Int $n is copy --> Bool ) {
+ my $binaryString = $n.base( 2 ) ;
+ my $ones = 0 ;
+ for (0 .. $binaryString.chars - 1) -> $i {
+ if ( $binaryString.substr( $i , 1 ) eq "1" ) {
+ $ones++ ;
+ }
+ }
+ return $ones.is-prime ;
+}
+
+my @perniciousNumbers ;
+my $current = 0;
+while ( @perniciousNumbers.elems != 10 ) {
+ $current++ ;
+ if (isPernicious( $current ) ) {
+ @perniciousNumbers.push( $current ) ;
+ }
+}
+say @perniciousNumbers.join( ',' ) ;
diff --git a/challenge-156/ulrich-rieke/raku/ch-2.raku b/challenge-156/ulrich-rieke/raku/ch-2.raku
new file mode 100644
index 0000000000..438e076bc6
--- /dev/null
+++ b/challenge-156/ulrich-rieke/raku/ch-2.raku
@@ -0,0 +1,37 @@
+use v6 ;
+
+sub findDivisors( Int $n is copy ) {
+ my @divisors = ( 1 ) ;
+ my $current = 2 ;
+ while ( $current < $n div 2 + 1 ) {
+ if ( $n %% $current ) {
+ @divisors.push( $current ) ;
+ }
+ $current++ ;
+ }
+ return @divisors ;
+}
+
+sub MAIN( $n is copy ) {
+ my @divisors = findDivisors( $n ) ;
+ my Bool $isWeird = True ;
+ if ( ([+] @divisors) <= $n ) {
+ $isWeird = False ;
+ }
+ else {
+ for ( 2 .. @divisors.elems - 1 ) -> $i {
+ my @sums = @divisors.combinations( $i ).map( {.sum} ) ;
+ for (0 .. @sums.elems - 1 ) -> $j {
+ if ( @sums[ $j ] == $n ) {
+ $isWeird = False ;
+ }
+ }
+ }
+ }
+ if ( $isWeird ) {
+ say 1 ;
+ }
+ else {
+ say 0 ;
+ }
+}