aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--challenge-189/adam-russell/blog.txt1
-rw-r--r--challenge-189/adam-russell/blog1.txt1
-rw-r--r--challenge-189/adam-russell/perl/ch-1.pl20
-rw-r--r--challenge-189/adam-russell/perl/ch-2.pl39
-rw-r--r--challenge-189/adam-russell/prolog/ch-1.p20
-rw-r--r--challenge-189/adam-russell/prolog/ch-2.p29
6 files changed, 110 insertions, 0 deletions
diff --git a/challenge-189/adam-russell/blog.txt b/challenge-189/adam-russell/blog.txt
new file mode 100644
index 0000000000..144670ab98
--- /dev/null
+++ b/challenge-189/adam-russell/blog.txt
@@ -0,0 +1 @@
+http://www.rabbitfarm.com/cgi-bin/blosxom/perl/2022/11/06 \ No newline at end of file
diff --git a/challenge-189/adam-russell/blog1.txt b/challenge-189/adam-russell/blog1.txt
new file mode 100644
index 0000000000..0c6499c738
--- /dev/null
+++ b/challenge-189/adam-russell/blog1.txt
@@ -0,0 +1 @@
+http://www.rabbitfarm.com/cgi-bin/blosxom/prolog/2022/11/06 \ No newline at end of file
diff --git a/challenge-189/adam-russell/perl/ch-1.pl b/challenge-189/adam-russell/perl/ch-1.pl
new file mode 100644
index 0000000000..3fb4c95ccc
--- /dev/null
+++ b/challenge-189/adam-russell/perl/ch-1.pl
@@ -0,0 +1,20 @@
+use v5.36;
+use strict;
+use warnings;
+##
+# You are given an array of characters (a..z) and a target character.
+# Write a script to find out the smallest character in the given array lexicographically
+# greater than the target character.
+##
+sub greatest_character{
+ my($characters, $target) = @_;
+ return [sort {$a cmp $b} grep {$_ gt $target} @{$characters}]->[0] || $target;
+}
+
+MAIN:{
+ say greatest_character([qw/e m u g/], q/b/);
+ say greatest_character([qw/d c e f/], q/a/);
+ say greatest_character([qw/j a r/], q/o/);
+ say greatest_character([qw/d c a f/], q/a/);
+ say greatest_character([qw/t g a l/], q/v/);
+} \ No newline at end of file
diff --git a/challenge-189/adam-russell/perl/ch-2.pl b/challenge-189/adam-russell/perl/ch-2.pl
new file mode 100644
index 0000000000..de4c4d8547
--- /dev/null
+++ b/challenge-189/adam-russell/perl/ch-2.pl
@@ -0,0 +1,39 @@
+use v5.36;
+use strict;
+use warnings;
+##
+# You are given an array of 2 or more non-negative integers.
+# Write a script to find out the smallest slice, i.e. contiguous
+# subarray of the original array, having the degree of the given array.
+##
+sub array_degree{
+ my(@integers) = @_;
+ my @counts;
+ map { $counts[$_]++ } @integers;
+ @counts = grep {defined} @counts;
+ return [sort {$b <=> $a} @counts]->[0];
+}
+
+sub least_slice_degree{
+ my(@integers) = @_;
+ my @minimum_length_slice;
+ my $minimum_length = @integers;
+ my $array_degree = array_degree(@integers);
+ for my $i (0 .. @integers - 1){
+ for my $j ($i + 1 .. @integers - 1){
+ if(array_degree(@integers[$i .. $j]) == $array_degree && @integers[$i .. $j] < $minimum_length){
+ @minimum_length_slice = @integers[$i .. $j];
+ $minimum_length = @minimum_length_slice;
+ }
+ }
+ }
+ return @minimum_length_slice;
+}
+
+MAIN:{
+ say "(" . join(", ", least_slice_degree(1, 3, 3, 2)) . ")";
+ say "(" . join(", ", least_slice_degree(1, 2, 1)) . ")";
+ say "(" . join(", ", least_slice_degree(1, 3, 2, 1, 2)) . ")";
+ say "(" . join(", ", least_slice_degree(1, 1 ,2 ,3, 2)) . ")";
+ say "(" . join(", ", least_slice_degree(2, 1, 2, 1, 1)) . ")";
+} \ No newline at end of file
diff --git a/challenge-189/adam-russell/prolog/ch-1.p b/challenge-189/adam-russell/prolog/ch-1.p
new file mode 100644
index 0000000000..13b532af66
--- /dev/null
+++ b/challenge-189/adam-russell/prolog/ch-1.p
@@ -0,0 +1,20 @@
+greater_than_character(Target, C0, C1):-
+ C0 > Target,
+ C1 = C0.
+greater_than_character(Target, C0, C1):-
+ \+ C0 > Target,
+ C1 = nil.
+
+greater_character(Characters, Target, Greater):-
+ maplist(greater_than_character(Target), Characters, GreaterCharacters),
+ delete(GreaterCharacters, nil, GreaterCharactersNonNil),
+ length(GreaterCharactersNonNil, GreaterCharactersNonNilLength),
+ GreaterCharactersNonNilLength > 0,
+ min_list(GreaterCharactersNonNil, GreaterChar),
+ char_code(Greater, GreaterChar), !.
+greater_character(Characters, [Target], Greater):-
+ maplist(greater_than_character(Target), Characters, GreaterCharacters),
+ delete(GreaterCharacters, nil, GreaterCharactersNonNil),
+ length(GreaterCharactersNonNil, GreaterCharactersNonNilLength),
+ GreaterCharactersNonNilLength == 0,
+ char_code(Greater, Target), !. \ No newline at end of file
diff --git a/challenge-189/adam-russell/prolog/ch-2.p b/challenge-189/adam-russell/prolog/ch-2.p
new file mode 100644
index 0000000000..19f35707b0
--- /dev/null
+++ b/challenge-189/adam-russell/prolog/ch-2.p
@@ -0,0 +1,29 @@
+array_degree(Array, Degree):-
+ array_degree(Array, Array, 0, Degree), !.
+array_degree([], _, Degree, Degree).
+array_degree([H|T], Array, DegreeAccum, Degree):-
+ length(Array, ArrayLength),
+ delete(Array, H, ArrayWithout),
+ length(ArrayWithout,ArrayWithoutLength),
+ CurrentDegree is ArrayLength - ArrayWithoutLength,
+ CurrentDegree > DegreeAccum,
+ array_degree(T, Array, CurrentDegree, Degree).
+array_degree([H|T], Array, DegreeAccum, Degree):-
+ length(Array, ArrayLength),
+ delete(Array, H, ArrayWithout),
+ length(ArrayWithout,ArrayWithoutLength),
+ CurrentDegree is ArrayLength - ArrayWithoutLength,
+ \+ CurrentDegree > DegreeAccum,
+ array_degree(T, Array, DegreeAccum, Degree).
+
+least_slice_degree(Array, LeastDegreeSlice):-
+ array_degree(Array, ArrayDegree),
+ findall(Sublist, (prefix(Prefix, Array), suffix(Suffix, Array),
+ sublist(Sublist, Array), length(Sublist, SublistLength),
+ SublistLength >= 2, flatten([Prefix, Sublist, Suffix], Array)), Sublists),
+ sort(Sublists, Slices),
+ findall(DegreeSlice, (member(Slice, Slices), array_degree(Slice, Degree), DegreeSlice = Degree-Slice), DegreeSlices),
+ findall(MatchingSlice, (member(DegreeSlice, DegreeSlices), ArrayDegree-MatchingSlice = DegreeSlice), MatchingSlices),
+ findall(LengthSlice, (member(MatchingDegreeSlice, MatchingSlices), length(MatchingDegreeSlice, MatchingDegreeSliceLength), LengthSlice = MatchingDegreeSliceLength-MatchingDegreeSlice), LengthSlices),
+ keysort(LengthSlices),
+ [_-LeastDegreeSlice|_] = LengthSlices. \ No newline at end of file