diff options
| author | David Ferrone <zapwai@gmail.com> | 2023-01-16 16:19:17 -0500 |
|---|---|---|
| committer | David Ferrone <zapwai@gmail.com> | 2023-01-16 16:19:17 -0500 |
| commit | 51b02ce75ef1021204f6dd192bc027a042c65ee9 (patch) | |
| tree | b986f6dc555334e58174b50ac841cc32ddad7b2d /challenge-200 | |
| parent | 952f98a3d4e479992cd18e544ebb441a952f7159 (diff) | |
| download | perlweeklychallenge-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/README | 2 | ||||
| -rw-r--r-- | challenge-200/zapwai/blog.txt | 1 | ||||
| -rw-r--r-- | challenge-200/zapwai/perl/ch-1.pl | 66 | ||||
| -rw-r--r-- | challenge-200/zapwai/perl/ch-2.pl | 79 | ||||
| -rw-r--r-- | challenge-200/zapwai/raku/ch-1.raku | 64 | ||||
| -rw-r--r-- | challenge-200/zapwai/raku/ch-2.raku | 75 |
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); |
