aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2019-05-01 11:30:20 +0100
committerGitHub <noreply@github.com>2019-05-01 11:30:20 +0100
commitde15fe19c732b9425edc58c80f172c7d1d5bfd8c (patch)
tree45e6cefd15bc371ea3921e5d64b255f720fd2cfe
parent2f5ee8d01e0212d9c8e587014b0df2710e0b0ef1 (diff)
parent17403fe9f2423fea312e57b752ee465ee2ff6931 (diff)
downloadperlweeklychallenge-club-de15fe19c732b9425edc58c80f172c7d1d5bfd8c.tar.gz
perlweeklychallenge-club-de15fe19c732b9425edc58c80f172c7d1d5bfd8c.tar.bz2
perlweeklychallenge-club-de15fe19c732b9425edc58c80f172c7d1d5bfd8c.zip
Merge pull request #109 from Scimon/master
Challenge 1
-rwxr-xr-xchallenge-006/simon-proctor/perl6/ch-1.p654
1 files changed, 54 insertions, 0 deletions
diff --git a/challenge-006/simon-proctor/perl6/ch-1.p6 b/challenge-006/simon-proctor/perl6/ch-1.p6
new file mode 100755
index 0000000000..00dca1a540
--- /dev/null
+++ b/challenge-006/simon-proctor/perl6/ch-1.p6
@@ -0,0 +1,54 @@
+#!/usr/bin/env perl6
+
+use v6;
+
+class GrowableRange {
+ has Int $.min;
+ has Int $.max;
+
+ submethod BUILD( Int :$!min, Int :$!max ) {}
+
+ method next() { $!max + 1 }
+
+ method grow() { $!max++; return self }
+
+ method gist() { $!min == $!max ?? $!min.Str !! "{$!min}-{$!max}" }
+
+ method Str() { self.gist }
+}
+
+sub USAGE { say $*USAGE }
+
+#| Display Help file
+multi sub MAIN ( Bool :h($help) where *.so ) { USAGE(); }
+
+#| Get the shortend list of a CSV string
+multi sub MAIN (
+ Str $number-string where * ~~ /^ \d+ [ ',' \d+ ]* $/ #= Comma seperated list of numbers
+) {
+ my Int @in = [$_.Int for $number-string.split(",")].sort( * <=> * );
+ say process-list( @in );
+}
+
+#| Get the shorted list of a space seperated list of number
+multi sub MAIN (
+ *@numbers where { all($_) ~~ IntStr } #= List of integers
+) {
+ my Int @in = [$_.Int for @numbers].sort( * <=> * );
+ say process-list( @in );
+}
+
+sub process-list( Int @numbers ) {
+ my $current;
+ my @out;
+
+ for @numbers -> $number {
+ if @out.elems == 0 || @out[*-1].next != $number {
+ @out.push( GrowableRange.new( min => $number, max => $number ) );
+ } else {
+ @out[*-1].grow;
+ }
+ }
+
+ return @out.join(",");
+}