aboutsummaryrefslogtreecommitdiff
path: root/challenge-115
diff options
context:
space:
mode:
authorMohammad S Anwar <mohammad.anwar@yahoo.com>2021-06-01 08:33:01 +0100
committerMohammad S Anwar <mohammad.anwar@yahoo.com>2021-06-01 08:33:01 +0100
commit1700afa671115ddf88973030852572fd02158bfa (patch)
treea9889678b892fc494665d0f938d40aa3e08a12f2 /challenge-115
parentec35db25313ec68bfca65161d32591d31f730a7f (diff)
downloadperlweeklychallenge-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.cpp45
-rw-r--r--challenge-115/ulrich-rieke/haskell/ch-1.hs20
-rw-r--r--challenge-115/ulrich-rieke/haskell/ch-2.hs29
-rw-r--r--challenge-115/ulrich-rieke/perl/ch-1.pl26
-rw-r--r--challenge-115/ulrich-rieke/perl/ch-2.pl23
-rw-r--r--challenge-115/ulrich-rieke/raku/ch-1.raku22
-rw-r--r--challenge-115/ulrich-rieke/raku/ch-2.raku24
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 ;
+}