aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <mohammad.anwar@yahoo.com>2024-05-01 00:10:03 +0100
committerMohammad S Anwar <mohammad.anwar@yahoo.com>2024-05-01 00:10:03 +0100
commitee37313350481c038cc89a9bc7d22bc55810ba78 (patch)
tree3cfaecfa6737404915903d85ed29d968626a6dbe
parente4399e45502910c398f99eed84f04468c2881dc5 (diff)
parent3ac919886cbffc5605359eedaa997b0a559c25c2 (diff)
downloadperlweeklychallenge-club-ee37313350481c038cc89a9bc7d22bc55810ba78.tar.gz
perlweeklychallenge-club-ee37313350481c038cc89a9bc7d22bc55810ba78.tar.bz2
perlweeklychallenge-club-ee37313350481c038cc89a9bc7d22bc55810ba78.zip
Merge branch 'packy-master'
-rw-r--r--challenge-266/packy-anderson/blog.txt2
-rw-r--r--challenge-267/packy-anderson/README.md2
-rw-r--r--challenge-267/packy-anderson/blog.txt1
-rwxr-xr-xchallenge-267/packy-anderson/perl/ch-1.pl34
-rwxr-xr-xchallenge-267/packy-anderson/perl/ch-2.pl52
-rwxr-xr-xchallenge-267/packy-anderson/python/ch-1.py33
-rwxr-xr-xchallenge-267/packy-anderson/python/ch-2.py48
-rwxr-xr-xchallenge-267/packy-anderson/raku/ch-1.raku32
-rwxr-xr-xchallenge-267/packy-anderson/raku/ch-2.raku50
9 files changed, 252 insertions, 2 deletions
diff --git a/challenge-266/packy-anderson/blog.txt b/challenge-266/packy-anderson/blog.txt
index a43da805a2..2827d33263 100644
--- a/challenge-266/packy-anderson/blog.txt
+++ b/challenge-266/packy-anderson/blog.txt
@@ -1 +1 @@
-https://packy.dardan.com/2024/04/23/perl-weekly-challenge-a-matrix-of-uncommon-x-words
+https://packy.dardan.com/b/KX
diff --git a/challenge-267/packy-anderson/README.md b/challenge-267/packy-anderson/README.md
index 3f4d321553..3c4bbfa52c 100644
--- a/challenge-267/packy-anderson/README.md
+++ b/challenge-267/packy-anderson/README.md
@@ -16,4 +16,4 @@
## Blog Post
-[A Matrix of Uncommon X Words](https://packy.dardan.com/b/KX)
+[It’s the Product Line Sign that Counts](https://packy.dardan.com/b/Ko)
diff --git a/challenge-267/packy-anderson/blog.txt b/challenge-267/packy-anderson/blog.txt
new file mode 100644
index 0000000000..929da738b5
--- /dev/null
+++ b/challenge-267/packy-anderson/blog.txt
@@ -0,0 +1 @@
+https://packy.dardan.com/b/Ko \ No newline at end of file
diff --git a/challenge-267/packy-anderson/perl/ch-1.pl b/challenge-267/packy-anderson/perl/ch-1.pl
new file mode 100755
index 0000000000..e1a4b15eba
--- /dev/null
+++ b/challenge-267/packy-anderson/perl/ch-1.pl
@@ -0,0 +1,34 @@
+#!/usr/bin/env perl
+use v5.38;
+
+use List::Util qw( reduce );
+
+sub productSign(@ints) {
+ my $product = reduce { $a * $b } @ints;
+ my $sign = $product == 0 ? 0
+ : $product/abs($product);
+ my $explain = 'The product ' . join(' × ', @ints)
+ . " => $product";
+ if ($sign < 0) {
+ $explain .= " < 0";
+ }
+ elsif ($sign > 0) {
+ $explain .= " > 0";
+ }
+ return ($sign, $explain);
+}
+
+sub solution($ints) {
+ say 'Input: @ints = (' . join(', ', @$ints) . ')';
+ my ($sign, $explain) = productSign(@$ints);
+ say "Output: $sign\n$explain";
+}
+
+say "Example 1:";
+solution([-1, -2, -3, -4, 3, 2, 1]);
+
+say "\nExample 2:";
+solution([1, 2, 0, -2, -1]);
+
+say "\nExample 3:";
+solution([-1, -1, 1, -1, 2]); \ No newline at end of file
diff --git a/challenge-267/packy-anderson/perl/ch-2.pl b/challenge-267/packy-anderson/perl/ch-2.pl
new file mode 100755
index 0000000000..66d8e74c1b
--- /dev/null
+++ b/challenge-267/packy-anderson/perl/ch-2.pl
@@ -0,0 +1,52 @@
+#!/usr/bin/env perl
+use v5.38;
+
+use List::Util qw( mesh );
+
+sub lineCounts($str, @widths) {
+ my ($lines, $last_line, $last_width, $explain) =
+ (0, '', 0, '');
+ my %width = mesh ['a' .. 'z'], \@widths;
+ foreach my $c ( split //, $str ) {
+ if ($last_width + $width{$c} > 100) {
+ $lines++;
+ $explain .= "\nLine $lines: $last_line "
+ . "($last_width pixels)";
+ ($last_line, $last_width) = ($c, $width{$c});
+ }
+ else {
+ $last_line .= $c;
+ $last_width += $width{$c};
+ }
+ }
+ $lines++;
+ $explain .= "\nLine $lines: $last_line "
+ . "($last_width pixels)";
+ return ($lines, $last_width, $explain);
+}
+
+sub solution($str, $widths) {
+ say qq{Input: \$str = "$str"};
+ say qq{ \@widths = (} . join(', ', @$widths) . ')';
+ my ($lines, $last_width, $explain) =
+ lineCounts($str, @$widths);
+ say qq{Output: ($lines, $last_width)$explain};
+}
+
+say "Example 1:";
+solution(
+ "abcdefghijklmnopqrstuvwxyz",
+ [10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10]
+);
+
+say "\nExample 2:";
+solution(
+ "bbbcccdddaaa",
+ [4,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10]
+);
+
+say "\nExample 3:";
+solution(
+ "thequickbrownfoxjumpedoverthelazydog",
+ [7,8,7,8,7,5,8,8,4,4,8,4,12,8,8,8,8,5,6,4,8,8,12,8,8,7]
+); \ No newline at end of file
diff --git a/challenge-267/packy-anderson/python/ch-1.py b/challenge-267/packy-anderson/python/ch-1.py
new file mode 100755
index 0000000000..034e7ce8fd
--- /dev/null
+++ b/challenge-267/packy-anderson/python/ch-1.py
@@ -0,0 +1,33 @@
+#!/usr/bin/env python
+
+from functools import reduce
+
+def productSign(ints):
+ product = reduce(lambda a, b: a * b, ints)
+ sign = 0 if product == 0 else int(product / abs(product))
+
+ explain = (
+ 'The product ' + ' × '.join(map(lambda i: str(i), ints))
+ + ' => ' + str(product)
+ )
+ if (sign < 0): explain += " < 0"
+ if (sign > 0): explain += " > 0"
+
+ return (sign, explain)
+
+def comma_join(arr):
+ return ', '.join(map(lambda i: str(i), arr))
+
+def solution(ints):
+ print(f'Input: @arr = ({comma_join(ints)})')
+ sign, explain = productSign(ints)
+ print(f'Output: {sign}\n{explain}')
+
+print('Example 1:')
+solution([-1, -2, -3, -4, 3, 2, 1])
+
+print('\nExample 2:')
+solution([1, 2, 0, -2, -1])
+
+print('\nExample 3:')
+solution([-1, -1, 1, -1, 2]) \ No newline at end of file
diff --git a/challenge-267/packy-anderson/python/ch-2.py b/challenge-267/packy-anderson/python/ch-2.py
new file mode 100755
index 0000000000..72c6903c31
--- /dev/null
+++ b/challenge-267/packy-anderson/python/ch-2.py
@@ -0,0 +1,48 @@
+#!/usr/bin/env python
+
+def lineCounts(strvar, widths):
+ (lines, last_line, last_width, explain) = (0, '', 0, '')
+ # we can't do a range of characters, but we can do a range
+ # of the ASCII values of the characters
+ letters = [ chr(c) for c in range(ord('a'), ord('z')+1) ]
+ width = dict( zip(letters, widths) )
+ for c in strvar:
+ if last_width + width[c] > 100:
+ lines += 1
+ explain += f"\nLine {lines}: {last_line} "
+ explain += f"({last_width} pixels)"
+ (last_line, last_width) = (c, width[c])
+ else:
+ last_line += c
+ last_width += width[c]
+ lines += 1
+ explain += f"\nLine {lines}: {last_line} "
+ explain += f"({last_width} pixels)"
+ return (lines, last_width, explain)
+
+def comma_join(arr):
+ return ', '.join(map(lambda i: str(i), arr))
+
+def solution(strvar, widths):
+ print(f'Input: $str = "{strvar}"')
+ print(f' @widths = ({comma_join(widths)})')
+ (lines, last_width, explain) = lineCounts(strvar, widths)
+ print(f'Output: ({lines}, {last_width}){explain}')
+
+print('Example 1:')
+solution(
+ "abcdefghijklmnopqrstuvwxyz",
+ [10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10]
+)
+
+print('\nExample 2:')
+solution(
+ "bbbcccdddaaa",
+ [4,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10]
+)
+
+print('\nExample 3:')
+solution(
+ "thequickbrownfoxjumpedoverthelazydog",
+ [7,8,7,8,7,5,8,8,4,4,8,4,12,8,8,8,8,5,6,4,8,8,12,8,8,7]
+) \ No newline at end of file
diff --git a/challenge-267/packy-anderson/raku/ch-1.raku b/challenge-267/packy-anderson/raku/ch-1.raku
new file mode 100755
index 0000000000..d03830a9ab
--- /dev/null
+++ b/challenge-267/packy-anderson/raku/ch-1.raku
@@ -0,0 +1,32 @@
+#!/usr/bin/env raku
+use v6;
+
+sub productSign(@ints) {
+ my $product = [*] @ints;
+ my $sign = $product == 0 ?? 0
+ !! $product/abs($product);
+ my $explain = 'The product ' ~ @ints.join(' × ')
+ ~ " => $product";
+ if ($sign < 0) {
+ $explain ~= " < 0";
+ }
+ elsif ($sign > 0) {
+ $explain ~= " > 0";
+ }
+ return ($sign, $explain);
+}
+
+sub solution(@ints) {
+ say 'Input: @arr = (' ~ @ints.join(', ') ~ ')';
+ my ($sign, $explain) = productSign(@ints);
+ say "Output: $sign\n$explain";
+}
+
+say "Example 1:";
+solution([-1, -2, -3, -4, 3, 2, 1]);
+
+say "\nExample 2:";
+solution([1, 2, 0, -2, -1]);
+
+say "\nExample 3:";
+solution([-1, -1, 1, -1, 2]); \ No newline at end of file
diff --git a/challenge-267/packy-anderson/raku/ch-2.raku b/challenge-267/packy-anderson/raku/ch-2.raku
new file mode 100755
index 0000000000..cd543421cc
--- /dev/null
+++ b/challenge-267/packy-anderson/raku/ch-2.raku
@@ -0,0 +1,50 @@
+#!/usr/bin/env raku
+use v6;
+
+sub lineCounts($str, @widths) {
+ my ($lines, $last_line, $last_width, $explain) =
+ (0, '', 0, '');
+ my %width = ('a' .. 'z' Z @widths).flat.Hash;
+ for $str.comb -> $c {
+ if ($last_width + %width{$c} > 100) {
+ $lines++;
+ $explain ~= "\nLine $lines: $last_line "
+ ~ "($last_width pixels)";
+ ($last_line, $last_width) = ($c, %width{$c});
+ }
+ else {
+ $last_line ~= $c;
+ $last_width += %width{$c};
+ }
+ }
+ $lines++;
+ $explain ~= "\nLine $lines: $last_line "
+ ~ "($last_width pixels)";
+ return ($lines, $last_width, $explain);
+}
+
+sub solution($str, @widths) {
+ say qq{Input: \$str = "$str"};
+ say qq{ \@widths = (} ~ @widths.join(', ') ~ ')';
+ my ($lines, $last_width, $explain) =
+ lineCounts($str, @widths);
+ say qq{Output: ($lines, $last_width)$explain};
+}
+
+say "Example 1:";
+solution(
+ "abcdefghijklmnopqrstuvwxyz",
+ [10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10]
+);
+
+say "\nExample 2:";
+solution(
+ "bbbcccdddaaa",
+ [4,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10]
+);
+
+say "\nExample 3:";
+solution(
+ "thequickbrownfoxjumpedoverthelazydog",
+ [7,8,7,8,7,5,8,8,4,4,8,4,12,8,8,8,8,5,6,4,8,8,12,8,8,7]
+); \ No newline at end of file