aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--challenge-078/jeongoon/haskell/ch-2.hs8
-rw-r--r--challenge-078/jeongoon/perl/ch-1.pl21
-rw-r--r--challenge-078/jeongoon/perl/ch-2.pl21
-rw-r--r--challenge-078/jeongoon/raku/ch-1.raku22
-rw-r--r--challenge-078/jeongoon/raku/ch-2.raku32
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 );
+}