aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2020-10-04 14:50:06 +0100
committerGitHub <noreply@github.com>2020-10-04 14:50:06 +0100
commit32ed5e8623e96f35526851f913cb078e4126b3bd (patch)
tree2322c561c0704539bd5f5128fb9d1f63f2993107
parentd77288220b012398f773c15136c631f44a9eb02d (diff)
parentc968277b34cbd8c950128796b46576db53a9c2fc (diff)
downloadperlweeklychallenge-club-32ed5e8623e96f35526851f913cb078e4126b3bd.tar.gz
perlweeklychallenge-club-32ed5e8623e96f35526851f913cb078e4126b3bd.tar.bz2
perlweeklychallenge-club-32ed5e8623e96f35526851f913cb078e4126b3bd.zip
Merge pull request #2445 from ccntrq/challenge-080
Challenge 080
-rw-r--r--challenge-080/alexander-pankoff/README10
-rw-r--r--challenge-080/alexander-pankoff/haskell/ch-1.hs27
-rw-r--r--challenge-080/alexander-pankoff/perl/ch-1.pl18
-rw-r--r--challenge-080/alexander-pankoff/perl/ch-2.pl41
4 files changed, 93 insertions, 3 deletions
diff --git a/challenge-080/alexander-pankoff/README b/challenge-080/alexander-pankoff/README
index f1aacf3dba..a74e2fd1ec 100644
--- a/challenge-080/alexander-pankoff/README
+++ b/challenge-080/alexander-pankoff/README
@@ -1,6 +1,10 @@
Solution by Alexander Pankoff
-# ch-1
+# Run the Haskell solution
-Aproach taken from:
-https://www.geeksforgeeks.org/count-total-set-bits-in-all-numbers-from-1-to-n/
+With a `ghc` installation you can run the haskell solution with `runghc`
+
+```
+$ runghc haskell/ch-1.hs 1 2 3 -1 4
+5
+```
diff --git a/challenge-080/alexander-pankoff/haskell/ch-1.hs b/challenge-080/alexander-pankoff/haskell/ch-1.hs
new file mode 100644
index 0000000000..d27f32fdd7
--- /dev/null
+++ b/challenge-080/alexander-pankoff/haskell/ch-1.hs
@@ -0,0 +1,27 @@
+import System.Environment (getArgs)
+import Data.List (find)
+import qualified Data.Set as Set
+
+type IntegerSet = Set.Set Integer
+
+main :: IO ()
+main = do
+ inputSet <- Set.fromList <$> (readInteger <<$>> getArgs)
+ let maybeMissing = smallestMissingPositiveNumber inputSet
+ maybe
+ (fail "no smallest missing number found.")
+ print
+ maybeMissing
+ where
+ readInteger :: String -> Integer
+ readInteger = read
+
+smallestMissingPositiveNumber :: IntegerSet -> Maybe Integer
+smallestMissingPositiveNumber set = find (not . inSet) [1..]
+ where
+ inSet = (`Set.member` set)
+
+infixl 4 <<$>>
+
+(<<$>>) :: (Functor f, Functor g) => (a -> b) -> f (g a) -> f (g b)
+(<<$>>) = fmap . fmap
diff --git a/challenge-080/alexander-pankoff/perl/ch-1.pl b/challenge-080/alexander-pankoff/perl/ch-1.pl
new file mode 100644
index 0000000000..d6ef9089ee
--- /dev/null
+++ b/challenge-080/alexander-pankoff/perl/ch-1.pl
@@ -0,0 +1,18 @@
+#!/usr/bin/env perl
+use v5.20;
+use utf8;
+use strict;
+use warnings;
+use autodie;
+use feature qw(say signatures);
+no warnings 'experimental::signatures';
+
+use List::Util qw(first);
+
+say smallest_positive_number_missing(@ARGV);
+
+sub smallest_positive_number_missing( @xs) {
+ my %lookup = map { $_ => 1 } @xs;
+ return first { !$lookup{$_} } 1 .. ( @xs + 1 );
+}
+
diff --git a/challenge-080/alexander-pankoff/perl/ch-2.pl b/challenge-080/alexander-pankoff/perl/ch-2.pl
new file mode 100644
index 0000000000..b30e3c2cf0
--- /dev/null
+++ b/challenge-080/alexander-pankoff/perl/ch-2.pl
@@ -0,0 +1,41 @@
+#!/usr/bin/env perl
+use v5.20;
+use utf8;
+use strict;
+use warnings;
+use autodie;
+use feature qw(say signatures);
+no warnings 'experimental::signatures';
+
+use List::Util qw(max sum0);
+
+say count_candies(@ARGV);
+
+sub count_candies(@candidates) {
+ my $descending;
+ my @candies;
+ for my $i ( 0 .. $#candidates ) {
+
+ if ( $i > 0 && $candidates[ $i - 1 ] < $candidates[$i] ) {
+ $candies[$i] = $candies[ $i - 1 ] + 1;
+ }
+ else {
+ $candies[$i] = 1;
+ }
+
+ if ( $i < $#candidates && $candidates[$i] > $candidates[ $i + 1 ] ) {
+ $descending++;
+ }
+ else {
+ while ($descending) {
+ my $candies = $descending + 1;
+ if ( $candies[ $i - $descending ] < $candies ) {
+ $candies[ $i - $descending ] = $candies;
+ }
+ $descending--;
+ }
+ }
+ }
+ return sum0(@candies);
+}
+