From b000e02c450ca4cbeb7683502a6918d38215eeca Mon Sep 17 00:00:00 2001 From: Simon Proctor Date: Mon, 29 Apr 2019 14:22:32 +0100 Subject: Challenge 1 --- challenge-006/simon-proctor/perl6/ch-1.p6 | 54 +++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100755 challenge-006/simon-proctor/perl6/ch-1.p6 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..35a2cb9691 --- /dev/null +++ b/challenge-006/simon-proctor/perl6/ch-1.p6 @@ -0,0 +1,54 @@ +#!/usr/bin/env perl6 + +use v6; + +role 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(","); +} -- cgit