diff options
| author | Dave Jacoby <jacoby.david@gmail.com> | 2024-09-18 19:56:42 -0400 |
|---|---|---|
| committer | Dave Jacoby <jacoby.david@gmail.com> | 2024-09-18 19:56:42 -0400 |
| commit | f86f5e2fec16020c1d86f9028fb0f61cfeac106e (patch) | |
| tree | 0fd388a696b51ffde5a7bfe8519a74e1caf42461 /challenge-284 | |
| parent | ff8719c86653d5ad3121955e9494a0010527c2b9 (diff) | |
| parent | 0052ec63ca70eaa6d9ffb1926c294dbfd85f8c05 (diff) | |
| download | perlweeklychallenge-club-f86f5e2fec16020c1d86f9028fb0f61cfeac106e.tar.gz perlweeklychallenge-club-f86f5e2fec16020c1d86f9028fb0f61cfeac106e.tar.bz2 perlweeklychallenge-club-f86f5e2fec16020c1d86f9028fb0f61cfeac106e.zip | |
Merge branch 'master' of https://github.com/manwar/perlweeklychallenge-club
Diffstat (limited to 'challenge-284')
| -rw-r--r-- | challenge-284/0rir/raku/ch-2.raku | 2 | ||||
| -rw-r--r-- | challenge-284/lubos-kolouch/perl/ch-1.pl | 59 | ||||
| -rw-r--r-- | challenge-284/lubos-kolouch/perl/ch-2.pl | 88 | ||||
| -rw-r--r-- | challenge-284/lubos-kolouch/python/ch-1.py | 51 | ||||
| -rw-r--r-- | challenge-284/lubos-kolouch/python/ch-2.py | 66 | ||||
| -rw-r--r-- | challenge-284/santiago-leyva/perl/ch-1.pl | 56 | ||||
| -rw-r--r-- | challenge-284/santiago-leyva/perl/ch-2.pl | 86 |
7 files changed, 406 insertions, 2 deletions
diff --git a/challenge-284/0rir/raku/ch-2.raku b/challenge-284/0rir/raku/ch-2.raku index 5b4be54966..4de0440bd7 100644 --- a/challenge-284/0rir/raku/ch-2.raku +++ b/challenge-284/0rir/raku/ch-2.raku @@ -1,8 +1,6 @@ #!/usr/bin/env raku # :vim ft=raku sw=4 expandtab # 🦋 ∅∪∩∋∈∉⊆ ≡ ≢ « » ∴ use v6.d; -INIT $*RAT-OVERFLOW = FatRat; -use lib $?FILE.IO.cleanup.parent(2).add("lib"); use Test; =begin comment diff --git a/challenge-284/lubos-kolouch/perl/ch-1.pl b/challenge-284/lubos-kolouch/perl/ch-1.pl new file mode 100644 index 0000000000..17a5769fe9 --- /dev/null +++ b/challenge-284/lubos-kolouch/perl/ch-1.pl @@ -0,0 +1,59 @@ +#!/usr/bin/perl +use strict; +use warnings; +use Test::More tests => 3; + +=pod + +=head1 DESCRIPTION + +This script finds the lucky integer in a given array of integers. + +A lucky integer is defined as an integer whose frequency in the array is equal to its value. + +If there are multiple lucky integers, the largest one is returned. If no lucky integers are found, -1 is returned. + +=head1 FUNCTIONS + +=head2 find_lucky_integer(\@ints) + +Given an array reference of integers, returns the lucky integer as per the problem definition. + +=over 4 + +=item * C<\@ints> - Reference to an array of integers. + +=back + +Returns the lucky integer if found, otherwise -1. + +=cut + +sub find_lucky_integer { + my ($ints_ref) = @_; + my %freq; + + foreach my $num (@$ints_ref) { + $freq{$num}++; + } + + my @lucky_integers; + foreach my $num (keys %freq) { + if ($num == $freq{$num}) { + push @lucky_integers, $num; + } + } + + if (@lucky_integers) { + return (sort { $b <=> $a } @lucky_integers)[0]; + } else { + return -1; + } +} + +# Unit Tests +is(find_lucky_integer([2, 2, 3, 4]), 2, 'Example 1'); +is(find_lucky_integer([1, 2, 2, 3, 3, 3]), 3, 'Example 2'); +is(find_lucky_integer([1, 1, 1, 3]), -1, 'Example 3'); + +done_testing(); diff --git a/challenge-284/lubos-kolouch/perl/ch-2.pl b/challenge-284/lubos-kolouch/perl/ch-2.pl new file mode 100644 index 0000000000..2579cd474e --- /dev/null +++ b/challenge-284/lubos-kolouch/perl/ch-2.pl @@ -0,0 +1,88 @@ +#!/usr/bin/perl +use strict; +use warnings; +use Test::More tests => 3; + +=pod + +=head1 DESCRIPTION + +This script sorts the elements of @list1 based on the relative order defined in @list2. Elements in @list1 that are not in @list2 are placed at the end in ascending order. + +=head1 FUNCTIONS + +=head2 relative_sort(\@list1, \@list2) + +Sorts @list1 based on the order of elements in @list2. + +=over 4 + +=item * C<\@list1> - Reference to the first list of integers. + +=item * C<\@list2> - Reference to the second list of integers defining the relative order. + +=back + +Returns a sorted array. + +=cut + +sub relative_sort { + my ($list1_ref, $list2_ref) = @_; + my %order; + my @result; + + # Assign order to elements in @list2 + my $idx = 0; + foreach my $num (@$list2_ref) { + $order{$num} = $idx++; + } + + # Separate elements that are in @list2 and not in @list2 + my @in_list2; + my @not_in_list2; + + foreach my $num (@$list1_ref) { + if (exists $order{$num}) { + push @in_list2, $num; + } else { + push @not_in_list2, $num; + } + } + + # Sort elements in @list1 that are in @list2 based on the order in @list2 + @in_list2 = sort { + $order{$a} <=> $order{$b} + || + $a <=> $b # To handle duplicates + } @in_list2; + + # Sort elements not in @list2 in ascending order + @not_in_list2 = sort { $a <=> $b } @not_in_list2; + + # Combine the two lists + @result = (@in_list2, @not_in_list2); + + return @result; +} + +# Unit Tests +is_deeply( + [relative_sort([2, 3, 9, 3, 1, 4, 6, 7, 2, 8, 5], [2, 1, 4, 3, 5, 6])], + [2, 2, 1, 4, 3, 3, 5, 6, 7, 8, 9], + 'Example 1' +); + +is_deeply( + [relative_sort([3, 3, 4, 6, 2, 4, 2, 1, 3], [1, 3, 2])], + [1, 3, 3, 3, 2, 2, 4, 4, 6], + 'Example 2' +); + +is_deeply( + [relative_sort([3, 0, 5, 0, 2, 1, 4, 1, 1], [1, 0, 3, 2])], + [1, 1, 1, 0, 0, 3, 2, 4, 5], + 'Example 3' +); + +done_testing(); diff --git a/challenge-284/lubos-kolouch/python/ch-1.py b/challenge-284/lubos-kolouch/python/ch-1.py new file mode 100644 index 0000000000..2f817578f1 --- /dev/null +++ b/challenge-284/lubos-kolouch/python/ch-1.py @@ -0,0 +1,51 @@ +from typing import List +import unittest + + +def find_lucky_integer(ints: List[int]) -> int: + """ + Finds the lucky integer in the given list of integers. + + A lucky integer is an integer whose frequency in the array is equal to its value. + + If there are multiple lucky integers, returns the largest one. + If no lucky integers are found, returns -1. + + Args: + ints (List[int]): A list of integers. + + Returns: + int: The lucky integer if found, otherwise -1. + """ + from collections import Counter + freq = Counter(ints) + lucky_integers = [num for num, count in freq.items() if num == count] + if lucky_integers: + return max(lucky_integers) + else: + return -1 + + +# Unit Tests +class TestFindLuckyInteger(unittest.TestCase): + + def test_example1(self): + self.assertEqual(find_lucky_integer([2, 2, 3, 4]), 2, 'Example 1') + + def test_example2(self): + self.assertEqual(find_lucky_integer([1, 2, 2, 3, 3, 3]), 3, + 'Example 2') + + def test_example3(self): + self.assertEqual(find_lucky_integer([1, 1, 1, 3]), -1, 'Example 3') + + def test_additional(self): + self.assertEqual(find_lucky_integer([5, 5, 5, 5, 5]), 5, + 'All same number') + self.assertEqual(find_lucky_integer([2, 2, 2, 3, 3]), -1, + 'No lucky integer') + self.assertEqual(find_lucky_integer([]), -1, 'Empty list') + + +if __name__ == "__main__": + unittest.main() diff --git a/challenge-284/lubos-kolouch/python/ch-2.py b/challenge-284/lubos-kolouch/python/ch-2.py new file mode 100644 index 0000000000..c0fb8a888b --- /dev/null +++ b/challenge-284/lubos-kolouch/python/ch-2.py @@ -0,0 +1,66 @@ +from typing import List +import unittest + + +def relative_sort(list1: List[int], list2: List[int]) -> List[int]: + """ + Sorts the elements of list1 based on the relative order defined in list2. + Elements not in list2 are placed at the end in ascending order. + + Args: + list1 (List[int]): The list of integers to sort. + list2 (List[int]): The list defining the relative order. + + Returns: + List[int]: The sorted list. + """ + order = {num: idx for idx, num in enumerate(list2)} + in_list2 = [] + not_in_list2 = [] + + for num in list1: + if num in order: + in_list2.append(num) + else: + not_in_list2.append(num) + + # Sort elements in list1 that are in list2 based on the order in list2 + in_list2.sort(key=lambda x: (order[x], x)) + + # Sort elements not in list2 in ascending order + not_in_list2.sort() + + return in_list2 + not_in_list2 + + +# Unit Tests +class TestRelativeSort(unittest.TestCase): + + def test_example1(self): + list1 = [2, 3, 9, 3, 1, 4, 6, 7, 2, 8, 5] + list2 = [2, 1, 4, 3, 5, 6] + expected = [2, 2, 1, 4, 3, 3, 5, 6, 7, 8, 9] + self.assertEqual(relative_sort(list1, list2), expected, 'Example 1') + + def test_example2(self): + list1 = [3, 3, 4, 6, 2, 4, 2, 1, 3] + list2 = [1, 3, 2] + expected = [1, 3, 3, 3, 2, 2, 4, 4, 6] + self.assertEqual(relative_sort(list1, list2), expected, 'Example 2') + + def test_example3(self): + list1 = [3, 0, 5, 0, 2, 1, 4, 1, 1] + list2 = [1, 0, 3, 2] + expected = [1, 1, 1, 0, 0, 3, 2, 4, 5] + self.assertEqual(relative_sort(list1, list2), expected, 'Example 3') + + def test_additional(self): + list1 = [7, 5, 9, 4, 8, 6] + list2 = [5, 7, 6] + expected = [5, 7, 6, 4, 8, 9] + self.assertEqual(relative_sort(list1, list2), expected, + 'Additional Test') + + +if __name__ == "__main__": + unittest.main() diff --git a/challenge-284/santiago-leyva/perl/ch-1.pl b/challenge-284/santiago-leyva/perl/ch-1.pl new file mode 100644 index 0000000000..27060bf1a2 --- /dev/null +++ b/challenge-284/santiago-leyva/perl/ch-1.pl @@ -0,0 +1,56 @@ +=begin +You are given an array of integers, @ints. + +Write a script to find the lucky integer if found otherwise return -1. If there are more than one then return the largest. + +A lucky integer is an integer that has a frequency in the array equal to its value. + +Example 1 +Input: @ints = (2, 2, 3, 4) +Output: 2 +Example 2 +Input: @ints = (1, 2, 2, 3, 3, 3) +Output: 3 +Example 3 +Input: @ints = (1, 1, 1, 3) +Output: -1 +=cut + +use strict; +use Data::Dumper; + + +my @inputs = ([2, 2, 3, 4],[1, 2, 2, 3, 3, 3],[1, 1, 1, 3]); + +foreach(@inputs){ + my $arr = $_; + my @A = @$arr; + my $result = luckyNumber(\@A); + print $result."\n"; +} + +sub luckyNumber { + my $array = shift; + my @nums = @$array; + + my %set; + + foreach(@nums){ + if(exists($set{$_})){ + $set{$_} += 1; + }else{ + $set{$_} = 1; + } + } + + my @largest; + foreach(sort {$a <=> $b} keys %set){ + if($set{$_} == $_){ + push @largest,$_; + } + } + + return $largest[-1] if (@largest); + return -1; + +}
\ No newline at end of file diff --git a/challenge-284/santiago-leyva/perl/ch-2.pl b/challenge-284/santiago-leyva/perl/ch-2.pl new file mode 100644 index 0000000000..c2c454f4de --- /dev/null +++ b/challenge-284/santiago-leyva/perl/ch-2.pl @@ -0,0 +1,86 @@ +=begin +You are given two list of integers, @list1 and @list2. The elements in the @list2 are distinct and also in the @list1. + +Write a script to sort the elements in the @list1 such that the relative order of items in @list1 is same as in the @list2. Elements that is missing in @list2 should be placed at the end of @list1 in ascending order. + +Example 1 +Input: @list1 = (2, 3, 9, 3, 1, 4, 6, 7, 2, 8, 5) + @list2 = (2, 1, 4, 3, 5, 6) +Ouput: (2, 2, 1, 4, 3, 3, 5, 6, 7, 8, 9) +Example 2 +Input: @list1 = (3, 3, 4, 6, 2, 4, 2, 1, 3) + @list2 = (1, 3, 2) +Ouput: (1, 3, 3, 3, 2, 2, 4, 4, 6) +Example 3 +Input: @list1 = (3, 0, 5, 0, 2, 1, 4, 1, 1) + @list2 = (1, 0, 3, 2) +Ouput: (1, 1, 1, 0, 0, 3, 2, 4, 5) +=cut + +use strict; +use Data::Dumper; + + +my @A = (2, 3, 9, 3, 1, 4, 6, 7, 2, 8, 5); +my @B = (2, 1, 4, 3, 5, 6); + +my @result = customSort(\@A,\@B); +print join(" ",@result)."\n"; + +my @A = (3, 3, 4, 6, 2, 4, 2, 1, 3); +my @B = (1, 3, 2); +my @result = customSort(\@A,\@B); +print join(" ",@result)."\n"; + +my @A = (3, 0, 5, 0, 2, 1, 4, 1, 1); +my @B = (1, 0, 3, 2); +my @result = customSort(\@A,\@B); +print join(" ",@result)."\n"; + +sub customSort { + my ($arr1,$arr2) = @_; + + my @list1 = @$arr1; + my @list2 = @$arr2; + + my %set1 = createSet(\@list1); + my @sorted; + foreach(@list2){ + if(exists($set1{$_})){ + push @sorted,$_; + if(($set1{$_}) > 1){ + for(my $i=1;$i<(scalar($set1{$_}));$i++){ + push @sorted,$_; + } + } + delete $set1{$_}; + } + } + + foreach(sort {$a<=>$b} keys %set1){ + push @sorted,$_; + if(($set1{$_}) > 1){ + for(my $i=1;$i<(scalar($set1{$_}));$i++){ + push @sorted,$_; + } + } + } + #print join(" ",@sorted)."\n"; + return @sorted; + +} + +sub createSet { + my $input = shift; + my @A = @$input; + my %_set; + foreach(@A){ + if(exists($_set{$_})){ + $_set{$_} += 1; + }else{ + $_set{$_} = 1; + } + } + + return %_set; +} |
