From 844e8bf1c77f3a499b49d3be3ccab96f535ebaf3 Mon Sep 17 00:00:00 2001 From: Simon Proctor Date: Wed, 29 Apr 2020 13:33:57 +0100 Subject: Been a busy week. Finally got this one done. --- challenge-058/simon-proctor/raku/ch-1.raku | 49 ++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 challenge-058/simon-proctor/raku/ch-1.raku diff --git a/challenge-058/simon-proctor/raku/ch-1.raku b/challenge-058/simon-proctor/raku/ch-1.raku new file mode 100644 index 0000000000..26c150ecf7 --- /dev/null +++ b/challenge-058/simon-proctor/raku/ch-1.raku @@ -0,0 +1,49 @@ +#!/usr/bin/env raku + +use v6; + +my $matcher = / ^ $ = (\d+)+ % "." ( "_" $ = (\d+) ) ? $ /; + +subset ValidVer of Str where * ~~ $matcher; + +class PWCVersion { + + has @.points; + has Int $.patch; + multi method new ( ::?CLASS:U: ValidVer $str ) { + my $match = $str ~~ $matcher; + + if defined $match[0] { + self.bless( + :points( $match.values.map(*.Int) ), + :patch( $match[0].Int ) + ); + } else { + self.bless( + :points( $match.values.map(*.Int) ), + ); + } + } + + method Str () { + "{@!points.join('.')}{(defined $!patch)?? '_' ~ $!patch !! '' }" + } + + method gist() { self.Str } +} + +multi sub infix: ( PWCVersion $v1, PWCVersion $v2 ) { + return $v1.points cmp $v2.points unless ($v1.points cmp $v2.points) ~~ Same; + + return Same if ! $v1.patch && ! $v2.patch; + return More if $v1.patch && ! $v2.patch; + return Less if ! $v1.patch && $v2.patch; + + return $v1.patch <=> $v2.patch; +} + +sub MAIN( ValidVer $str1, ValidVer $str2 ) { + my $v1 = PWCVersion.new($str1); + my $v2 = PWCVersion.new($str2); + say "$v1 <=> $v2 : {+($v1 cmp $v2)}"; +} -- cgit