diff options
| author | Mohammad Sajid Anwar <Mohammad.Anwar@yahoo.com> | 2023-11-18 22:18:45 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-11-18 22:18:45 +0000 |
| commit | 4132ffd37278849a388587b14c1fabff6d2f1981 (patch) | |
| tree | e443094d7761cd5c8bfc9a2821f3c2475c011d63 | |
| parent | 5c3ee7e72fb8bd6464f743c910cce9717197d870 (diff) | |
| parent | 6bdf2bb4792421f7285305ab0688c123b900d07e (diff) | |
| download | perlweeklychallenge-club-4132ffd37278849a388587b14c1fabff6d2f1981.tar.gz perlweeklychallenge-club-4132ffd37278849a388587b14c1fabff6d2f1981.tar.bz2 perlweeklychallenge-club-4132ffd37278849a388587b14c1fabff6d2f1981.zip | |
Merge pull request #9083 from LubosKolouch/master
feat(challenge-234/lubos-kolouch/perl,python,raku/): Challenge 234 LK Perl Python Raku
| -rw-r--r-- | challenge-243/lubos-kolouch/perl/ch-1.pl | 46 | ||||
| -rw-r--r-- | challenge-243/lubos-kolouch/perl/ch-2.pl | 18 | ||||
| -rw-r--r-- | challenge-243/lubos-kolouch/python/ch-1.py | 43 | ||||
| -rw-r--r-- | challenge-243/lubos-kolouch/python/ch-2.py | 26 | ||||
| -rw-r--r-- | challenge-243/lubos-kolouch/raku/ch-1.raku | 38 | ||||
| -rw-r--r-- | challenge-243/lubos-kolouch/raku/ch-2.raku | 13 |
6 files changed, 184 insertions, 0 deletions
diff --git a/challenge-243/lubos-kolouch/perl/ch-1.pl b/challenge-243/lubos-kolouch/perl/ch-1.pl new file mode 100644 index 0000000000..fdbdd56b7e --- /dev/null +++ b/challenge-243/lubos-kolouch/perl/ch-1.pl @@ -0,0 +1,46 @@ +use strict; +use warnings; + +# Perl subroutine to count reverse pairs +sub count_reverse_pairs { + my @nums = @_; + return _merge_sort( \@nums, 0, scalar @nums - 1 ); +} + +sub _merge_sort { + my ( $nums, $left, $right ) = @_; + + return 0 if $left >= $right; + + my $mid = int( ( $left + $right ) / 2 ); + my $count = _merge_sort( $nums, $left, $mid ) + _merge_sort( $nums, $mid + 1, $right ); + + # Count reverse pairs + my ( $i, $j ) = ( $left, $mid + 1 ); + while ( $i <= $mid ) { + $j++ while ( $j <= $right && $nums->[$i] > 2 * $nums->[$j] ); + $count += $j - ( $mid + 1 ); + $i++; + } + + # Merge step + my @sorted = (); + ( $i, $j ) = ( $left, $mid + 1 ); + while ( $i <= $mid && $j <= $right ) { + if ( $nums->[$i] <= $nums->[$j] ) { + push @sorted, $nums->[ $i++ ]; + } + else { + push @sorted, $nums->[ $j++ ]; + } + } + push @sorted, @{$nums}[ $i .. $mid ] if $i <= $mid; + push @sorted, @{$nums}[ $j .. $right ] if $j <= $right; + @{$nums}[ $left .. $right ] = @sorted; + + return $count; +} + +# Testing with example inputs +print count_reverse_pairs( 1, 3, 2, 3, 1 ), "\n"; # Output: 2 +print count_reverse_pairs( 2, 4, 3, 5, 1 ), "\n"; # Output: 3 diff --git a/challenge-243/lubos-kolouch/perl/ch-2.pl b/challenge-243/lubos-kolouch/perl/ch-2.pl new file mode 100644 index 0000000000..3606c4d4b9 --- /dev/null +++ b/challenge-243/lubos-kolouch/perl/ch-2.pl @@ -0,0 +1,18 @@ +use strict; +use warnings; +use Test::More tests => 2; + +sub floor_sum { + my @nums = @_; + my $sum = 0; + for my $i ( 0 .. $#nums ) { + for my $j ( 0 .. $#nums ) { + $sum += int( $nums[$i] / $nums[$j] ); + } + } + return $sum; +} + +# Tests +is( floor_sum( 2, 5, 9 ), 10, 'Test Example 1' ); +is( floor_sum( 7, 7, 7, 7, 7, 7, 7 ), 49, 'Test Example 2' ); diff --git a/challenge-243/lubos-kolouch/python/ch-1.py b/challenge-243/lubos-kolouch/python/ch-1.py new file mode 100644 index 0000000000..e942d2ed94 --- /dev/null +++ b/challenge-243/lubos-kolouch/python/ch-1.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python + +from typing import List + + +def count_reverse_pairs(nums: list[int]) -> int: + def merge_sort(left: int, right: int) -> int: + if left >= right: + return 0 + + mid = (left + right) // 2 + count = merge_sort(left, mid) + merge_sort(mid + 1, right) + + # Count reverse pairs + i, j = left, mid + 1 + while i <= mid: + while j <= right and nums[i] > 2 * nums[j]: + j += 1 + count += j - (mid + 1) + i += 1 + + # Merge step + sorted_nums = [] + i, j = left, mid + 1 + while i <= mid and j <= right: + if nums[i] <= nums[j]: + sorted_nums.append(nums[i]) + i += 1 + else: + sorted_nums.append(nums[j]) + j += 1 + sorted_nums.extend(nums[i : mid + 1]) + sorted_nums.extend(nums[j : right + 1]) + nums[left : right + 1] = sorted_nums + + return count + + return merge_sort(0, len(nums) - 1) + + +# Testing with example inputs +print(count_reverse_pairs([1, 3, 2, 3, 1])) # Output: 2 +print(count_reverse_pairs([2, 4, 3, 5, 1])) # Output: 3 diff --git a/challenge-243/lubos-kolouch/python/ch-2.py b/challenge-243/lubos-kolouch/python/ch-2.py new file mode 100644 index 0000000000..eea7bf2a01 --- /dev/null +++ b/challenge-243/lubos-kolouch/python/ch-2.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python + +import math +from typing import List + + +def floor_sum(nums: list[int]) -> int: + """ + Calculate the sum of floor division results for every combination of elements in the array. + + Args: + nums (List[int]): A list of positive integers. + + Returns: + int: The sum of the floor division results. + """ + return sum( + math.floor(nums[i] / nums[j]) + for i in range(len(nums)) + for j in range(len(nums)) + ) + + +# Tests +assert floor_sum([2, 5, 9]) == 10 +assert floor_sum([7, 7, 7, 7, 7, 7, 7]) == 49 diff --git a/challenge-243/lubos-kolouch/raku/ch-1.raku b/challenge-243/lubos-kolouch/raku/ch-1.raku new file mode 100644 index 0000000000..ac103b431a --- /dev/null +++ b/challenge-243/lubos-kolouch/raku/ch-1.raku @@ -0,0 +1,38 @@ +sub count-reverse-pairs(@nums) { + merge-sort(0, @nums.elems - 1, @nums) +} + +sub merge-sort($left, $right, @nums) { + return 0 if $left >= $right; + + my $mid = ($left + $right) div 2; + my $count = merge-sort($left, $mid, @nums) + merge-sort($mid + 1, $right, @nums); + + # Count reverse pairs + my ($i, $j) = ($left, $mid + 1); + while ($i <= $mid) { + $j++ while ($j <= $right && @nums[$i] > 2 * @nums[$j]); + $count += $j - ($mid + 1); + $i++; + } + + # Merge step + my @sorted; + ($i, $j) = ($left, $mid + 1); + while ($i <= $mid && $j <= $right) { + if (@nums[$i] <= @nums[$j]) { + @sorted.push(@nums[$i++]); + } else { + @sorted.push(@nums[$j++]); + } + } + @sorted.append(@nums[$i..$mid]) if $i <= $mid; + @sorted.append(@nums[$j..$right]) if $j <= $right; + @nums[$left..$right] = @sorted; + + return $count; +} + +# Testing with example inputs +say count-reverse-pairs(1, 3, 2, 3, 1); # Output: 2 +say count-reverse-pairs(2, 4, 3, 5, 1); # Output: 3 diff --git a/challenge-243/lubos-kolouch/raku/ch-2.raku b/challenge-243/lubos-kolouch/raku/ch-2.raku new file mode 100644 index 0000000000..cedd36acc5 --- /dev/null +++ b/challenge-243/lubos-kolouch/raku/ch-2.raku @@ -0,0 +1,13 @@ +use Test; + +sub floor-sum(@nums) { + return [+] do for @nums -> $i { + map { ($i / $_).Int }, @nums + } +} + +# Tests +is floor-sum(2, 5, 9), 10, 'Test Example 1'; +is floor-sum(7, 7, 7, 7, 7, 7, 7), 49, 'Test Example 2'; + +done-testing; |
