diff options
| author | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2021-06-01 08:33:01 +0100 |
|---|---|---|
| committer | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2021-06-01 08:33:01 +0100 |
| commit | 1700afa671115ddf88973030852572fd02158bfa (patch) | |
| tree | a9889678b892fc494665d0f938d40aa3e08a12f2 /challenge-115 | |
| parent | ec35db25313ec68bfca65161d32591d31f730a7f (diff) | |
| download | perlweeklychallenge-club-1700afa671115ddf88973030852572fd02158bfa.tar.gz perlweeklychallenge-club-1700afa671115ddf88973030852572fd02158bfa.tar.bz2 perlweeklychallenge-club-1700afa671115ddf88973030852572fd02158bfa.zip | |
- Added solutions by Ulrich Rieke.
Diffstat (limited to 'challenge-115')
| -rw-r--r-- | challenge-115/ulrich-rieke/cpp/ch-2.cpp | 45 | ||||
| -rw-r--r-- | challenge-115/ulrich-rieke/haskell/ch-1.hs | 20 | ||||
| -rw-r--r-- | challenge-115/ulrich-rieke/haskell/ch-2.hs | 29 | ||||
| -rw-r--r-- | challenge-115/ulrich-rieke/perl/ch-1.pl | 26 | ||||
| -rw-r--r-- | challenge-115/ulrich-rieke/perl/ch-2.pl | 23 | ||||
| -rw-r--r-- | challenge-115/ulrich-rieke/raku/ch-1.raku | 22 | ||||
| -rw-r--r-- | challenge-115/ulrich-rieke/raku/ch-2.raku | 24 |
7 files changed, 189 insertions, 0 deletions
diff --git a/challenge-115/ulrich-rieke/cpp/ch-2.cpp b/challenge-115/ulrich-rieke/cpp/ch-2.cpp new file mode 100644 index 0000000000..7f79eed739 --- /dev/null +++ b/challenge-115/ulrich-rieke/cpp/ch-2.cpp @@ -0,0 +1,45 @@ +#include <list> +#include <iostream> +#include <algorithm> +#include <cmath> + +bool isEven( int i ) { + return (i % 2 == 0) ; +} + +int makeIntFromList( const std::list<int> & my_list ) { + double sum = 0.0 ; + int size = my_list.size( ) ; + int i = size - 1 ; + for ( int num : my_list ) { + sum += num * std::pow( 10.0 , static_cast<double>( i ) ) ; + i-- ; + } + int number = static_cast<int>( sum ) ; + return number ; +} + +int main( ) { + std::cout << "Enter positive integers, -1 to end!\n" ; + int input ; + std::list<int> numbers ; + std::cin >> input ; + while ( input != -1 ) { + numbers.push_back( input ) ; + std::cout << "Next number!\n" ; + std::cin >> input ; + } + if ( std::none_of( numbers.begin( ) , numbers.end( ) , isEven ) ) { + std::cout << "An even number can't be formed!\n" ; + return 1 ; + } + numbers.sort( ) ; + auto found = std::find_if( numbers.begin( ) , numbers.end( ) , + isEven ) ; + int smallestEven = *found ; + numbers.erase( found ) ; + numbers.reverse( ) ; + numbers.push_back( smallestEven ) ; + std::cout << makeIntFromList( numbers ) << std::endl ; + return 0 ; +} diff --git a/challenge-115/ulrich-rieke/haskell/ch-1.hs b/challenge-115/ulrich-rieke/haskell/ch-1.hs new file mode 100644 index 0000000000..a686d65304 --- /dev/null +++ b/challenge-115/ulrich-rieke/haskell/ch-1.hs @@ -0,0 +1,20 @@ +module Challenge115 + where +import Data.List ( nub , sortOn) + +count :: Eq a => a -> [ a ] -> Int +count d theList = length $ filter ( == d ) theList + +solution :: [String] -> Int +solution theList = if countStart == countEnd then 1 else 0 +where + startletters :: [Char] + startletters = map head theList + countStart :: [ (Char , Int) ] + countStart = sortOn fst $ map (\c -> ( c , count c startletters )) + $ nub startletters + endletters :: [Char] + endletters = map last theList + countEnd :: [ (Char , Int) ] + countEnd = sortOn fst $ map (\c -> ( c, count c endletters ) ) + $ nub endletters diff --git a/challenge-115/ulrich-rieke/haskell/ch-2.hs b/challenge-115/ulrich-rieke/haskell/ch-2.hs new file mode 100644 index 0000000000..be3c7b09d4 --- /dev/null +++ b/challenge-115/ulrich-rieke/haskell/ch-2.hs @@ -0,0 +1,29 @@ +module Challenge115_2 + where +import Data.List ( (\\) , sortBy, sort ) +import Data.Char ( intToDigit ) +import qualified Data.Set as S + +--order the digits in descending order, pick out the smallest even digit +--if it exists and put it at the end of the number +--no even number can be produced if all digits are odd + +listToNumber :: [Int] -> Int +listToNumber list = read $ foldl1 ( ++ ) $ map(\i -> [intToDigit i]) list + +--if no even number can be produced 0 is returned +solution :: [ Int ] -> Int +solution list + |all odd list = 0 + |otherwise = listToNumber ((sortedList \\ [smallestEven]) ++ + [smallestEven]) + where + sortedList :: [Int] + sortedList = sortBy myFunc list + myFunc :: Int -> Int -> Ordering + myFunc a b + |a > b = LT + |a == b = EQ + |a < b = GT + smallestEven :: Int + smallestEven = head $ dropWhile ( not . even ) $ reverse sortedList diff --git a/challenge-115/ulrich-rieke/perl/ch-1.pl b/challenge-115/ulrich-rieke/perl/ch-1.pl new file mode 100644 index 0000000000..7a8af57e2f --- /dev/null +++ b/challenge-115/ulrich-rieke/perl/ch-1.pl @@ -0,0 +1,26 @@ +#!/usr/bin/perl ; +use strict ; +use warnings ; +use feature 'say' ; + +say "Enter strings, separated by blanks!" ; +my $line = <STDIN> ; +chomp $line ; +my @strings = split( /\s+/ , $line ) ; +my %startletters ; +my %endletters ; +for my $string ( @strings ) { + $startletters{ substr( $string , 0 , 1 ) }++ ; + $endletters{ substr( $string , length( $string) - 1 , 1 ) }++ ; +} +for my $key ( keys %startletters ) { + if ( not exists $endletters{ $key } ) { + say 0 ; + exit( 0 ) ; + } + if ( $startletters{ $key } != $endletters{ $key } ) { + say 0 ; + exit( 0 ) ; + } +} +say 1 ; diff --git a/challenge-115/ulrich-rieke/perl/ch-2.pl b/challenge-115/ulrich-rieke/perl/ch-2.pl new file mode 100644 index 0000000000..cd6de7029d --- /dev/null +++ b/challenge-115/ulrich-rieke/perl/ch-2.pl @@ -0,0 +1,23 @@ +#!/usr/bin/perl ; +use strict ; +use warnings ; +use feature 'say' ; + +say "Enter a line of single digits, separated by blanks!" ; +my $line = <STDIN> ; +chomp $line ; +my @numbers = split( /\s+/ , $line ) ; +my @sorted = sort { $b <=> $a } @numbers ; +if ( scalar @sorted == scalar ( grep { $_ % 2 == 1 } @sorted ) ) { + say "An even number can't be formed!" ; + exit( 1 ) ; +} +my $len = scalar @sorted ; +my $i = $len ; +do { + --$i ; +} while ( not ( $sorted[ $i ] % 2 == 0 ) ) ; +my $smallestEven = $sorted[ $i ] ; +splice( @sorted , $i , 1 ) ; +push( @sorted , $smallestEven ) ; +say join( '' , @sorted ) ; diff --git a/challenge-115/ulrich-rieke/raku/ch-1.raku b/challenge-115/ulrich-rieke/raku/ch-1.raku new file mode 100644 index 0000000000..61e008e6e1 --- /dev/null +++ b/challenge-115/ulrich-rieke/raku/ch-1.raku @@ -0,0 +1,22 @@ +use v6 ; + +#we form two hashes of start and end letters. If these 2 are equal ( same +#keys , same occurrences of keys) , a ring can be formed, otherwise not + +say "Enter an array of strings, separated by blanks!" ; +my $line = $*IN.get ; +my @strings = $line.split( /\s+/ ) ; +my %startletters ; +my %endletters ; +for @strings -> $string { + %startletters{ $string.substr( 0 , 1 )}++ ; + %endletters{ $string.substr( $string.chars - 1 , 1 )}++ ; +} +for %startletters.keys -> $key { + if ( not (%endletters{ $key }:exists) or %startletters{ $key } ne + %endletters{ $key }) { + say 0 ; + exit( 0 ) ; + } +} +say 1 ; diff --git a/challenge-115/ulrich-rieke/raku/ch-2.raku b/challenge-115/ulrich-rieke/raku/ch-2.raku new file mode 100644 index 0000000000..0ae62b2168 --- /dev/null +++ b/challenge-115/ulrich-rieke/raku/ch-2.raku @@ -0,0 +1,24 @@ +use v6 ; + +#the strategy is : order the list of integers in descending order and put +#the smallest even number at the end + +my @digits ; +say "Enter single digits, separate by blank space!" ; +my $line = $*IN.get ; +@digits = $line.split( /\s+/ ) ; +if ( @digits.grep( { not $_ %% 2 } ).elems == @digits.elems ) { + say "An even digit cannot be formed!" ; +} +else { + my @sorted = @digits.sort( { $^b <=> $^a } ) ; + my $len = @sorted.elems ; + my $i = $len - 1 ; + unless ( @sorted[ $i ] %% 2 ) { + $i-- ; + } + my $smallestEven = @sorted[ $i ] ; + @sorted.splice( $i , 1 ) ; + @sorted.push( $smallestEven) ; + say @sorted.join ; +} |
