diff options
| author | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2022-03-16 00:02:05 +0000 |
|---|---|---|
| committer | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2022-03-16 00:02:05 +0000 |
| commit | 47cc91ffed790a5373e7227d50cbf5e5c68f40ef (patch) | |
| tree | 2dbefa97d7df8d03aad0bae43b39eae265224097 /challenge-156 | |
| parent | 081071c9a5eb941107c40373971d46f700d1421d (diff) | |
| download | perlweeklychallenge-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.cpp | 45 | ||||
| -rw-r--r-- | challenge-156/ulrich-rieke/haskell/ch-1.hs | 37 | ||||
| -rw-r--r-- | challenge-156/ulrich-rieke/haskell/ch-2.hs | 16 | ||||
| -rw-r--r-- | challenge-156/ulrich-rieke/perl/ch-1.pl | 51 | ||||
| -rw-r--r-- | challenge-156/ulrich-rieke/perl/ch-2.pl | 40 | ||||
| -rw-r--r-- | challenge-156/ulrich-rieke/raku/ch-1.raku | 22 | ||||
| -rw-r--r-- | challenge-156/ulrich-rieke/raku/ch-2.raku | 37 |
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 ; + } +} |
