diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2023-01-23 00:33:27 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-01-23 00:33:27 +0000 |
| commit | 2eeccb5f2c173c1733caa4a9a7f53678079bc874 (patch) | |
| tree | 3ae7f17b5c04aef7a997edeaf16526473ecd7f5f | |
| parent | b3fd63adc8c5a045741025d773d02a709654e4de (diff) | |
| parent | ba4ef4694d7e491caf9ea6d5f9765b5c762a4efc (diff) | |
| download | perlweeklychallenge-club-2eeccb5f2c173c1733caa4a9a7f53678079bc874.tar.gz perlweeklychallenge-club-2eeccb5f2c173c1733caa4a9a7f53678079bc874.tar.bz2 perlweeklychallenge-club-2eeccb5f2c173c1733caa4a9a7f53678079bc874.zip | |
Merge pull request #7435 from polettix/polettix/pwc200
Add polettix's solution to challenge-200
| -rw-r--r-- | challenge-200/polettix/blog.txt | 1 | ||||
| -rw-r--r-- | challenge-200/polettix/blog1.txt | 1 | ||||
| -rw-r--r-- | challenge-200/polettix/perl/ch-1.pl | 27 | ||||
| -rw-r--r-- | challenge-200/polettix/perl/ch-2.pl | 35 | ||||
| -rw-r--r-- | challenge-200/polettix/raku/ch-1.raku | 25 | ||||
| -rw-r--r-- | challenge-200/polettix/raku/ch-2.raku | 28 |
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"; +} |
