aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlavio Poletti <flavio@polettix.it>2023-01-18 23:37:13 +0100
committerFlavio Poletti <flavio@polettix.it>2023-01-18 23:37:13 +0100
commitba4ef4694d7e491caf9ea6d5f9765b5c762a4efc (patch)
treedf721e6ac34e312d04c3f5dd426d5006d483ce47
parent952f98a3d4e479992cd18e544ebb441a952f7159 (diff)
downloadperlweeklychallenge-club-ba4ef4694d7e491caf9ea6d5f9765b5c762a4efc.tar.gz
perlweeklychallenge-club-ba4ef4694d7e491caf9ea6d5f9765b5c762a4efc.tar.bz2
perlweeklychallenge-club-ba4ef4694d7e491caf9ea6d5f9765b5c762a4efc.zip
Add polettix's solution to challenge-200
-rw-r--r--challenge-200/polettix/blog.txt1
-rw-r--r--challenge-200/polettix/blog1.txt1
-rw-r--r--challenge-200/polettix/perl/ch-1.pl27
-rw-r--r--challenge-200/polettix/perl/ch-2.pl35
-rw-r--r--challenge-200/polettix/raku/ch-1.raku25
-rw-r--r--challenge-200/polettix/raku/ch-2.raku28
6 files changed, 117 insertions, 0 deletions
diff --git a/challenge-200/polettix/blog.txt b/challenge-200/polettix/blog.txt
new file mode 100644
index 0000000000..a395603851
--- /dev/null
+++ b/challenge-200/polettix/blog.txt
@@ -0,0 +1 @@
+https://etoobusy.polettix.it/2023/01/19/pwc200-arithmetic-slices/
diff --git a/challenge-200/polettix/blog1.txt b/challenge-200/polettix/blog1.txt
new file mode 100644
index 0000000000..0fb8c92500
--- /dev/null
+++ b/challenge-200/polettix/blog1.txt
@@ -0,0 +1 @@
+https://etoobusy.polettix.it/2023/01/20/pwc200-seven-segment-200/
diff --git a/challenge-200/polettix/perl/ch-1.pl b/challenge-200/polettix/perl/ch-1.pl
new file mode 100644
index 0000000000..8ac295eed6
--- /dev/null
+++ b/challenge-200/polettix/perl/ch-1.pl
@@ -0,0 +1,27 @@
+#!/usr/bin/env perl
+use v5.24;
+use warnings;
+use experimental 'signatures';
+no warnings 'experimental::signatures';
+
+say join ', ', map { '(' . join(',', $_->@*) . ')' }
+ arithmetic_slices(@ARGV ? @ARGV : qw< 1 2 3 4 >);
+
+sub arithmetic_slices (@array) {
+ return if @array < 3;
+ my @retval;
+ my $current_rate = $array[1] - $array[0];
+ my $run_length = 1;
+ for my $i (2 .. $#array) {
+ my $delta = $array[$i] - $array[$i - 1];
+ if ($current_rate == $delta) {
+ ++$run_length;
+ push @retval, [ @array[($i - $_) .. $i] ] for 2 .. $run_length;
+ }
+ else {
+ $current_rate = $delta;
+ $run_length = 1;
+ }
+ }
+ return @retval;
+}
diff --git a/challenge-200/polettix/perl/ch-2.pl b/challenge-200/polettix/perl/ch-2.pl
new file mode 100644
index 0000000000..e88b518884
--- /dev/null
+++ b/challenge-200/polettix/perl/ch-2.pl
@@ -0,0 +1,35 @@
+#!/usr/bin/env perl
+use v5.24;
+use warnings;
+use experimental 'signatures';
+no warnings 'experimental::signatures';
+
+say render_seven_segment(shift // 200);
+
+sub render_seven_segment ($number) {
+ state $truth = [
+ map { +{ map { $_ => 1 } split m{}mxs, $_ } }
+ qw<abcdef bc abdeg abcdg bcfg acdfg acdefg abc abcdefg abcfg>
+ ];
+ state $h_line = sub ($letter, @digits) {
+ state $segment = [ ' ' x 7, ' ' . ('-' x 5) . ' ' ];
+ join ' ',
+ map { $segment->[$truth->[$_]{$letter} ? 1 : 0] } @digits
+ };
+ state $v_line = sub ($left, $right, @digits) {
+ state $sep = ' ' x 5;
+ join ' ', map {
+ my $digit = $truth->[$_];
+ join $sep, map { $digit->{$_} ? '|' : ' ' } ($left, $right);
+ } @digits;
+ };
+
+ my @digits = split m{}mxs, $number;
+ return join "\n",
+ $h_line->('a', @digits),
+ ($v_line->('f', 'b', @digits)) x 2,
+ $h_line->('g', @digits),
+ ($v_line->('e', 'c', @digits)) x 2,
+ $h_line->('d', @digits);
+
+}
diff --git a/challenge-200/polettix/raku/ch-1.raku b/challenge-200/polettix/raku/ch-1.raku
new file mode 100644
index 0000000000..d19b454cd3
--- /dev/null
+++ b/challenge-200/polettix/raku/ch-1.raku
@@ -0,0 +1,25 @@
+#!/usr/bin/env raku
+use v6;
+sub MAIN (*@a) {
+ put arithmetic-slices(@a ?? @a !! <1 2 3 4>)
+ .map({ '(' ~ .join(',') ~ ')' }).join(', ');
+}
+
+sub arithmetic-slices (@array) {
+ return if @array < 3;
+ my $current-rate = @array[1] - @array[0]; # this keeps the growth rate
+ my $run-length = 1; # this tracks whether we're emitting
+ return [
+ gather for 2 ..^ @array -> $i {
+ my $delta = @array[$i] - @array[$i - 1];
+ if $current-rate == $delta {
+ ++$run-length;
+ take [ @array[($i - $_) .. $i].Slip ] for 2 .. $run-length;
+ }
+ else {
+ $current-rate = $delta;
+ $run-length = 1;
+ }
+ }
+ ];
+}
diff --git a/challenge-200/polettix/raku/ch-2.raku b/challenge-200/polettix/raku/ch-2.raku
new file mode 100644
index 0000000000..52af010758
--- /dev/null
+++ b/challenge-200/polettix/raku/ch-2.raku
@@ -0,0 +1,28 @@
+#!/usr/bin/env raku
+use v6;
+sub MAIN ($number = 200) { put render-seven-segment($number) }
+
+sub render-seven-segment ($number) {
+ state @truth =
+ <abcdef bc abdeg abcdg bcfg acdfg acdefg abc abcdefg abcfg>
+ .map: { .comb.map({$_ => 1}).Hash };
+ sub h_line ($letter, @digits) {
+ state @segment = ' ' x 7, ' ' ~ ('-' x 5) ~ ' ';
+ @digits.map({ @segment[@truth[$_]{$letter} ?? 1 !! 0] }).join(' ');
+ }
+ sub v_line ($left, $right, @digits) {
+ state $sep = ' ' x 5;
+ @digits.map({
+ my $d = @truth[$_];
+ ($left, $right).map({$d{$_} ?? '|' !! ' '}).join($sep);
+ }).join(' ');
+ }
+ my @digits = $number.comb;
+ (
+ h_line('a', @digits),
+ v_line('f', 'b', @digits) xx 2,
+ h_line('g', @digits),
+ v_line('e', 'c', @digits) xx 2,
+ h_line('d', @digits),
+ ).flat.join: "\n";
+}