aboutsummaryrefslogtreecommitdiff
path: root/challenge-200
diff options
context:
space:
mode:
authorDavid Ferrone <zapwai@gmail.com>2023-01-16 16:19:17 -0500
committerDavid Ferrone <zapwai@gmail.com>2023-01-16 16:19:17 -0500
commit51b02ce75ef1021204f6dd192bc027a042c65ee9 (patch)
treeb986f6dc555334e58174b50ac841cc32ddad7b2d /challenge-200
parent952f98a3d4e479992cd18e544ebb441a952f7159 (diff)
downloadperlweeklychallenge-club-51b02ce75ef1021204f6dd192bc027a042c65ee9.tar.gz
perlweeklychallenge-club-51b02ce75ef1021204f6dd192bc027a042c65ee9.tar.bz2
perlweeklychallenge-club-51b02ce75ef1021204f6dd192bc027a042c65ee9.zip
Week 200
Diffstat (limited to 'challenge-200')
-rw-r--r--challenge-200/zapwai/README2
-rw-r--r--challenge-200/zapwai/blog.txt1
-rw-r--r--challenge-200/zapwai/perl/ch-1.pl66
-rw-r--r--challenge-200/zapwai/perl/ch-2.pl79
-rw-r--r--challenge-200/zapwai/raku/ch-1.raku64
-rw-r--r--challenge-200/zapwai/raku/ch-2.raku75
6 files changed, 286 insertions, 1 deletions
diff --git a/challenge-200/zapwai/README b/challenge-200/zapwai/README
index 707f6658ea..037b3777ef 100644
--- a/challenge-200/zapwai/README
+++ b/challenge-200/zapwai/README
@@ -1 +1 @@
-Solution by David Ferrone.
+Solutions by David Ferrone.
diff --git a/challenge-200/zapwai/blog.txt b/challenge-200/zapwai/blog.txt
new file mode 100644
index 0000000000..7227da1633
--- /dev/null
+++ b/challenge-200/zapwai/blog.txt
@@ -0,0 +1 @@
+https://dev.to/zapwai/weekly-challenge-200-1o38
diff --git a/challenge-200/zapwai/perl/ch-1.pl b/challenge-200/zapwai/perl/ch-1.pl
new file mode 100644
index 0000000000..be93ae0867
--- /dev/null
+++ b/challenge-200/zapwai/perl/ch-1.pl
@@ -0,0 +1,66 @@
+use v5.30.0;
+my @array = (1,2,3,4);
+#my @array = (1,2,3,5,7,9,10,11,14);
+#my @array = (1,2,3,5,7,9,10,11,14,5,32,33,40,43,46,49);
+
+sub wrap {
+ my @array = @_;
+ "(" . join(",", @array).")"
+}
+
+# return all sets of size 3+
+sub bundle {
+ my $len = @_;
+ my $str;
+ unless (@_ < 4) {
+ do {
+ $len--;
+ for (0 .. @_ - $len) {
+ my @list;
+ for my $i ($_ .. $_ + $len - 1) {
+ push @list, $_[$i];
+ }
+ $str .= wrap(@list).", ";
+ }
+ } while ($len > 3);
+ }
+ $str .= wrap(@_);
+ print $str;
+}
+
+say "Input: \@array = " . wrap(@array);
+if ($#array < 2) {
+ say "Output: No slice found."; exit;
+}
+
+# indices as we traverse list
+my $begin = 0;
+my $end = 0;
+
+my @begin;
+my @end;
+
+$begin[0] = 0 if ($array[2] - $array[1] == $array[1] - $array[0]);
+for my $i (0 .. $#array - 2) {
+ next if ($i < $end);
+ $begin = $i;
+ my $diff = $array[$i + 1] - $array[$i];
+ for my $j ($i + 1 .. $#array - 1) {
+ if ($array[$j + 1] - $array[$j] == $diff) {
+ $end = $j + 1;
+ push @begin, $begin unless ($begin[$#begin] == $begin);
+ } else {
+ last if (($end == 0) or ($end[$#end] == $end));
+ push @end, $end;
+ last;
+ }
+ }
+}
+push @end, $end if (@begin != @end);
+print "Output: ";
+for my $i (0 .. $#begin - 1) {
+ bundle @array[$begin[$i] .. $end[$i]];
+ print ", ";
+}
+bundle @array[$begin[$#begin] .. $end[$#begin]];
+say;
diff --git a/challenge-200/zapwai/perl/ch-2.pl b/challenge-200/zapwai/perl/ch-2.pl
new file mode 100644
index 0000000000..1d9a7af7e0
--- /dev/null
+++ b/challenge-200/zapwai/perl/ch-2.pl
@@ -0,0 +1,79 @@
+use v5.30.0;
+my @truth = qw( 1110111 0010010 1011101 1011011 0111010 1101011 0101111 1010010 1111111 1111010 );
+my $N = $ARGV[0] || 200;
+
+my $vert = 2;
+my $horiz = 2*$vert + 1;
+
+sub hor {
+ my ($newline_flag, $i, @a) = @_;
+ if ($a[$i]) {
+ print " ";
+ print "-" x $horiz;
+ ($newline_flag) ? { say " " } : { print " " };
+ } else {
+ ($newline_flag) ? { say " " x $horiz } : { print " " x ($horiz + 2) }
+ }
+}
+
+sub ver {
+ my ($newline_flag, $i, @a) = @_;
+
+ if ($a[$i]) {
+ print "|";
+ } else {
+ print " ";
+ }
+ print " " x $horiz;
+ if ($a[$i + 1]) {
+ ($newline_flag) ? { say "|" } : { print "|" };
+ } else {
+ ($newline_flag) ? { say " " } : { print " " };
+ }
+}
+
+sub d {
+ my @num = @_;
+ my $last = pop @num;
+ foreach (@num) {
+ my @a = split("", $truth[$_]);
+ hor(0,0, @a);
+ }
+ my @b = split("", $truth[$last]);
+ hor(1,0, @b);
+
+ my $N = $vert;
+ do {
+ $N--;
+ foreach (@num) {
+ my @a = split("", $truth[$_]);
+ ver(0,1, @a);
+ }
+ ver(1,1,@b);
+ } while ($N > 0);
+
+ foreach (@num) {
+ my @a = split("", $truth[$_]);
+ hor(0,3, @a);
+ }
+ hor(1,3, @b);
+
+ $N = $vert;
+ do {
+ $N--;
+ foreach (@num) {
+ my @a = split("", $truth[$_]);
+ ver(0,4, @a);
+ }
+ ver(1,4, @b);
+ } while ($N > 0);
+
+ foreach (@num) {
+ my @a = split("", $truth[$_]);
+ hor(0,6, @a);
+ }
+ hor(1,6, @b);
+}
+
+my @nums = split("",$N);
+d(@nums);
diff --git a/challenge-200/zapwai/raku/ch-1.raku b/challenge-200/zapwai/raku/ch-1.raku
new file mode 100644
index 0000000000..9a3fb33a04
--- /dev/null
+++ b/challenge-200/zapwai/raku/ch-1.raku
@@ -0,0 +1,64 @@
+my @array = (1,2,3,4);
+#my @array = (1,2,3,5,7,9,10,11,14,5,32,33,40,43,46,49);
+sub wrap (@arr) {
+ return "(" ~ join(",", @arr) ~ ")"
+}
+
+sub bundle (@arr) {
+ my $len = @arr.elems;
+ my $str;
+ unless ( @arr.elems < 4 ) {
+ repeat {
+ $len--;
+ for (0 .. @arr.elems - $len) {
+ my @list;
+ loop (my $i = $_; $i <= $_ + $len - 1; $i++) {
+ push @list, @arr[$i];
+ }
+ $str ~= wrap(@list) ~ ", ";
+ }
+ } while ($len > 3);
+ }
+ $str ~= wrap(@arr);
+ print $str;
+}
+
+say "Input: \@array = " ~ wrap(@array);
+if (@array.elems < 3) {
+ say "Output: No slice found."; exit;
+}
+
+my $begin = 0;
+my $end = 0;
+
+my @begin = (-1);
+my @end = (-1);
+
+@begin[1] = 0 if (@array[2] - @array[1] == @array[1] - @array[0]);
+loop (my $i = 0; $i < @array.elems - 2; $i++) {
+ next if ($i < $end);
+ $begin = $i;
+ my $diff = @array[$i + 1] - @array[$i];
+ loop (my $j = $i + 1; $j < @array.elems - 1; $j++) {
+ if (@array[$j + 1] - @array[$j] == $diff) {
+ $end = $j + 1;
+ push @begin, $begin unless (@begin.tail == $begin);
+ } else {
+ last if (($end == 0) or (@end.tail == $end));
+ push @end, $end;
+ last;
+ }
+ }
+}
+push @end, $end if (@begin.elems != @end.elems);
+print "Output: ";
+
+shift @begin;
+shift @end;
+
+loop (my $k = 0; $k < @begin.elems - 1; $k++) {
+ bundle @array[@begin[$k] .. @end[$k]];
+ print ", ";
+}
+bundle @array[@begin.tail .. @end.tail];
+say "";
diff --git a/challenge-200/zapwai/raku/ch-2.raku b/challenge-200/zapwai/raku/ch-2.raku
new file mode 100644
index 0000000000..99ba6be888
--- /dev/null
+++ b/challenge-200/zapwai/raku/ch-2.raku
@@ -0,0 +1,75 @@
+my @truth = qw/ 1110111 0010010 1011101 1011011 0111010 1101011 0101111 1010010 1111111 1111010 /;
+my $N = @*ARGS[0] || 200;
+my $vert = 2; #size of numbers.
+my $horiz = 2*$vert + 1;
+
+sub hor ($newline_flag, $i, @a) {
+ if @a[$i] == 1 {
+ print " ";
+ print "-" x $horiz;
+ if $newline_flag { say " " }
+ else { print " " }
+ } else {
+ if $newline_flag { say " " x $horiz }
+ else { print " " x ($horiz + 2) }
+ }
+}
+
+sub ver ($newline_flag, $i, @a) {
+ if @a[$i] == 1 {
+ print("|");
+ } else {
+ print " ";
+ }
+ print " " x $horiz;
+ if @a[$i + 1] == 1 {
+ if $newline_flag { say "|" } else { print "|" };
+ } else {
+ if $newline_flag { say " " } else { print " " };
+ }
+}
+
+sub d (@num) {
+ my $last = pop @num;
+ for (@num) {
+ my @a = split("", @truth[$_], :skip-empty);
+ hor(0,0, @a);
+ }
+ my @b = split("", @truth[$last], :skip-empty);
+ hor(1,0,@b);
+
+ my $n = $vert;
+ repeat {
+ $n--;
+ for (@num) {
+ my @a = split("", @truth[$_], :skip-empty);
+ ver(0,1, @a);
+ }
+ ver(1,1,@b);
+ } while ($n > 0);
+
+ for @num {
+ my @a = split("", @truth[$_], :skip-empty);
+ hor(0,3, @a);
+ }
+ hor(1,3, @b);
+
+ $n = $vert;
+
+ repeat {
+ $n--;
+ for @num {
+ my @a = split("", @truth[$_], :skip-empty);
+ ver(0,4, @a);
+ }
+ ver(1,4, @b);
+ } while ($n > 0);
+
+ for @num {
+ my @a = split("", @truth[$_], :skip-empty);
+ hor(0,6, @a);
+ }
+ hor(1,6, @b);
+}
+my @nums = split("",$N, :skip-empty);
+d(@nums);