diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2020-03-07 11:09:58 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-03-07 11:09:58 +0000 |
| commit | e2904ae2fd59faa2c7d217e2b650e474d60f2059 (patch) | |
| tree | 9e5e53cdb6ebe0a3bc35a595fc97f323f6dd6c78 | |
| parent | 8b73fa22f41ecdea36f52a49441b901b94094dfa (diff) | |
| parent | 0d04d1169e7ac95141d71d42e11891b3b18c96b5 (diff) | |
| download | perlweeklychallenge-club-e2904ae2fd59faa2c7d217e2b650e474d60f2059.tar.gz perlweeklychallenge-club-e2904ae2fd59faa2c7d217e2b650e474d60f2059.tar.bz2 perlweeklychallenge-club-e2904ae2fd59faa2c7d217e2b650e474d60f2059.zip | |
Merge pull request #1362 from kevincolyer/branch-050
Branch 050
| -rw-r--r-- | challenge-049/kevin-colyer/raku/ch-1.p6 | 6 | ||||
| -rw-r--r-- | challenge-050/kevin-colyer/raku/ch-1.p6 | 45 | ||||
| -rw-r--r-- | challenge-050/kevin-colyer/raku/ch-2.p6 | 54 | ||||
| l--------- | challenge-050/kevincolyer | 1 |
4 files changed, 103 insertions, 3 deletions
diff --git a/challenge-049/kevin-colyer/raku/ch-1.p6 b/challenge-049/kevin-colyer/raku/ch-1.p6 index 8acb119abb..2f8c7b2822 100644 --- a/challenge-049/kevin-colyer/raku/ch-1.p6 +++ b/challenge-049/kevin-colyer/raku/ch-1.p6 @@ -8,11 +8,11 @@ # For given number 55, the smallest multiple is 110 consisting of # digits 0 and 1. - +my Int $z10; sub MAIN(Int $number where * > 1) { - for 1..Inf -> $zero-ones { + for 1..Inf -> Int $zero-ones { # calculate all numbers with 0 or 1's in them (i.e. binary!) - my $z10=$zero-ones.base(2); + $z10=+$zero-ones.base(2); # use the binary string as a decimal value in trial division if $z10 %% $number { say "Smallest multiple of $number that consists of 0's and 1's is {$z10 / $number} gives {$z10} (found in $zero-ones iterations)"; diff --git a/challenge-050/kevin-colyer/raku/ch-1.p6 b/challenge-050/kevin-colyer/raku/ch-1.p6 new file mode 100644 index 0000000000..7b59cd1596 --- /dev/null +++ b/challenge-050/kevin-colyer/raku/ch-1.p6 @@ -0,0 +1,45 @@ +#!perl6 +# Task 1 Challenge 050 Solution by kevincolyer +# Merge Intervals +# Write a script to merge the given intervals where ever possible. +# [2,7], [3,9], [10,12], [15,19], [18,22] +# The script should merge [2, 7] and [3, 9] together to return [2, +# 9]. +# Similarly it should also merge [15, 19] and [18, 22] together +# to return [15, 22]. +# The final result should be something like below: +# [2, 9], [10, 12], [15, 22] + +use Test; + +sub mergeRanges(@ranges,:$verbose=False) { + my @merged; + # sort + my @unmerged=@ranges.sort({ $^a[0] <=> $^b[0] }); + # iterate array + @merged.push(@unmerged.shift); + while @unmerged.elems { + say "un: {@unmerged} merged: {@merged}" if $verbose; + if @merged[*-1][1] >= @unmerged[0][0] { + say " merging a range" if $verbose; + # extend range upwards + @merged[*-1][1] = @unmerged[0][1]; + # remove as now merged + @unmerged.shift; + } else { + say " copying a range" if $verbose; + @merged.push(@unmerged.shift) + } + } + return @merged; +} + + +my @ranges=[2,7], [3,9], [10,12], [15,19], [18,22]; + +is mergeRanges([[2,7],[3,9]]),[2,9],"test merging range works"; +is mergeRanges([[2,5],[6,9]]),([2,5],[6,9]),"test merging range does not works"; +is mergeRanges([[3,9],[2,7]]),[2,9],"test merging range works in wrong order"; +is mergeRanges(@ranges),([2, 9], [10, 12], [15, 22]),"Merges multiple ranges"; + +done-testing; diff --git a/challenge-050/kevin-colyer/raku/ch-2.p6 b/challenge-050/kevin-colyer/raku/ch-2.p6 new file mode 100644 index 0000000000..475a9ed980 --- /dev/null +++ b/challenge-050/kevin-colyer/raku/ch-2.p6 @@ -0,0 +1,54 @@ +#!perl6 +# Task 2 Challenge 050 Solution by kevincolyer +# Contributed by Ryan Thompson.Noble Integer +# You are given a list, @L, of three or more random integers between +# 1 and 50. A Noble Integer is an integer N in @L, such that there +# are exactly N integers greater than N in @L. Output any Noble +# Integer found in @L, or an empty list if none were found. +# An interesting question is whether or not there can be multiple +# Noble Integers in a list. +# For example, +# Suppose we have list of 4 integers [2, 6, 1, 3]. +# Here we have 2 in the above list, known as Noble Integer, since +# there are exactly 2 integers in the list i.e.3 and 6, which are +# greater than 2. +# Therefore the script would print 2. + +use Test; + +# helper sub +sub generateIntegerLists() { + my @list = (1..50).roll xx (3+(0..17).roll); +} + + +sub filterNobelIntegers(@set) { + return if @set.elems < 3; + # reverse the list because if there are two items greater than N then N must == 2 to be a nobel number + # which is the index of the array item becing checked + # for once zero indexed arrays work for us! + my @ordered = @set.sort.reverse; + my @ni; + for 1..^@set.elems -> $i { + if @ordered[$i]==$i { @ni.append: @ordered[$i] }; + } + return @ni; +} + +# Tests +is filterNobelIntegers([2, 6, 1, 3]),(2),"Nobel int found in example"; +is filterNobelIntegers([5, 6, 8, 3]),(3),"Nobel int found"; +is filterNobelIntegers([5, 6, 8, 3,3]),(3),"Nobel int found"; +is filterNobelIntegers([5, 6, 8, 3,3,3]),(3),"Nobel int found"; +done-testing; + +# take 20 random sets and search for Nobel Integers +for ^20 { + my @a = generateIntegerLists(); + my @ni=filterNobelIntegers(@a); + + print @ni.elems > 0 ?? "* " !! " "; + print "[{@a.sort}] does "; + print "not " if @ni.elems==0; + say "have a nobel integer(s) [{@ni}]"; +} diff --git a/challenge-050/kevincolyer b/challenge-050/kevincolyer new file mode 120000 index 0000000000..4e094c2213 --- /dev/null +++ b/challenge-050/kevincolyer @@ -0,0 +1 @@ +/home/kevin/PerlChallenges/perlweeklychallenge-club/challenge-050/kevin-colyer/
\ No newline at end of file |
