aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLubos Kolouch <lubos@kolouch.net>2023-04-10 17:18:46 +0200
committerLubos Kolouch <lubos@kolouch.net>2023-04-11 10:13:05 +0200
commit2938c75379d1be9e4e62c22ea3c2b3f83c937bc8 (patch)
tree9673a963aeeaba56ce280484e6443b2ae39e4e56
parent4e55a2097637ffc13090af68d096a8f9442306e4 (diff)
downloadperlweeklychallenge-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.pl24
-rw-r--r--challenge-212/lubos-kolouch/perl/ch-2.pl29
-rw-r--r--challenge-212/lubos-kolouch/python/ch-1.py25
-rw-r--r--challenge-212/lubos-kolouch/python/ch-2.py35
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()