From 248be62ad71a8f2cfecb93bd4f153d62dc93572f Mon Sep 17 00:00:00 2001 From: Adam Russell Date: Sun, 6 Nov 2022 09:39:21 -0500 Subject: initial commit --- challenge-189/adam-russell/blog.txt | 1 + challenge-189/adam-russell/blog1.txt | 1 + challenge-189/adam-russell/perl/ch-1.pl | 20 ++++++++++++++++ challenge-189/adam-russell/perl/ch-2.pl | 39 ++++++++++++++++++++++++++++++++ challenge-189/adam-russell/prolog/ch-1.p | 20 ++++++++++++++++ challenge-189/adam-russell/prolog/ch-2.p | 29 ++++++++++++++++++++++++ 6 files changed, 110 insertions(+) create mode 100644 challenge-189/adam-russell/blog.txt create mode 100644 challenge-189/adam-russell/blog1.txt create mode 100644 challenge-189/adam-russell/perl/ch-1.pl create mode 100644 challenge-189/adam-russell/perl/ch-2.pl create mode 100644 challenge-189/adam-russell/prolog/ch-1.p create mode 100644 challenge-189/adam-russell/prolog/ch-2.p 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 -- cgit