diff options
| author | Lubos Kolouch <lubos@kolouch.net> | 2023-04-10 17:18:46 +0200 |
|---|---|---|
| committer | Lubos Kolouch <lubos@kolouch.net> | 2023-04-11 10:13:05 +0200 |
| commit | 2938c75379d1be9e4e62c22ea3c2b3f83c937bc8 (patch) | |
| tree | 9673a963aeeaba56ce280484e6443b2ae39e4e56 | |
| parent | 4e55a2097637ffc13090af68d096a8f9442306e4 (diff) | |
| download | perlweeklychallenge-club-2938c75379d1be9e4e62c22ea3c2b3f83c937bc8.tar.gz perlweeklychallenge-club-2938c75379d1be9e4e62c22ea3c2b3f83c937bc8.tar.bz2 perlweeklychallenge-club-2938c75379d1be9e4e62c22ea3c2b3f83c937bc8.zip | |
Challenge 212 LK Perl Python
| -rw-r--r-- | challenge-212/lubos-kolouch/perl/ch-1.pl | 24 | ||||
| -rw-r--r-- | challenge-212/lubos-kolouch/perl/ch-2.pl | 29 | ||||
| -rw-r--r-- | challenge-212/lubos-kolouch/python/ch-1.py | 25 | ||||
| -rw-r--r-- | challenge-212/lubos-kolouch/python/ch-2.py | 35 |
4 files changed, 113 insertions, 0 deletions
diff --git a/challenge-212/lubos-kolouch/perl/ch-1.pl b/challenge-212/lubos-kolouch/perl/ch-1.pl new file mode 100644 index 0000000000..21c2b175d4 --- /dev/null +++ b/challenge-212/lubos-kolouch/perl/ch-1.pl @@ -0,0 +1,24 @@ +#!/usr/bin/perl +use strict; +use warnings; +use Test::More tests => 2; + +sub jump_forward { + my ($word, $jumps) = @_; + my @letters = split //, $word; + my @result; + + for my $i (0 .. $#letters) { + my $is_upper = $letters[$i] =~ /[A-Z]/ ? 1 : 0; + my $base = $is_upper ? 65 : 97; # Base ASCII code for upper or lower case + my $current = ord($letters[$i]) - $base; # Convert to 0-based index + my $new_index = ($current + $jumps->[$i]) % 26; # Apply jump and mod 26 + push @result, chr($new_index + $base); # Convert back to ASCII character + } + + return join '', @result; +} + +is(jump_forward('Perl', [2, 22, 19, 9]), 'Raku', 'Test case 1'); +is(jump_forward('Raku', [24, 4, 7, 17]), 'Perl', 'Test case 2'); + diff --git a/challenge-212/lubos-kolouch/perl/ch-2.pl b/challenge-212/lubos-kolouch/perl/ch-2.pl new file mode 100644 index 0000000000..14289d213d --- /dev/null +++ b/challenge-212/lubos-kolouch/perl/ch-2.pl @@ -0,0 +1,29 @@ +use strict; +use warnings; +use List::Util qw(first); + +sub split_list { + my ($list_ref, $size) = @_; + my @list = sort {$a <=> $b} @$list_ref; + my @result; + while (@list) { + my @group = shift @list; + for (1 .. $size - 1) { + my $index = first { $list[$_] == $group[-1] + 1 } 0 .. $#list; + if (defined $index) { + push @group, splice(@list, $index, 1); + } else { + return -1; + } + } + push @result, \@group; + } + return \@result; +} + +use Test::More tests => 4; + +is_deeply(split_list([1,2,3,5,1,2,7,6,3], 3), [[1, 2, 3], [1, 2, 3], [5, 6, 7]]); +is_deeply(split_list([1,2,3], 2), -1); +is_deeply(split_list([1,2,4,3,5,3], 3), [[1, 2, 3], [3, 4, 5]]); +is_deeply(split_list([1,5,2,6,4,7], 3), -1); diff --git a/challenge-212/lubos-kolouch/python/ch-1.py b/challenge-212/lubos-kolouch/python/ch-1.py new file mode 100644 index 0000000000..ecb08d3852 --- /dev/null +++ b/challenge-212/lubos-kolouch/python/ch-1.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + + +def jump_forward(word, jumps): + result = [] + + for i, letter in enumerate(word): + is_upper = letter.isupper() + base = 65 if is_upper else 97 # Base ASCII code for upper or lower case + current = ord(letter) - base # Convert to 0-based index + new_index = (current + jumps[i]) % 26 # Apply jump and mod 26 + result.append(chr(new_index + base)) # Convert back to ASCII character + + return "".join(result) + + +def test_jump_forward(): + assert jump_forward("Perl", [2, 22, 19, 9]) == "Raku", "Test case 1" + assert jump_forward("Raku", [24, 4, 7, 17]) == "Perl", "Test case 2" + print("All tests passed!") + + +if __name__ == "__main__": + test_jump_forward() diff --git a/challenge-212/lubos-kolouch/python/ch-2.py b/challenge-212/lubos-kolouch/python/ch-2.py new file mode 100644 index 0000000000..6ccccaff57 --- /dev/null +++ b/challenge-212/lubos-kolouch/python/ch-2.py @@ -0,0 +1,35 @@ +from typing import List, Tuple, Union + + +def split_list(lst: List[int], size: int) -> Union[List[Tuple[int]], int]: + if len(lst) % size != 0: + return -1 + lst.sort() + result = [] + while lst: + group = [lst.pop(0)] + for _ in range(size - 1): + if group[-1] + 1 in lst: + group.append(lst.pop(lst.index(group[-1] + 1))) + else: + return -1 + result.append(tuple(group)) + return result + + +import unittest + + +class TestSplitList(unittest.TestCase): + + def test_split_list(self): + self.assertEqual(split_list([1, 2, 3, 5, 1, 2, 7, 6, 3], 3), + [(1, 2, 3), (1, 2, 3), (5, 6, 7)]) + self.assertEqual(split_list([1, 2, 3], 2), -1) + self.assertEqual(split_list([1, 2, 4, 3, 5, 3], 3), [(1, 2, 3), + (3, 4, 5)]) + self.assertEqual(split_list([1, 5, 2, 6, 4, 7], 3), -1) + + +if __name__ == '__main__': + unittest.main() |
