diff options
| -rw-r--r-- | challenge-078/jeongoon/haskell/ch-2.hs | 8 | ||||
| -rw-r--r-- | challenge-078/jeongoon/perl/ch-1.pl | 21 | ||||
| -rw-r--r-- | challenge-078/jeongoon/perl/ch-2.pl | 21 | ||||
| -rw-r--r-- | challenge-078/jeongoon/raku/ch-1.raku | 22 | ||||
| -rw-r--r-- | challenge-078/jeongoon/raku/ch-2.raku | 32 |
5 files changed, 99 insertions, 5 deletions
diff --git a/challenge-078/jeongoon/haskell/ch-2.hs b/challenge-078/jeongoon/haskell/ch-2.hs index 1083b9bbd7..e9203ac459 100644 --- a/challenge-078/jeongoon/haskell/ch-2.hs +++ b/challenge-078/jeongoon/haskell/ch-2.hs @@ -1,16 +1,14 @@ import System.Environment -import Data.List +import Data.List (mapAccumL) import Data.Char (isNumber) import Data.Maybe (catMaybes) -- tested with: runhaskell ch-2.hs 7 4 2 6 3 / 1 3 4 -- use any non-digit value as a separator between @A and @B -unsafe_mapLeftRotate ls rotates = - scanl (\ls' n -> (drop n ls') ++ (take n ls')) ls rotates - +unsafe_mapLeftRotate ls = map (\r -> (drop r ls) ++ (take r ls) ) parseNumbers = catMaybes.map (\nStr -> if (all isNumber nStr) then Just(read nStr:: Int) else Nothing) -main = do (mapM_ print.tail. +main = do (mapM_ print. uncurry unsafe_mapLeftRotate.(\(a,b) -> (a, parseNumbers b))) =<< (span (all isNumber)) `fmap` getArgs diff --git a/challenge-078/jeongoon/perl/ch-1.pl b/challenge-078/jeongoon/perl/ch-1.pl new file mode 100644 index 0000000000..10b5f9d804 --- /dev/null +++ b/challenge-078/jeongoon/perl/ch-1.pl @@ -0,0 +1,21 @@ +#!/usr/bin/env perl + +use strict; use warnings; +use v5.26; + +use List::Util qw(any min); + +# tested with: perl ch-1.pl 9 10 7 5 6 1 + +sub leaderElement { + @_ > 0 or return (0); # this is the only case of result [0] + my @rList = reverse @_; + my $curLeader = -1 + min @rList; # pseudo first leader + # to work alwo with negative values + reverse map { $curLeader <= $_ ? $curLeader = $_ : () } @rList; +} + +any { /^(-h|--*help)$/ } @ARGV and say("perl ch-1.pl <integer> ..."), exit 1; + +my @answer = leaderElement( grep { int($_) eq $_ } @ARGV ); +say "(@answer)"; diff --git a/challenge-078/jeongoon/perl/ch-2.pl b/challenge-078/jeongoon/perl/ch-2.pl new file mode 100644 index 0000000000..fbf01989e9 --- /dev/null +++ b/challenge-078/jeongoon/perl/ch-2.pl @@ -0,0 +1,21 @@ +#!/usr/bin/env perl + +# tested with: raku ch-1.raku 7 4 2 6 3 / 1 3 4 + +use strict; use warnings; +use v5.26; +use List::MoreUtils qw(firstidx); + +sub leftRotate ($$) { + my ($A, $B) = @_; + ($A->$#* > 0 and $B->$#* > 0) or return ($A); + map { if ( $_ > $A->$#* ) { warn "$_: out of range: do not change"; $A } + else { [ $A->@[ $_ ..$A->$#*, 0..$_-1 ] ] } + } $B->@*; +} + +my $sep_pos = firstidx { !/[+-]*[1-9][0-9]*/ } @ARGV; +my @answer = leftRotate( [ @ARGV[ 0.. ($sep_pos-1) ] ], + [ @ARGV[ $sep_pos+1 .. $#ARGV ] ] ); + +say "(@$_)" for @answer; diff --git a/challenge-078/jeongoon/raku/ch-1.raku b/challenge-078/jeongoon/raku/ch-1.raku new file mode 100644 index 0000000000..311dc35557 --- /dev/null +++ b/challenge-078/jeongoon/raku/ch-1.raku @@ -0,0 +1,22 @@ +#!/usr/bin/env raku +# -*- Mode: Raku; indent-tabs-mode: nil; coding: utf-8 -*- +# vim: set et ts=4 sw=4: + +use v6.d; + +# tested with: raku ch-1.raku 9 10 7 5 6 1 + +role leader-element { + method get-leaders( @I = self».Int ) { + @I.elems > 0 or (0).List.return; + my $cur-leader = -1 + @I.min; # pseudo first leader + @I.reverse.map(->\n + { $cur-leader <= n + ?? |($cur-leader = n).cache !! Empty } ).reverse.List; + } +} + +sub MAIN (*@I where { @I.all ~~ Int }) { + my $I = @I does leader-element; + $I.get-leaders.say; +} diff --git a/challenge-078/jeongoon/raku/ch-2.raku b/challenge-078/jeongoon/raku/ch-2.raku new file mode 100644 index 0000000000..8ced045e84 --- /dev/null +++ b/challenge-078/jeongoon/raku/ch-2.raku @@ -0,0 +1,32 @@ +#!/usr/bin/env raku +# -*- Mode: Raku; indent-tabs-mode: nil; coding: utf-8 -*- +# vim: set et ts=4 sw=4: + +use v6.d; + +sub USAGE { + # tested with: raku ch-1.raku 7 4 2 6 3 / 1 3 4 + "Usage: raku ch-2.raku 10 20 30 40 50 60 <sep> 1 3 4" ~ + " <sep> can be simply '/' or any other character.".say +} + +role left-rotate { + method map-left-rotate ( @B ) { + with self { (.elems > 0 and @B.elems > 0 ) or .return; # minimum santiy check + @B.map(-> $i { + if $i > .end { # little bit more safety check + warn "$i is out of range: skipped"; + .[0..*] # do not change + } + |.[$i..*], |.[0..$i-1] } ); + } + } +} + +sub MAIN ( *@args ) { + my $sep-pos = @args.first: * !~~ Int, :k; + my $a = @args.head($sep-pos) does left-rotate; + $a.map-left-rotate( @args.tail(@args.elems - $sep-pos - 1) + .grep( * ~~ Int ) ) + .map( *.say ); +} |
