From f8c1bed0ca63ca4524d73f3264c1b9b1228609f3 Mon Sep 17 00:00:00 2001 From: Scimon Date: Mon, 16 Aug 2021 09:17:55 +0100 Subject: Challenge 1 --- challenge-126/simon-proctor/raku/ch-1.raku | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 challenge-126/simon-proctor/raku/ch-1.raku (limited to 'challenge-126') diff --git a/challenge-126/simon-proctor/raku/ch-1.raku b/challenge-126/simon-proctor/raku/ch-1.raku new file mode 100644 index 0000000000..479ed8e30d --- /dev/null +++ b/challenge-126/simon-proctor/raku/ch-1.raku @@ -0,0 +1,6 @@ +#!/usr/bin/env raku + +#| Given a number N give the count of all numbers between 1 and N inclusive that don't have a 1 in them +sub MAIN ( UInt \N ) { + (1^..N).grep( { ! m/1/ } ).elems.say; +} -- cgit From 0ed415881924a206d814362616c85ccca0f9c0ad Mon Sep 17 00:00:00 2001 From: Luca Ferrari Date: Mon, 16 Aug 2021 10:52:28 +0200 Subject: First task done --- challenge-126/luca-ferrari/raku/ch-1.p6 | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 challenge-126/luca-ferrari/raku/ch-1.p6 (limited to 'challenge-126') diff --git a/challenge-126/luca-ferrari/raku/ch-1.p6 b/challenge-126/luca-ferrari/raku/ch-1.p6 new file mode 100644 index 0000000000..b798fe26f9 --- /dev/null +++ b/challenge-126/luca-ferrari/raku/ch-1.p6 @@ -0,0 +1,6 @@ +#!raku + + +sub MAIN( Int $N ) { + ( 1 .. $N ).grep( * !~~ / 1 / ).elems.say; +} -- cgit From c66717856d3b135efea8c4fadb9a6fbe07020217 Mon Sep 17 00:00:00 2001 From: Luca Ferrari Date: Mon, 16 Aug 2021 11:24:38 +0200 Subject: Task 2 done --- challenge-126/luca-ferrari/raku/ch-2.p6 | 65 +++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 challenge-126/luca-ferrari/raku/ch-2.p6 (limited to 'challenge-126') diff --git a/challenge-126/luca-ferrari/raku/ch-2.p6 b/challenge-126/luca-ferrari/raku/ch-2.p6 new file mode 100644 index 0000000000..a8499be9b6 --- /dev/null +++ b/challenge-126/luca-ferrari/raku/ch-2.p6 @@ -0,0 +1,65 @@ +#!raku + +sub is-mine( @input, $row, $column ) { + return @input[ $row ][ $column ] ~~ 'x'; +} + + +sub compute-mines( @input, $row, $column ) { + my $counter = 0; + + # see where we can move + my ( $can-left, $can-right, $can-up, $can-down ) = + $column > 0, $column < @input[ 0 ].elems, $row > 0, $row < @input.elems; + + + # left, if possible + $counter++ if ( $can-left && is-mine( @input, $row, $column - 1 ) ); + # up if possible + $counter++ if ( $can-up && is-mine( @input, $row - 1, $column ) ); + # down if possible + $counter++ if ( $can-down && is-mine( @input, $row + 1 , $column ) ); + # right if possible + $counter++ if ( $can-right && is-mine( @input, $row, $column + 1 ) ); + + + # left up + $counter++ if ( $can-left && $can-up && is-mine( @input, $row - 1, $column - 1 ) ); + # right up + $counter++ if ( $can-up && $can-right && is-mine( @input, $row - 1, $column + 1 ) ); + # left down + $counter++ if ( $can-left && $can-down && is-mine( @input, $row + 1, $column - 1 ) ); + # right down + $counter++ if ( $can-down && $can-right && is-mine( @input, $row + 1, $column + 1 ) ); + + # left up if possible + + + return $counter; +} + + +sub MAIN() { + my @input = + qw/ x * * * x * x x x x /, + qw/ * * * * * * * * * x /, + qw/ * * * * x * x * x * /, + qw/ * * * x x * * * * * /, + qw/ x * * * x * * * * x /; + + my $rows = @input.elems; + my $columns = @input[ 0 ].elems; + + + + + my ( $current-row, $current-column ) = 0, 0; + for 0 ..^ $rows -> $current-row { + for 0 ..^ $columns -> $current-column { + print is-mine( @input, $current-row, $current-column ) ?? 'x' + !! compute-mines( @input, $current-row, $current-column ); + } + + print "\n"; + } +} -- cgit From 668f75f43892523ef601b7f2b64c413fc4fa2621 Mon Sep 17 00:00:00 2001 From: Luca Ferrari Date: Mon, 16 Aug 2021 11:38:44 +0200 Subject: Blog references --- challenge-126/luca-ferrari/blog-1.txt | 1 + challenge-126/luca-ferrari/blog-2.txt | 1 + 2 files changed, 2 insertions(+) create mode 100644 challenge-126/luca-ferrari/blog-1.txt create mode 100644 challenge-126/luca-ferrari/blog-2.txt (limited to 'challenge-126') diff --git a/challenge-126/luca-ferrari/blog-1.txt b/challenge-126/luca-ferrari/blog-1.txt new file mode 100644 index 0000000000..8e154cb4bf --- /dev/null +++ b/challenge-126/luca-ferrari/blog-1.txt @@ -0,0 +1 @@ +https://fluca1978.github.io/2021/08/16/PerlWeeklyChallenge126.html#task1 diff --git a/challenge-126/luca-ferrari/blog-2.txt b/challenge-126/luca-ferrari/blog-2.txt new file mode 100644 index 0000000000..2234270632 --- /dev/null +++ b/challenge-126/luca-ferrari/blog-2.txt @@ -0,0 +1 @@ +https://fluca1978.github.io/2021/08/16/PerlWeeklyChallenge126.html#task2 -- cgit From 7837479ff1ae88781f1a2645900d6daf1d54cdc6 Mon Sep 17 00:00:00 2001 From: drbaggy Date: Mon, 16 Aug 2021 10:55:39 +0100 Subject: first submit - working on better solution for ch-1.pl - there is some pattern in 9^n coming here which I need to get my head round 10^n has 9^n-1 numbers, 2.10^n had 2.9^n numbers, 9.10^n has 8.9^n numbers etc - so should be an easy way to get arbitrary large numbers without a scan! --- challenge-126/james-smith/perl/ch-1.pl | 37 ++++++++++++++++++++++++++++++++++ challenge-126/james-smith/perl/ch-2.pl | 36 +++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 challenge-126/james-smith/perl/ch-1.pl create mode 100644 challenge-126/james-smith/perl/ch-2.pl (limited to 'challenge-126') diff --git a/challenge-126/james-smith/perl/ch-1.pl b/challenge-126/james-smith/perl/ch-1.pl new file mode 100644 index 0000000000..ac845eee9a --- /dev/null +++ b/challenge-126/james-smith/perl/ch-1.pl @@ -0,0 +1,37 @@ +#!/usr/local/bin/perl + +use strict; + +use warnings; +use feature qw(say); +use Test::More; +use Benchmark qw(cmpthese timethis); +use Data::Dumper qw(Dumper); + +my @TESTS = ( + [ 15, 8 ], + [ 25, 13 ], + [ 100, 80 ], + [ 1000, 728 ], + [ 1100, 728 ], + [ 1200, 728 ], + [ 1300, 728 ], + [ 2000, 729 ], + [ 2100, 809 ], + [ 2200, 810 ], + [ 3000, 1458 ], + [ 4000, 2187 ], + [ 5000, 2916 ], + [ 10000, 6560 ], + [ 100000, 59048 ], + [ 1000000, 531440 ], +); + +is( get_no_one_count($_->[0]), $_->[1] ) foreach @TESTS; +done_testing(); + +sub get_no_one_count { + my $n = shift; + return scalar grep { ! m{1} } 2..$n; +} + diff --git a/challenge-126/james-smith/perl/ch-2.pl b/challenge-126/james-smith/perl/ch-2.pl new file mode 100644 index 0000000000..72d66eaf61 --- /dev/null +++ b/challenge-126/james-smith/perl/ch-2.pl @@ -0,0 +1,36 @@ +#!/usr/local/bin/perl + +use strict; + +use warnings; +use feature qw(say); +use Test::More; +use Benchmark qw(cmpthese timethis); +use Data::Dumper qw(Dumper); + +my @grid = qw(x***x*xxxx *********x ****x*x*x* ***xx***** x***x****x); + +solve(@grid); + +sub solve { + my @res = (''); + ## Map input of strings into an array of 1s (bombs) + 0s (spaces) + my @in = map { [ map { $_ eq 'x' ? 1:0 } split //, $_ ] } @_; + ## Get max x value.... + my($h,$w) = ($#_,-1 + length $_[0]); + foreach my $y (0..$h) { + $res[-1] .= $in[$y][$_] ? 'x' : + ( $y ? ( ($_?$in[$y-1][$_-1]:0) + +$in[$y-1][$_] + +($_<$w?$in[$y-1][$_+1]:0) ) : 0 ) + + ($_?$in[$y][$_-1]:0) + +$in[$y][$_] + +($_<$w?$in[$y][$_+1]:0) + + ( $y<$h ? ( ($_?$in[$y+1][$_-1]:0) + +$in[$y+1][$_] + +($_<$w?$in[$y+1][$_+1]:0) ) : 0 ) foreach 0..$w; + push @res, ''; + } + print join "\n", @res; +} + -- cgit From 588be19d6c9893bd6fa8e63e44f72147141e7705 Mon Sep 17 00:00:00 2001 From: drbaggy Date: Mon, 16 Aug 2021 11:08:00 +0100 Subject: tidied up layout to make readable - even if long lines --- challenge-126/james-smith/perl/ch-2.pl | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) (limited to 'challenge-126') diff --git a/challenge-126/james-smith/perl/ch-2.pl b/challenge-126/james-smith/perl/ch-2.pl index 72d66eaf61..0b0900662c 100644 --- a/challenge-126/james-smith/perl/ch-2.pl +++ b/challenge-126/james-smith/perl/ch-2.pl @@ -10,27 +10,25 @@ use Data::Dumper qw(Dumper); my @grid = qw(x***x*xxxx *********x ****x*x*x* ***xx***** x***x****x); -solve(@grid); +say join "\n",'',@grid,''; +print solve(@grid); +say ''; sub solve { my @res = (''); ## Map input of strings into an array of 1s (bombs) + 0s (spaces) my @in = map { [ map { $_ eq 'x' ? 1:0 } split //, $_ ] } @_; - ## Get max x value.... - my($h,$w) = ($#_,-1 + length $_[0]); - foreach my $y (0..$h) { + + ## Get index of last row or column... + my( $h, $w ) = ( $#_, -1 + length $_[0] ); + + foreach my $y ( 0 .. $h ) { $res[-1] .= $in[$y][$_] ? 'x' : - ( $y ? ( ($_?$in[$y-1][$_-1]:0) - +$in[$y-1][$_] - +($_<$w?$in[$y-1][$_+1]:0) ) : 0 ) + - ($_?$in[$y][$_-1]:0) - +$in[$y][$_] - +($_<$w?$in[$y][$_+1]:0) + - ( $y<$h ? ( ($_?$in[$y+1][$_-1]:0) - +$in[$y+1][$_] - +($_<$w?$in[$y+1][$_+1]:0) ) : 0 ) foreach 0..$w; + ( $y ? ( $_ ? $in[$y-1][$_-1] : 0 ) + $in[$y-1][$_] + ( $_ < $w ? $in[$y-1][$_+1] : 0 ) : 0 ) + + ( $_ ? $in[$y ][$_-1] : 0 ) + $in[$y ][$_] + ( $_ < $w ? $in[$y ][$_+1] : 0 ) + + ( $y < $h ? ( $_ ? $in[$y+1][$_-1] : 0 ) + $in[$y+1][$_] + ( $_ < $w ? $in[$y+1][$_+1] : 0 ) : 0 ) foreach 0 .. $w; push @res, ''; } - print join "\n", @res; + return join "\n", @res; } -- cgit From c6b2a4e90769b80b8099efdccde08151e388359f Mon Sep 17 00:00:00 2001 From: drbaggy Date: Mon, 16 Aug 2021 12:31:23 +0100 Subject: added a non-scan version --- challenge-126/james-smith/perl/ch-1.pl | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'challenge-126') diff --git a/challenge-126/james-smith/perl/ch-1.pl b/challenge-126/james-smith/perl/ch-1.pl index ac845eee9a..e680e413c2 100644 --- a/challenge-126/james-smith/perl/ch-1.pl +++ b/challenge-126/james-smith/perl/ch-1.pl @@ -23,10 +23,18 @@ my @TESTS = ( [ 4000, 2187 ], [ 5000, 2916 ], [ 10000, 6560 ], + [ 20000, 6561 ], + [ 25000, 6561+2916 ], + [ 25500, 6561+2916+324 ], + [ 25540, 6561+2916+324+27 ], + [ 25543, 6561+2916+324+27+2 ], [ 100000, 59048 ], [ 1000000, 531440 ], ); +# warn "@{$_} -> ", get_no_one_count_x($_->[0]), "\n" foreach @TESTS; + +is( get_no_one_count_x($_->[0]), $_->[1] ) foreach @TESTS; is( get_no_one_count($_->[0]), $_->[1] ) foreach @TESTS; done_testing(); @@ -35,3 +43,18 @@ sub get_no_one_count { return scalar grep { ! m{1} } 2..$n; } +## Optimized version.... seems to work ... and far better than scan... +sub get_no_one_count_x { + my $n = shift; + my $c = 0; + my $m = 1; + while($n) { + my $t=$n%10; + $c = 0 if $t==1; + $c += $t ? ( $t < 2 ? ($m-1) : ($t-1)*$m ) : 0; + $m *= 9; + $n= int($n/10); + } + return $c; +} + -- cgit From baa2c51105dd5d038a7f6ec0fdb4d721c97b7dc1 Mon Sep 17 00:00:00 2001 From: Mark A Date: Mon, 16 Aug 2021 05:35:20 -0600 Subject: Challenge 126 (Raku) --- challenge-126/mark-anderson/raku/ch-1.raku | 12 +++++++++ challenge-126/mark-anderson/raku/ch-2.raku | 41 ++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 challenge-126/mark-anderson/raku/ch-1.raku create mode 100644 challenge-126/mark-anderson/raku/ch-2.raku (limited to 'challenge-126') diff --git a/challenge-126/mark-anderson/raku/ch-1.raku b/challenge-126/mark-anderson/raku/ch-1.raku new file mode 100644 index 0000000000..277b3fbc11 --- /dev/null +++ b/challenge-126/mark-anderson/raku/ch-1.raku @@ -0,0 +1,12 @@ +#!/usr/bin/env raku + +use Test; +plan 2; + +is count-numbers(15), 8; +is count-numbers(25), 13; + +sub count-numbers($N) +{ + + grep { not .contains: 1 }, 1..$N; +} diff --git a/challenge-126/mark-anderson/raku/ch-2.raku b/challenge-126/mark-anderson/raku/ch-2.raku new file mode 100644 index 0000000000..75b2856b4c --- /dev/null +++ b/challenge-126/mark-anderson/raku/ch-2.raku @@ -0,0 +1,41 @@ +#!/usr/bin/env raku + +#| rows, columns, percent of mines +sub MAIN($r, $c, $p) +{ + my $n = $r * $c; + my $mines = ($p / 100 * $n).floor; + my @m = ('*' x $n - $mines ~ 'x' x $mines).comb + .pick($n) + .rotor($c) + .map(*.Array); + + .say for @m; + say ' '; + .say for minesweeper(@m); +} + +sub minesweeper(@m) +{ + my $rows = + @m; + my $cols = + @m.head; + + for ^$rows X ^$cols -> ($r, $c) + { + next if @m[$r;$c] eq 'x'; + + @m[$r;$c] = + .comb('x') given gather + { + take @m[$r-1;$c] // '*'; # N + take @m[$r-1;$c+1] // '*'; # NE + take @m[$r;$c+1] // '*'; # E + take @m[$r+1;$c+1] // '*'; # SE + take @m[$r+1;$c] // '*'; # S + take @m[$r+1;$c-1] // '*'; # SW + take @m[$r;$c-1] // '*'; # W + take @m[$r-1;$c-1] // '*'; # NW + } + } + + @m +} -- cgit From 57d72cef9fa6fb0795c4cd315e61a73502d89bb7 Mon Sep 17 00:00:00 2001 From: Mark A Date: Mon, 16 Aug 2021 05:52:13 -0600 Subject: Challenge 126 (Raku) --- challenge-126/mark-anderson/raku/ch-1.raku | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'challenge-126') diff --git a/challenge-126/mark-anderson/raku/ch-1.raku b/challenge-126/mark-anderson/raku/ch-1.raku index 277b3fbc11..c88fb4cf5b 100644 --- a/challenge-126/mark-anderson/raku/ch-1.raku +++ b/challenge-126/mark-anderson/raku/ch-1.raku @@ -8,5 +8,5 @@ is count-numbers(25), 13; sub count-numbers($N) { - + grep { not .contains: 1 }, 1..$N; + + grep { not .contains: 1 }, 2..$N; } -- cgit From 39a387fda0327a93d52672621fe7758742fac408 Mon Sep 17 00:00:00 2001 From: Roger Bell_West Date: Mon, 16 Aug 2021 13:18:14 +0100 Subject: Solutions for challenge #126 --- challenge-126/roger-bell-west/perl/ch-1.pl | 34 +++++++++++++++++ challenge-126/roger-bell-west/perl/ch-2.pl | 47 +++++++++++++++++++++++ challenge-126/roger-bell-west/python/ch-1.py | 36 ++++++++++++++++++ challenge-126/roger-bell-west/python/ch-2.py | 35 +++++++++++++++++ challenge-126/roger-bell-west/raku/ch-1.p6 | 32 ++++++++++++++++ challenge-126/roger-bell-west/raku/ch-2.p6 | 43 +++++++++++++++++++++ challenge-126/roger-bell-west/ruby/ch-1.rb | 45 ++++++++++++++++++++++ challenge-126/roger-bell-west/ruby/ch-2.rb | 40 ++++++++++++++++++++ challenge-126/roger-bell-west/rust/ch-1.rs | 44 ++++++++++++++++++++++ challenge-126/roger-bell-west/rust/ch-2.rs | 56 ++++++++++++++++++++++++++++ 10 files changed, 412 insertions(+) create mode 100755 challenge-126/roger-bell-west/perl/ch-1.pl create mode 100755 challenge-126/roger-bell-west/perl/ch-2.pl create mode 100755 challenge-126/roger-bell-west/python/ch-1.py create mode 100755 challenge-126/roger-bell-west/python/ch-2.py create mode 100755 challenge-126/roger-bell-west/raku/ch-1.p6 create mode 100755 challenge-126/roger-bell-west/raku/ch-2.p6 create mode 100755 challenge-126/roger-bell-west/ruby/ch-1.rb create mode 100755 challenge-126/roger-bell-west/ruby/ch-2.rb create mode 100755 challenge-126/roger-bell-west/rust/ch-1.rs create mode 100755 challenge-126/roger-bell-west/rust/ch-2.rs (limited to 'challenge-126') diff --git a/challenge-126/roger-bell-west/perl/ch-1.pl b/challenge-126/roger-bell-west/perl/ch-1.pl new file mode 100755 index 0000000000..fbab7a3346 --- /dev/null +++ b/challenge-126/roger-bell-west/perl/ch-1.pl @@ -0,0 +1,34 @@ +#! /usr/bin/perl + +use strict; +use warnings; + +use Test::More tests => 4; + +is(cn(15),8,'example 1'); +is(cn(25),13,'example 2'); +is(cn(10000),6560,'example 3'); +is(cn(100000000),43046720,'example 4'); + +sub cn { + my $n=shift; + my $k=$n; + my @digits; + while ($k>0) { + my $d=$k%10; + if ($d==1) { + @digits=(8) x scalar(@digits); + } + if ($d>0) { + $d--; + } + push @digits,$d; + $k=int($k/10); + } + my $tc=0; + foreach my $i (reverse(0..$#digits)) { + $tc*=9; + $tc+=$digits[$i]; + } + return $tc; +} diff --git a/challenge-126/roger-bell-west/perl/ch-2.pl b/challenge-126/roger-bell-west/perl/ch-2.pl new file mode 100755 index 0000000000..146cd920a0 --- /dev/null +++ b/challenge-126/roger-bell-west/perl/ch-2.pl @@ -0,0 +1,47 @@ +#! /usr/bin/perl + +use strict; + +use List::Util qw(min max); + +my @in=( + [qw(x * * * x * x x x x)], + [qw(* * * * * * * * * x)], + [qw(* * * * x * x * x *)], + [qw(* * * x x * * * * *)], + [qw(x * * * x * * * * x)], + ); + +my $ymax=$#in; +my $xmax=$#{$in[0]}; + +my @mn; +foreach (0..$ymax) { + push @mn,[(0) x ($xmax+1)]; +} + +foreach my $y (0..$ymax) { + my @sy=(max(0,$y-1)..min($ymax,$y+1)); + foreach my $x (0..$xmax) { + my @sx=(max(0,$x-1)..min($xmax,$x+1)); + if ($in[$y][$x] eq 'x') { + foreach my $yi (@sy) { + foreach my $xi (@sx) { + if ($xi==$x && $yi==$y) { + next; + } + $mn[$yi][$xi]++; + } + } + } + } +} + +foreach my $y (0..$ymax) { + foreach my $x (0..$xmax) { + if ($in[$y][$x] eq 'x') { + $mn[$y][$x]='x'; + } + } + print join(' ',@{$mn[$y]}),"\n"; +} diff --git a/challenge-126/roger-bell-west/python/ch-1.py b/challenge-126/roger-bell-west/python/ch-1.py new file mode 100755 index 0000000000..d50faf6626 --- /dev/null +++ b/challenge-126/roger-bell-west/python/ch-1.py @@ -0,0 +1,36 @@ +#! /usr/bin/python3 + +import unittest + +def cn(n): + k=n + digits=[] + while k>0: + d=k % 10 + if d==1: + digits=[8] * len(digits) + if d>0: + d -= 1 + digits.append(d) + k=int(k/10) + tc=0 + for i in range(len(digits)-1,-1,-1): + tc *= 9 + tc += digits[i] + return tc + +class TestCn(unittest.TestCase): + + def test_ex1(self): + self.assertEqual(cn(15),8,'example 1') + + def test_ex2(self): + self.assertEqual(cn(25),13,'example 2') + + def test_ex3(self): + self.assertEqual(cn(10000),6560,'example 3') + + def test_ex4(self): + self.assertEqual(cn(100000000),43046720,'example 3') + +unittest.main() diff --git a/challenge-126/roger-bell-west/python/ch-2.py b/challenge-126/roger-bell-west/python/ch-2.py new file mode 100755 index 0000000000..f5163b5adb --- /dev/null +++ b/challenge-126/roger-bell-west/python/ch-2.py @@ -0,0 +1,35 @@ +#! /usr/bin/python3 + +ina=[ + ['x','*','*','*','x','*','x','x','x','x'], + ['*','*','*','*','*','*','*','*','*','x'], + ['*','*','*','*','x','*','x','*','x','*'], + ['*','*','*','x','x','*','*','*','*','*'], + ['x','*','*','*','x','*','*','*','*','x'] +] + +ysiz=len(ina) +xsiz=len(ina[0]) + +mn=[] +for i in range(ysiz): + mn.append([0] * xsiz) + +for y in range(ysiz): + sy=range(max(0,y-1),min(ysiz,y+2)) + for x in range(xsiz): + sx=range(max(0,x-1),min(xsiz,x+2)) + if ina[y][x] == 'x': + for yi in sy: + for xi in sx: + if xi==x and yi==y: + continue + mn[yi][xi] += 1 + +for y in range(ysiz): + for x in range(xsiz): + if ina[y][x] == 'x': + mn[y][x] = 'x' + else: + mn[y][x] = str(mn[y][x]) + print(" ".join(mn[y])) diff --git a/challenge-126/roger-bell-west/raku/ch-1.p6 b/challenge-126/roger-bell-west/raku/ch-1.p6 new file mode 100755 index 0000000000..c3dc09ea03 --- /dev/null +++ b/challenge-126/roger-bell-west/raku/ch-1.p6 @@ -0,0 +1,32 @@ +#! /usr/bin/perl6 + +use Test; + +plan 4; + +is(cn(15),8,'example 1'); +is(cn(25),13,'example 2'); +is(cn(10000),6560,'example 3'); +is(cn(100000000),43046720,'example 4'); + +sub cn($n) { + my $k=$n; + my @digits; + while ($k>0) { + my $d=$k%10; + if ($d==1) { + @digits=(8) xx @digits.elems; + } + if ($d>0) { + $d--; + } + push @digits,$d; + $k=floor($k/10); + } + my $tc=0; + for (0..@digits.end).reverse() -> $i { + $tc*=9; + $tc+=@digits[$i]; + } + return $tc; +} diff --git a/challenge-126/roger-bell-west/raku/ch-2.p6 b/challenge-126/roger-bell-west/raku/ch-2.p6 new file mode 100755 index 0000000000..3f35a4c54f --- /dev/null +++ b/challenge-126/roger-bell-west/raku/ch-2.p6 @@ -0,0 +1,43 @@ +#! /usr/bin/perl6 + +my @in=( + [qw{x * * * x * x x x x}], + [qw{* * * * * * * * * x}], + [qw{* * * * x * x * x *}], + [qw{* * * x x * * * * *}], + [qw{x * * * x * * * * x}], + ); + +my $ymax=@in.end; +my $xmax=@in[0].end; + +my @mn; +for 0..$ymax { + push @mn,[(0) xx ($xmax+1)]; +} + +for (0..$ymax) -> $y { + my @sy=(max(0,$y-1)..min($ymax,$y+1)); + for (0..$xmax) -> $x { + my @sx=(max(0,$x-1)..min($xmax,$x+1)); + if (@in[$y][$x] eq 'x') { + for @sy -> $yi { + for @sx -> $xi { + if ($xi==$x && $yi==$y) { + next; + } + @mn[$yi][$xi]++; + } + } + } + } +} + +for (0..$ymax) -> $y { + for (0..$xmax) -> $x { + if (@in[$y][$x] eq 'x') { + @mn[$y][$x]='x'; + } + } + say @mn[$y].join(' '); +} diff --git a/challenge-126/roger-bell-west/ruby/ch-1.rb b/challenge-126/roger-bell-west/ruby/ch-1.rb new file mode 100755 index 0000000000..6fc0fd84cb --- /dev/null +++ b/challenge-126/roger-bell-west/ruby/ch-1.rb @@ -0,0 +1,45 @@ +#! /usr/bin/ruby + +require 'test/unit' + +def cn(n) + k=n + digits=[] + while (k>0) + kd=k.divmod(10) + k=kd[0] + if kd[1]==1 then + digits=Array.new(digits.length(),8) + end + if kd[1]>0 then + kd[1] -= 1 + end + digits.push(kd[1]) + end + tc=0 + (digits.length()-1).downto(0) do |i| + tc *= 9 + tc += digits[i] + end + return tc +end + +class TestPt < Test::Unit::TestCase + + def test_ex1 + assert_equal(8,cn(15)) + end + + def test_ex2 + assert_equal(13,cn(25)) + end + + def test_ex3 + assert_equal(6560,cn(10000)) + end + + def test_ex4 + assert_equal(43046720,cn(100000000)) + end + +end diff --git a/challenge-126/roger-bell-west/ruby/ch-2.rb b/challenge-126/roger-bell-west/ruby/ch-2.rb new file mode 100755 index 0000000000..44a55a8a98 --- /dev/null +++ b/challenge-126/roger-bell-west/ruby/ch-2.rb @@ -0,0 +1,40 @@ +#! /usr/bin/ruby + +ina=[ + ['x','*','*','*','x','*','x','x','x','x'], + ['*','*','*','*','*','*','*','*','*','x'], + ['*','*','*','*','x','*','x','*','x','*'], + ['*','*','*','x','x','*','*','*','*','*'], + ['x','*','*','*','x','*','*','*','*','x'] +] + +ymax=ina.length()-1 +xmax=ina[0].length()-1 + +mn=Array.new(ymax+1) {Array.new(xmax+1,0)} + +0.upto(ymax) do |y| + sy=[0,y-1].max.upto([ymax,y+1].min) + 0.upto(xmax) do |x| + sx=[0,x-1].max.upto([xmax,x+1].min) + if ina[y][x] == 'x' then + sy.each do |yi| + sx.each do |xi| + if xi==x && yi==y then + next + end + mn[yi][xi] += 1 + end + end + end + end +end + +0.upto(ymax) do |y| + 0.upto(xmax) do |x| + if ina[y][x] == "x" then + mn[y][x]="x" + end + end + print(mn[y].join(" ")+"\n") +end diff --git a/challenge-126/roger-bell-west/rust/ch-1.rs b/challenge-126/roger-bell-west/rust/ch-1.rs new file mode 100755 index 0000000000..e10f631917 --- /dev/null +++ b/challenge-126/roger-bell-west/rust/ch-1.rs @@ -0,0 +1,44 @@ +#! /bin/sh +//usr/bin/env rustc --test $0 -o ${0}x && ./${0}x; rm -f ${0}x ; exit + +#[test] +fn test_ex1() { + assert_eq!(cn(15),8); +} + +#[test] +fn test_ex2() { + assert_eq!(cn(25),13); +} + +#[test] +fn test_ex3() { + assert_eq!(cn(10000),6560); +} + +#[test] +fn test_ex4() { + assert_eq!(cn(100000000),43046720); +} + +fn cn(n: i64) -> i64 { + let mut k=n; + let mut digits: Vec=vec![]; + while k>0 { + let mut d=k % 10; + if d==1 { + digits=vec![8;digits.len()]; + } + if d>0 { + d -= 1; + } + digits.push(d); + k /= 10; + } + let mut tc: i64=0; + for i in (0..=digits.len()-1).rev() { + tc *= 9; + tc += digits[i]; + } + return tc; +} diff --git a/challenge-126/roger-bell-west/rust/ch-2.rs b/challenge-126/roger-bell-west/rust/ch-2.rs new file mode 100755 index 0000000000..e9e10695d6 --- /dev/null +++ b/challenge-126/roger-bell-west/rust/ch-2.rs @@ -0,0 +1,56 @@ +#! /bin/sh +//usr/bin/env rustc $0 -o ${0}x && ./${0}x; rm -f ${0}x ; exit + +fn main() { + let ina=vec![ + vec!['x','*','*','*','x','*','x','x','x','x'], + vec!['*','*','*','*','*','*','*','*','*','x'], + vec!['*','*','*','*','x','*','x','*','x','*'], + vec!['*','*','*','x','x','*','*','*','*','*'], + vec!['x','*','*','*','x','*','*','*','*','x'] + ]; + let ymax=ina.len()-1; + let xmax=ina[0].len()-1; + let mut mn: Vec>=vec![vec![0;xmax+1];ymax+1]; + for y in 0..=ymax { + for x in 0..=xmax { + if ina[y][x] == 'x' { + let mut yl=0; + if y>1 { + yl=y-1; + } + let mut yh=y+1; + if yh>ymax { + yh=ymax; + } + for yi in yl ..= yh { + let mut xl=0; + if x>1 { + xl=x-1; + } + let mut xh=x+1; + if xh>xmax { + xh=xmax; + } + for xi in xl ..= xh { + if xi==x && yi==y { + continue; + } + mn[yi][xi] += 1; + } + } + } + } + } + for y in 0..=ymax { + let mut line: Vec=vec![]; + for x in 0..=xmax { + if ina[y][x] == 'x' { + line.push("x".to_string()); + } else { + line.push(mn[y][x].to_string()); + } + } + println!("{}",line.join(" ")); + } +} -- cgit From 29508f0d381cd703ef8f160b1a1bae0ae9025d0e Mon Sep 17 00:00:00 2001 From: drbaggy Date: Mon, 16 Aug 2021 13:20:00 +0100 Subject: notes added --- challenge-126/james-smith/perl/ch-1.pl | 42 ++++++++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 9 deletions(-) (limited to 'challenge-126') diff --git a/challenge-126/james-smith/perl/ch-1.pl b/challenge-126/james-smith/perl/ch-1.pl index e680e413c2..94b9ee2ff9 100644 --- a/challenge-126/james-smith/perl/ch-1.pl +++ b/challenge-126/james-smith/perl/ch-1.pl @@ -38,6 +38,19 @@ is( get_no_one_count_x($_->[0]), $_->[1] ) foreach @TESTS; is( get_no_one_count($_->[0]), $_->[1] ) foreach @TESTS; done_testing(); +cmpthese(-5,{ 'scan 98' => sub { get_no_one_count( 98 ) }, + 'opt 98' => sub { get_no_one_count_x( 98 ) }, }); +cmpthese(-5,{ 'scan 987' => sub { get_no_one_count( 987 ) }, + 'opt 987' => sub { get_no_one_count_x( 987 ) }, }); +cmpthese(-5,{ 'scan 9876' => sub { get_no_one_count( 9876 ) }, + 'opt 9876' => sub { get_no_one_count_x( 9876 ) }, }); +cmpthese(-5,{ 'scan 98765' => sub { get_no_one_count( 98765 ) }, + 'opt 98765' => sub { get_no_one_count_x( 98765 ) }, }); +cmpthese(-5,{ 'scan 987654' => sub { get_no_one_count( 987654 ) }, + 'opt 987654' => sub { get_no_one_count_x( 987654 ) }, }); +cmpthese(-5,{ 'scan 9876543' => sub { get_no_one_count( 9876543 ) }, + 'opt 9876543' => sub { get_no_one_count_x( 9876543 ) }, }); + sub get_no_one_count { my $n = shift; return scalar grep { ! m{1} } 2..$n; @@ -45,16 +58,27 @@ sub get_no_one_count { ## Optimized version.... seems to work ... and far better than scan... sub get_no_one_count_x { - my $n = shift; - my $c = 0; - my $m = 1; + my ( $n, $count, $pow_9 ) = ( shift, 0, 1 ); while($n) { - my $t=$n%10; - $c = 0 if $t==1; - $c += $t ? ( $t < 2 ? ($m-1) : ($t-1)*$m ) : 0; - $m *= 9; - $n= int($n/10); + my $t = $n % 10; ## get last digit + $count = 0 if $t==1; ## Throw everything away we've found a 1 + $count += $t ? ( $t == 1 ? ($pow_9-1) : ($t-1)*$pow_9 ) : 0; + ## 0 it contributes nothing + ## 1 contributes 9^X-1 + ## 2-9 contributes (n-1)9^X + $pow_9 *= 9; ## update power of nine + $n = ( $n - $t )/10; ## drop last digit } - return $c; + return $count; } +## Comparison + +# | N | scan | opt | Speed-up | +# | --------: | --------: | --------: | ---------: | +# | 98 | 16,027 | 1,173,850 | 72 | +# | 987 | 2,623 | 867,796 | 330 | +# | 9,876 | 253 | 685,956 | 2,715 | +# | 98,765 | 24.4 | 565,427 | 23,155 | +# | 987,654 | 1.23 | 482,800 | 392,998 | +# | 9,876,543 | 0.23 | 418,410 | 1,853,771 | -- cgit From f9896cfb012e307db009089aba9c24c35368fb06 Mon Sep 17 00:00:00 2001 From: James Smith Date: Mon, 16 Aug 2021 14:29:17 +0100 Subject: d --- challenge-126/james-smith/README.md | 109 +++++++++++++++++++++--------------- challenge-126/james-smith/blog.txt | 1 + 2 files changed, 65 insertions(+), 45 deletions(-) create mode 100644 challenge-126/james-smith/blog.txt (limited to 'challenge-126') diff --git a/challenge-126/james-smith/README.md b/challenge-126/james-smith/README.md index 97ebd934cd..339d6f4d9d 100644 --- a/challenge-126/james-smith/README.md +++ b/challenge-126/james-smith/README.md @@ -1,4 +1,4 @@ -# Perl Weekly Challenge #125 +# Perl Weekly Challenge #126 You can find more information about this weeks, and previous weeks challenges at: @@ -10,67 +10,86 @@ submit solutions in whichever language you feel comfortable with. You can find the solutions here on github at: -https://github.com/drbaggy/perlweeklychallenge-club/tree/master/challenge-125/james-smith/perl +https://github.com/drbaggy/perlweeklychallenge-club/tree/master/challenge-126/james-smith/perl -# Task 1 - Pythagorean Triples +# Task 1 - Count Numbers -***You are given a positive integer `$N`. Write a script to print all Pythagorean Triples containing `$N` as a member. Print `-1` if it can’t be a member of any. Triples with the same set of elements are considered the same, i.e. if your script has already printed (3, 4, 5), (4, 3, 5) should not be printed.*** +***You are given a positive integer `$N` - Write a script to print count of numbers from `1` to `$N` that don’t contain digit `1`.*** ## The solution -There are two cases to consider - whether `$N` is the hypotenuse or one of the shorter sides. +First pass - just do the simple `O(n)` thing which is to loop through all `$N` numbers and count those without `1`s. - * `$N` is the hypotenuse - we just need to work out whether `$N**2 - $a**2` is a square for `$a` between `3` and `$N/sqrt 2` +```perl +sub get_no_one_count { + my $n = shift; + return scalar grep { ! m{1} } 2..$n; +} +``` - * `$N` is not the hypotenuse - we need to loop through `$a` from `$N+1` such that `$a**2-$N**2` is a square. +If we look at a few numbers we see that for powers of 10 we see we have values 8, 80, 728, 6560, 59048, ... what we notices these are all of the form `9^$N-1`.... For multiples of these we see that for the total is `(n-1)*9^N`. + +We see we can then add these up - with one exception if we find a 1 we stop the loop (or if working backwards) throw any calculations away - giving us the order `O(ln n)` solution: -This gives: ```perl -sub get_triples { - my $n = shift; - return $n < 3 ? -1 : join '; ', map { sprintf '(%s)', join ', ', @{$_} } - ( - grep { $_->[1] == int $_->[1] } ## Check if all int - map { [ $_, sqrt($n**2-$_**2), $n ] } ## Generate triple - 3 .. sqrt($n**2/2) ## Shortest side ($n is hypotenuse) - ),( - map { $_->[0]>$_->[1] ? [@{$_}[1,0,2]] : $_ } ## put in numerical order - grep { $_->[1] == int $_->[1] } ## Check all int - map { [ $n, sqrt($_**2-$n**2), $_ ] } ## Generate triple - ($n+1) .. ($n**2/2+1) ## Hypotenuse ($n is one of other two sides) - ); +sub get_no_one_count_9 { + my ( $n, $count, $pow_9 ) = ( shift, 0, 1 ); + while($n) { + my $t = $n % 10; ## get last digit + $count = 0 if $t==1; ## Throw everything away we've found a 1 + $count += $t ? ( $t == 1 ? ($pow_9-1) : ($t-1)*$pow_9 ) : 0; + ## 0 it contributes nothing + ## 1 contributes 9^X-1 + ## 2-9 contributes (n-1)9^X + $pow_9 *= 9; ## update power of nine + $n = ( $n - $t )/10; ## drop last digit + } + return $count; } ``` -# Task 2 - Binary Tree Diameter -*** Write a script to find the diameter of the given binary tree. The diameter of a binary tree is the length of the longest path between any two nodes in a tree. It doesn’t have to pass through the root.*** +## Comparison +Even for 2 digit numbers this speed up is good (72x), but as N increases +we see that gain gets higher and higher.. for 7 digit numbers the speed +up is 6 orders of magnitude. -## Solution +| N | scan | opt | Speed-up | +| --------: | --------: | --------: | ---------: | +| 98 | 16,027 | 1,173,850 | 72 | +| 987 | 2,623 | 867,796 | 330 | +| 9,876 | 253 | 685,956 | 2,715 | +| 98,765 | 24.4 | 565,427 | 23,155 | +| 987,654 | 1.23 | 482,800 | 392,998 | +| 9,876,543 | 0.23 | 418,410 | 1,853,771 | -For any node - we can compute the longest tree which goes through the node itself - this is the sum of the maximum lengths of the left tree and the depth of the right. We do know that there will be trees for which this is not the diameter - there could be another node for which the left and right depths sum to a larger value... +# Task 2 - Minesweeper Game -So to compute the diameter of the tree we just choose the maximum value of the maximum lengths of the left/right sub tree. +***You are given a rectangle with points marked with either `x` or `*`. Please consider the `x` as a land mine. Write a script to print a rectangle with numbers and `x` as in the Minesweeper game.*** -We will re-use the BinaryTree module from a previous challenge and so need to define walk functions to work out the maximum length of a subtree and consequently diameter... +## Solution ```perl -sub max_length { - my $self = shift; - my $d = 0; - $d = $self->left->max_length if $self->has_left; - return 1+$d unless $self->has_right; - my $t = $self->right->max_length; - return $t > $d ? 1+$t : 1+$d; -} - -sub diameter { - my $self = shift; - my $global = { 'diameter' => 0 }; - $self->walk( sub { - my $d = ($_[0]->has_left ? $_[0]->left->max_length : 0 ) + - ($_[0]->has_right ? $_[0]->right->max_length : 0 ); - $_[1]{'diameter'} = $d if $d > $_[1]->{'diameter'}; - }, $global ); - return $global->{'diameter'}; +sub solve { + my @res = (''); + ## Map input of strings into an array of 1s (bombs) + 0s (spaces) + my @in = map { [ map { $_ eq 'x' ? 1:0 } split //, $_ ] } @_; + + ## Get index of last row or column... + my( $h, $w ) = ( $#_, -1 + length $_[0] ); + + foreach my $y ( 0 .. $h ) { + $res[-1] .= $in[$y][$_] ? 'x' : + ( $y ? ( $_ ? $in[$y-1][$_-1] : 0 ) + $in[$y-1][$_] + ( $_ < $w ? $in[$y-1][$_+1] : 0 ) : 0 ) + + ( $_ ? $in[$y ][$_-1] : 0 ) + $in[$y ][$_] + ( $_ < $w ? $in[$y ][$_+1] : 0 ) + + ( $y < $h ? ( $_ ? $in[$y+1][$_-1] : 0 ) + $in[$y+1][$_] + ( $_ < $w ? $in[$y+1][$_+1] : 0 ) : 0 ) foreach 0 .. $w; + push @res, ''; + } + return join "\n", @res; } ``` + +There are two stages to this: + + 1. convert the strings into an array of `1`s and `0`s representing mines and spaces. + 2. we compute the convulation - counting the number of mines in adjacent squares (or tagging with a "x" if the square is bomb) + diff --git a/challenge-126/james-smith/blog.txt b/challenge-126/james-smith/blog.txt new file mode 100644 index 0000000000..7562bfe1b6 --- /dev/null +++ b/challenge-126/james-smith/blog.txt @@ -0,0 +1 @@ +https://github.com/drbaggy/perlweeklychallenge-club/tree/master/challenge-126/james-smith \ No newline at end of file -- cgit From 1a1b004f55fb895b19d1e09528e4834f3bfbf9ef Mon Sep 17 00:00:00 2001 From: drbaggy Date: Mon, 16 Aug 2021 14:29:50 +0100 Subject: change name --- challenge-126/james-smith/perl/ch-1.pl | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'challenge-126') diff --git a/challenge-126/james-smith/perl/ch-1.pl b/challenge-126/james-smith/perl/ch-1.pl index 94b9ee2ff9..b3a1866f84 100644 --- a/challenge-126/james-smith/perl/ch-1.pl +++ b/challenge-126/james-smith/perl/ch-1.pl @@ -32,24 +32,24 @@ my @TESTS = ( [ 1000000, 531440 ], ); -# warn "@{$_} -> ", get_no_one_count_x($_->[0]), "\n" foreach @TESTS; +# warn "@{$_} -> ", get_no_one_count_9($_->[0]), "\n" foreach @TESTS; -is( get_no_one_count_x($_->[0]), $_->[1] ) foreach @TESTS; +is( get_no_one_count_9($_->[0]), $_->[1] ) foreach @TESTS; is( get_no_one_count($_->[0]), $_->[1] ) foreach @TESTS; done_testing(); cmpthese(-5,{ 'scan 98' => sub { get_no_one_count( 98 ) }, - 'opt 98' => sub { get_no_one_count_x( 98 ) }, }); + 'opt 98' => sub { get_no_one_count_9( 98 ) }, }); cmpthese(-5,{ 'scan 987' => sub { get_no_one_count( 987 ) }, - 'opt 987' => sub { get_no_one_count_x( 987 ) }, }); + 'opt 987' => sub { get_no_one_count_9( 987 ) }, }); cmpthese(-5,{ 'scan 9876' => sub { get_no_one_count( 9876 ) }, - 'opt 9876' => sub { get_no_one_count_x( 9876 ) }, }); + 'opt 9876' => sub { get_no_one_count_9( 9876 ) }, }); cmpthese(-5,{ 'scan 98765' => sub { get_no_one_count( 98765 ) }, - 'opt 98765' => sub { get_no_one_count_x( 98765 ) }, }); + 'opt 98765' => sub { get_no_one_count_9( 98765 ) }, }); cmpthese(-5,{ 'scan 987654' => sub { get_no_one_count( 987654 ) }, - 'opt 987654' => sub { get_no_one_count_x( 987654 ) }, }); + 'opt 987654' => sub { get_no_one_count_9( 987654 ) }, }); cmpthese(-5,{ 'scan 9876543' => sub { get_no_one_count( 9876543 ) }, - 'opt 9876543' => sub { get_no_one_count_x( 9876543 ) }, }); + 'opt 9876543' => sub { get_no_one_count_9( 9876543 ) }, }); sub get_no_one_count { my $n = shift; @@ -57,7 +57,7 @@ sub get_no_one_count { } ## Optimized version.... seems to work ... and far better than scan... -sub get_no_one_count_x { +sub get_no_one_count_9 { my ( $n, $count, $pow_9 ) = ( shift, 0, 1 ); while($n) { my $t = $n % 10; ## get last digit -- cgit From ca5cd9c05d9a0e6aacc064404b6beafcd241995e Mon Sep 17 00:00:00 2001 From: Simon Green Date: Mon, 16 Aug 2021 23:58:20 +1000 Subject: sgreen solution to challenge 126 --- challenge-126/sgreen/README.md | 4 +-- challenge-126/sgreen/blog.txt | 1 + challenge-126/sgreen/perl/ch-1.pl | 24 +++++++++++++++ challenge-126/sgreen/perl/ch-2.pl | 64 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 91 insertions(+), 2 deletions(-) create mode 100644 challenge-126/sgreen/blog.txt create mode 100755 challenge-126/sgreen/perl/ch-1.pl create mode 100755 challenge-126/sgreen/perl/ch-2.pl (limited to 'challenge-126') diff --git a/challenge-126/sgreen/README.md b/challenge-126/sgreen/README.md index e025103f4b..f9b8c29dad 100644 --- a/challenge-126/sgreen/README.md +++ b/challenge-126/sgreen/README.md @@ -1,3 +1,3 @@ -# The Weekly Challenge 124 +# The Weekly Challenge 126 -Solution by Simon Green. [Blog](https://dev.to/simongreennet/weekly-challenge-124-2gi7) +Solution by Simon Green. [Blog](https://dev.to/simongreennet/weekly-challenge-126-19fg) diff --git a/challenge-126/sgreen/blog.txt b/challenge-126/sgreen/blog.txt new file mode 100644 index 0000000000..6f1f01dfd6 --- /dev/null +++ b/challenge-126/sgreen/blog.txt @@ -0,0 +1 @@ +https://dev.to/simongreennet/weekly-challenge-126-19fg diff --git a/challenge-126/sgreen/perl/ch-1.pl b/challenge-126/sgreen/perl/ch-1.pl new file mode 100755 index 0000000000..af1c8d6326 --- /dev/null +++ b/challenge-126/sgreen/perl/ch-1.pl @@ -0,0 +1,24 @@ +#!/usr/bin/env perl + +use strict; +use warnings; +use feature 'say'; + +sub main { + my $N = shift; + + # Sanity check + die "You must supply a postive integer" unless defined $N; + die "The value '$N' is not a positive integer\n" unless $N =~ /^[1-9][0-9]*$/; + + # Count the number of numbers that don't have a one + my $count = 0; + foreach my $number ( 2 .. $N ) { + ++$count if index( $number, '1' ) == -1; + } + + # Display the result + say $count; +} + +main(@ARGV); diff --git a/challenge-126/sgreen/perl/ch-2.pl b/challenge-126/sgreen/perl/ch-2.pl new file mode 100755 index 0000000000..c00bd75489 --- /dev/null +++ b/challenge-126/sgreen/perl/ch-2.pl @@ -0,0 +1,64 @@ +#!/usr/bin/env perl + +use strict; +use warnings; +use feature 'say'; + +sub _process_input { + my @rows = @_; + my @cells = (); + + # Convert rows of x and * to an array of arrays + foreach my $row (<>) { + + # Skip empty rows + next if $row =~ /^\s+$/; + push @cells, [ $row =~ /([x\*])/gm ]; + } + + # Check we have at least one row + die "You must specify at least one row\n" unless scalar(@cells); + + # Check all rows are the same length + foreach my $i ( 1 .. $#cells ) { + die "Not all rows are the same length\n" if scalar( @{ $cells[0] } ) != scalar( @{ $cells[$i] } ); + } + + return @cells; +} + +sub main { + # Unlike most tasks, we will read the input from STDIN. + my @cells = _process_input(); + + # All movements, clockwise from up left + my @directions = ( [ -1, -1 ], [ 0, -1 ], [ 1, -1 ], [ 1, 0 ], [ 1, 1 ], [ 0, 1 ], [ -1, 1 ], [ -1, 0 ] ); + + my $rows = $#cells; + my $cols = $#{ $cells[0] }; + + # Inspect each cells + foreach my $row ( 0 .. $rows ) { + foreach my $col ( 0 .. $cols ) { + # Skip cells that have mines + next if $cells[$row][$col] eq 'x'; + + # Count the number of surronding mines if the are within the + # bounds of the board + my $mines = 0; + foreach my $delta (@directions) { + my $x = $row + $delta->[0]; + my $y = $col + $delta->[1]; + ++$mines if $x >= 0 and $x <= $rows and $y >= 0 and $y <= $cols and $cells[$x][$y] eq 'x'; + } + $cells[$row][$col] = $mines; + } + } + + # Display the results + foreach my $rows (@cells) { + say join ' ', @$rows; + } +} + +main(); -- cgit From da1bb5e2811e7febac224fc576b34ae6e07d5c3e Mon Sep 17 00:00:00 2001 From: Steven Wilson Date: Mon, 16 Aug 2021 16:11:08 +0100 Subject: add solution week 126 task 1 --- challenge-126/steven-wilson/perl/ch-01.pl | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 challenge-126/steven-wilson/perl/ch-01.pl (limited to 'challenge-126') diff --git a/challenge-126/steven-wilson/perl/ch-01.pl b/challenge-126/steven-wilson/perl/ch-01.pl new file mode 100644 index 0000000000..858b161f29 --- /dev/null +++ b/challenge-126/steven-wilson/perl/ch-01.pl @@ -0,0 +1,25 @@ +#!/usr/bin/env perl + +use strict; +use warnings; +use feature qw/ say /; + +my $input = $ARGV[0]; +my $count = 0; +my $current_number = 2; + +if ( not defined $input ) { + die "Enter command line argument as input\n"; +} +elsif ( not( $input =~ /\A[1-9][0-9]*\z/ ) ) { + die "Input should be positive integer\n"; +} + +while ( $current_number <= $input ) { + if ( not( $current_number =~ /1/ ) ) { + $count++; + } + $current_number++; +} + +say $count; -- cgit From 30aae9e73fc2375388125bd03d88b01d6cbe9d92 Mon Sep 17 00:00:00 2001 From: Cris-HD Date: Mon, 16 Aug 2021 20:14:42 +0200 Subject: Added challenge 126 solution --- challenge-126/cristian-heredia/perl/ch_1.pl | 36 +++++++++++++++++++++++++++ challenge-126/cristian-heredia/python/ch_1.py | 30 ++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100755 challenge-126/cristian-heredia/perl/ch_1.pl create mode 100755 challenge-126/cristian-heredia/python/ch_1.py (limited to 'challenge-126') diff --git a/challenge-126/cristian-heredia/perl/ch_1.pl b/challenge-126/cristian-heredia/perl/ch_1.pl new file mode 100755 index 0000000000..d70f4756fd --- /dev/null +++ b/challenge-126/cristian-heredia/perl/ch_1.pl @@ -0,0 +1,36 @@ +=begin + TASK #1 › Count Numbers + Submitted by: Mohammad S Anwar + You are given a positive integer $N. + + Write a script to print count of numbers from 1 to $N that don’t contain digit 1. + + Example + Input: $N = 15 + Output: 8 + + There are 8 numbers between 1 and 15 that don't contain digit 1. + 2, 3, 4, 5, 6, 7, 8, 9. + + Input: $N = 25 + Output: 13 + + There are 13 numbers between 1 and 25 that don't contain digit 1. + 2, 3, 4, 5, 6, 7, 8, 9, 20, 22, 23, 24, 25. + +=end +=cut + +use strict; +use warnings; +use Data::Dumper; + +my $N = 15; +my $counter = 0; + +for my $iter (1 .. $N) { + if ( $iter !~ /1+/) { + $counter++; + } +} +print("Output: $counter\n"); \ No newline at end of file diff --git a/challenge-126/cristian-heredia/python/ch_1.py b/challenge-126/cristian-heredia/python/ch_1.py new file mode 100755 index 0000000000..f0ec59c383 --- /dev/null +++ b/challenge-126/cristian-heredia/python/ch_1.py @@ -0,0 +1,30 @@ +''' + TASK #1 › Count Numbers + Submitted by: Mohammad S Anwar + You are given a positive integer $N. + + Write a script to print count of numbers from 1 to $N that don’t contain digit 1. + + Example + Input: $N = 15 + Output: 8 + + There are 8 numbers between 1 and 15 that don't contain digit 1. + 2, 3, 4, 5, 6, 7, 8, 9. + + Input: $N = 25 + Output: 13 + + There are 13 numbers between 1 and 25 that don't contain digit 1. + 2, 3, 4, 5, 6, 7, 8, 9, 20, 22, 23, 24, 25. + +''' + +N = 15 +counter = 0 + +for iter in range(1, N+1): + if not '1' in str(iter): + counter += 1 + +print(f"Output: {counter}"); \ No newline at end of file -- cgit From b0257db0d734f63a09779995ebedf01f7c9b2ebe Mon Sep 17 00:00:00 2001 From: Andrew Shitov Date: Mon, 16 Aug 2021 22:35:18 +0200 Subject: Week 126, task 1 by ash --- challenge-126/ash/README | 1 + challenge-126/ash/raku/ch-1.raku | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 challenge-126/ash/README create mode 100644 challenge-126/ash/raku/ch-1.raku (limited to 'challenge-126') diff --git a/challenge-126/ash/README b/challenge-126/ash/README new file mode 100644 index 0000000000..318b1bfb41 --- /dev/null +++ b/challenge-126/ash/README @@ -0,0 +1 @@ +Solutions by Andrew Shitov diff --git a/challenge-126/ash/raku/ch-1.raku b/challenge-126/ash/raku/ch-1.raku new file mode 100644 index 0000000000..d1c42c4796 --- /dev/null +++ b/challenge-126/ash/raku/ch-1.raku @@ -0,0 +1,18 @@ +sub count($n) { + my @items = (2..$n).grep: * !~~ /1/; + if @items { + if @items.elems == 1 { + say "There is 1 number between 1 and $n that doesn't contain digit 1."; + } + else { + say "There are {+@items} numbers between 1 and $n that don't contain digit 1."; + } + + say @items.join(', ') ~ '.'; + } + else { + say "There are no numbers between 1 and $n that contain no digit 1."; + } +} + +.&count for 5, 15, 25; -- cgit From e61dc2c95e6bc0337e0f8e468603ecf6f652d10f Mon Sep 17 00:00:00 2001 From: Mohammad S Anwar Date: Mon, 16 Aug 2021 21:42:25 +0100 Subject: - Added solution by Steven Wilson. --- challenge-126/steven-wilson/perl/ch-01.pl | 25 ------------------------- challenge-126/steven-wilson/perl/ch-1.pl | 25 +++++++++++++++++++++++++ 2 files changed, 25 insertions(+), 25 deletions(-) delete mode 100644 challenge-126/steven-wilson/perl/ch-01.pl create mode 100644 challenge-126/steven-wilson/perl/ch-1.pl (limited to 'challenge-126') diff --git a/challenge-126/steven-wilson/perl/ch-01.pl b/challenge-126/steven-wilson/perl/ch-01.pl deleted file mode 100644 index 858b161f29..0000000000 --- a/challenge-126/steven-wilson/perl/ch-01.pl +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/env perl - -use strict; -use warnings; -use feature qw/ say /; - -my $input = $ARGV[0]; -my $count = 0; -my $current_number = 2; - -if ( not defined $input ) { - die "Enter command line argument as input\n"; -} -elsif ( not( $input =~ /\A[1-9][0-9]*\z/ ) ) { - die "Input should be positive integer\n"; -} - -while ( $current_number <= $input ) { - if ( not( $current_number =~ /1/ ) ) { - $count++; - } - $current_number++; -} - -say $count; diff --git a/challenge-126/steven-wilson/perl/ch-1.pl b/challenge-126/steven-wilson/perl/ch-1.pl new file mode 100644 index 0000000000..858b161f29 --- /dev/null +++ b/challenge-126/steven-wilson/perl/ch-1.pl @@ -0,0 +1,25 @@ +#!/usr/bin/env perl + +use strict; +use warnings; +use feature qw/ say /; + +my $input = $ARGV[0]; +my $count = 0; +my $current_number = 2; + +if ( not defined $input ) { + die "Enter command line argument as input\n"; +} +elsif ( not( $input =~ /\A[1-9][0-9]*\z/ ) ) { + die "Input should be positive integer\n"; +} + +while ( $current_number <= $input ) { + if ( not( $current_number =~ /1/ ) ) { + $count++; + } + $current_number++; +} + +say $count; -- cgit From 534f974d6c9655a0c1c9240848789d81cc3bc424 Mon Sep 17 00:00:00 2001 From: Mohammad S Anwar Date: Mon, 16 Aug 2021 21:50:48 +0100 Subject: - Added solution by Cristina Heredia. --- challenge-126/cristian-heredia/perl/ch-1.pl | 36 +++++++++++++++++++++++++++ challenge-126/cristian-heredia/perl/ch_1.pl | 36 --------------------------- challenge-126/cristian-heredia/python/ch-1.py | 30 ++++++++++++++++++++++ challenge-126/cristian-heredia/python/ch_1.py | 30 ---------------------- 4 files changed, 66 insertions(+), 66 deletions(-) create mode 100755 challenge-126/cristian-heredia/perl/ch-1.pl delete mode 100755 challenge-126/cristian-heredia/perl/ch_1.pl create mode 100755 challenge-126/cristian-heredia/python/ch-1.py delete mode 100755 challenge-126/cristian-heredia/python/ch_1.py (limited to 'challenge-126') diff --git a/challenge-126/cristian-heredia/perl/ch-1.pl b/challenge-126/cristian-heredia/perl/ch-1.pl new file mode 100755 index 0000000000..d70f4756fd --- /dev/null +++ b/challenge-126/cristian-heredia/perl/ch-1.pl @@ -0,0 +1,36 @@ +=begin + TASK #1 › Count Numbers + Submitted by: Mohammad S Anwar + You are given a positive integer $N. + + Write a script to print count of numbers from 1 to $N that don’t contain digit 1. + + Example + Input: $N = 15 + Output: 8 + + There are 8 numbers between 1 and 15 that don't contain digit 1. + 2, 3, 4, 5, 6, 7, 8, 9. + + Input: $N = 25 + Output: 13 + + There are 13 numbers between 1 and 25 that don't contain digit 1. + 2, 3, 4, 5, 6, 7, 8, 9, 20, 22, 23, 24, 25. + +=end +=cut + +use strict; +use warnings; +use Data::Dumper; + +my $N = 15; +my $counter = 0; + +for my $iter (1 .. $N) { + if ( $iter !~ /1+/) { + $counter++; + } +} +print("Output: $counter\n"); \ No newline at end of file diff --git a/challenge-126/cristian-heredia/perl/ch_1.pl b/challenge-126/cristian-heredia/perl/ch_1.pl deleted file mode 100755 index d70f4756fd..0000000000 --- a/challenge-126/cristian-heredia/perl/ch_1.pl +++ /dev/null @@ -1,36 +0,0 @@ -=begin - TASK #1 › Count Numbers - Submitted by: Mohammad S Anwar - You are given a positive integer $N. - - Write a script to print count of numbers from 1 to $N that don’t contain digit 1. - - Example - Input: $N = 15 - Output: 8 - - There are 8 numbers between 1 and 15 that don't contain digit 1. - 2, 3, 4, 5, 6, 7, 8, 9. - - Input: $N = 25 - Output: 13 - - There are 13 numbers between 1 and 25 that don't contain digit 1. - 2, 3, 4, 5, 6, 7, 8, 9, 20, 22, 23, 24, 25. - -=end -=cut - -use strict; -use warnings; -use Data::Dumper; - -my $N = 15; -my $counter = 0; - -for my $iter (1 .. $N) { - if ( $iter !~ /1+/) { - $counter++; - } -} -print("Output: $counter\n"); \ No newline at end of file diff --git a/challenge-126/cristian-heredia/python/ch-1.py b/challenge-126/cristian-heredia/python/ch-1.py new file mode 100755 index 0000000000..f0ec59c383 --- /dev/null +++ b/challenge-126/cristian-heredia/python/ch-1.py @@ -0,0 +1,30 @@ +''' + TASK #1 › Count Numbers + Submitted by: Mohammad S Anwar + You are given a positive integer $N. + + Write a script to print count of numbers from 1 to $N that don’t contain digit 1. + + Example + Input: $N = 15 + Output: 8 + + There are 8 numbers between 1 and 15 that don't contain digit 1. + 2, 3, 4, 5, 6, 7, 8, 9. + + Input: $N = 25 + Output: 13 + + There are 13 numbers between 1 and 25 that don't contain digit 1. + 2, 3, 4, 5, 6, 7, 8, 9, 20, 22, 23, 24, 25. + +''' + +N = 15 +counter = 0 + +for iter in range(1, N+1): + if not '1' in str(iter): + counter += 1 + +print(f"Output: {counter}"); \ No newline at end of file diff --git a/challenge-126/cristian-heredia/python/ch_1.py b/challenge-126/cristian-heredia/python/ch_1.py deleted file mode 100755 index f0ec59c383..0000000000 --- a/challenge-126/cristian-heredia/python/ch_1.py +++ /dev/null @@ -1,30 +0,0 @@ -''' - TASK #1 › Count Numbers - Submitted by: Mohammad S Anwar - You are given a positive integer $N. - - Write a script to print count of numbers from 1 to $N that don’t contain digit 1. - - Example - Input: $N = 15 - Output: 8 - - There are 8 numbers between 1 and 15 that don't contain digit 1. - 2, 3, 4, 5, 6, 7, 8, 9. - - Input: $N = 25 - Output: 13 - - There are 13 numbers between 1 and 25 that don't contain digit 1. - 2, 3, 4, 5, 6, 7, 8, 9, 20, 22, 23, 24, 25. - -''' - -N = 15 -counter = 0 - -for iter in range(1, N+1): - if not '1' in str(iter): - counter += 1 - -print(f"Output: {counter}"); \ No newline at end of file -- cgit From cddf830adfb158469a50cc03d0ea77b007d2f23b Mon Sep 17 00:00:00 2001 From: James Smith Date: Mon, 16 Aug 2021 22:25:06 +0100 Subject: Update README.md --- challenge-126/james-smith/README.md | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) (limited to 'challenge-126') diff --git a/challenge-126/james-smith/README.md b/challenge-126/james-smith/README.md index 339d6f4d9d..6f2ffee2f8 100644 --- a/challenge-126/james-smith/README.md +++ b/challenge-126/james-smith/README.md @@ -64,25 +64,23 @@ up is 6 orders of magnitude. # Task 2 - Minesweeper Game -***You are given a rectangle with points marked with either `x` or `*`. Please consider the `x` as a land mine. Write a script to print a rectangle with numbers and `x` as in the Minesweeper game.*** +***You are given a rectangle with points marked with either `x` or `*`. Consider the `x` as a land mine. Write a script to print a rectangle with numbers and `x` as in the Minesweeper game.*** ## Solution ```perl sub solve { - my @res = (''); - ## Map input of strings into an array of 1s (bombs) + 0s (spaces) - my @in = map { [ map { $_ eq 'x' ? 1:0 } split //, $_ ] } @_; + my @res = (); + my @g = map { [ map { $_ eq 'x' ? 1 : 0 } split //, $_ ] } @_; - ## Get index of last row or column... my( $h, $w ) = ( $#_, -1 + length $_[0] ); - foreach my $y ( 0 .. $h ) { - $res[-1] .= $in[$y][$_] ? 'x' : - ( $y ? ( $_ ? $in[$y-1][$_-1] : 0 ) + $in[$y-1][$_] + ( $_ < $w ? $in[$y-1][$_+1] : 0 ) : 0 ) + - ( $_ ? $in[$y ][$_-1] : 0 ) + $in[$y ][$_] + ( $_ < $w ? $in[$y ][$_+1] : 0 ) + - ( $y < $h ? ( $_ ? $in[$y+1][$_-1] : 0 ) + $in[$y+1][$_] + ( $_ < $w ? $in[$y+1][$_+1] : 0 ) : 0 ) foreach 0 .. $w; - push @res, ''; + push @res, join '', map { + $g[$y][$_] ? 'x' : + ( $y ? ( $_ ? $g[$y-1][$_-1] : 0 ) + $g[$y-1][$_] + ( $_<$w ? $g[$y-1][$_+1] : 0 ) : 0 ) + + ( $_ ? $g[$y ][$_-1] : 0 ) + $g[$y ][$_] + ( $_<$w ? $g[$y ][$_+1] : 0 ) + + ( $y<$h ? ( $_ ? $g[$y+1][$_-1] : 0 ) + $g[$y+1][$_] + ( $_<$w ? $g[$y+1][$_+1] : 0 ) : 0 ) + } 0 .. $w; } return join "\n", @res; } @@ -91,5 +89,6 @@ sub solve { There are two stages to this: 1. convert the strings into an array of `1`s and `0`s representing mines and spaces. - 2. we compute the convulation - counting the number of mines in adjacent squares (or tagging with a "x" if the square is bomb) + 2. we compute the convulation - counting the number of mines in adjacent squares (or tagging with a "x" if the square is bomb). + Rather than using loops and if statements we use nested ternary operators in a single line -- cgit From fff0de07974a3aa8b32d78d3251567274027999d Mon Sep 17 00:00:00 2001 From: drbaggy Date: Mon, 16 Aug 2021 22:26:01 +0100 Subject: tidied up code --- challenge-126/james-smith/perl/ch-1.pl | 2 +- challenge-126/james-smith/perl/ch-2.pl | 21 +++++++++------------ 2 files changed, 10 insertions(+), 13 deletions(-) (limited to 'challenge-126') diff --git a/challenge-126/james-smith/perl/ch-1.pl b/challenge-126/james-smith/perl/ch-1.pl index b3a1866f84..a42ad642c7 100644 --- a/challenge-126/james-smith/perl/ch-1.pl +++ b/challenge-126/james-smith/perl/ch-1.pl @@ -62,7 +62,7 @@ sub get_no_one_count_9 { while($n) { my $t = $n % 10; ## get last digit $count = 0 if $t==1; ## Throw everything away we've found a 1 - $count += $t ? ( $t == 1 ? ($pow_9-1) : ($t-1)*$pow_9 ) : 0; + $count += !$t ? 0 : $t == 1 ? ($pow_9-1) : ($t-1)*$pow_9; ## 0 it contributes nothing ## 1 contributes 9^X-1 ## 2-9 contributes (n-1)9^X diff --git a/challenge-126/james-smith/perl/ch-2.pl b/challenge-126/james-smith/perl/ch-2.pl index 0b0900662c..195a1fbc6a 100644 --- a/challenge-126/james-smith/perl/ch-2.pl +++ b/challenge-126/james-smith/perl/ch-2.pl @@ -11,24 +11,21 @@ use Data::Dumper qw(Dumper); my @grid = qw(x***x*xxxx *********x ****x*x*x* ***xx***** x***x****x); say join "\n",'',@grid,''; -print solve(@grid); +say solve(@grid); say ''; sub solve { - my @res = (''); - ## Map input of strings into an array of 1s (bombs) + 0s (spaces) - my @in = map { [ map { $_ eq 'x' ? 1:0 } split //, $_ ] } @_; + my @res = (); + my @g = map { [ map { $_ eq 'x' ? 1 : 0 } split //, $_ ] } @_; - ## Get index of last row or column... my( $h, $w ) = ( $#_, -1 + length $_[0] ); - foreach my $y ( 0 .. $h ) { - $res[-1] .= $in[$y][$_] ? 'x' : - ( $y ? ( $_ ? $in[$y-1][$_-1] : 0 ) + $in[$y-1][$_] + ( $_ < $w ? $in[$y-1][$_+1] : 0 ) : 0 ) + - ( $_ ? $in[$y ][$_-1] : 0 ) + $in[$y ][$_] + ( $_ < $w ? $in[$y ][$_+1] : 0 ) + - ( $y < $h ? ( $_ ? $in[$y+1][$_-1] : 0 ) + $in[$y+1][$_] + ( $_ < $w ? $in[$y+1][$_+1] : 0 ) : 0 ) foreach 0 .. $w; - push @res, ''; + push @res, join '', map { + $g[$y][$_] ? 'x' : + ( $y ? ( $_ ? $g[$y-1][$_-1] : 0 ) + $g[$y-1][$_] + ( $_<$w ? $g[$y-1][$_+1] : 0 ) : 0 ) + + ( $_ ? $g[$y ][$_-1] : 0 ) + $g[$y ][$_] + ( $_<$w ? $g[$y ][$_+1] : 0 ) + + ( $y<$h ? ( $_ ? $g[$y+1][$_-1] : 0 ) + $g[$y+1][$_] + ( $_<$w ? $g[$y+1][$_+1] : 0 ) : 0 ) + } 0 .. $w; } return join "\n", @res; } - -- cgit From 5acfb9f5cd9b2f59e09c3dd69e3e2b9d2806cca6 Mon Sep 17 00:00:00 2001 From: Mohammad S Anwar Date: Mon, 16 Aug 2021 22:47:12 +0100 Subject: - Added solution by Olivier Delouya. --- challenge-126/olivier-delouya/perl/ch-1.sh | 1 + 1 file changed, 1 insertion(+) create mode 100755 challenge-126/olivier-delouya/perl/ch-1.sh (limited to 'challenge-126') diff --git a/challenge-126/olivier-delouya/perl/ch-1.sh b/challenge-126/olivier-delouya/perl/ch-1.sh new file mode 100755 index 0000000000..93eed73d93 --- /dev/null +++ b/challenge-126/olivier-delouya/perl/ch-1.sh @@ -0,0 +1 @@ +perl -se "$S=0; for($i=2; $i<=$N; $i++) {$S++ if($i !~ /1/)}; print \"$S\n\";" -- -N=15 -- cgit From 9f30135f2c2573fc9bdb4b1b6f28dd45f815cb95 Mon Sep 17 00:00:00 2001 From: chirvasitua Date: Mon, 16 Aug 2021 18:18:31 -0400 Subject: 1st commit on 126_perl --- challenge-126/stuart-little/perl/ch-1.pl | 16 ++++++++++++++++ challenge-126/stuart-little/perl/ch-2.pl | 31 +++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100755 challenge-126/stuart-little/perl/ch-1.pl create mode 100755 challenge-126/stuart-little/perl/ch-2.pl (limited to 'challenge-126') diff --git a/challenge-126/stuart-little/perl/ch-1.pl b/challenge-126/stuart-little/perl/ch-1.pl new file mode 100755 index 0000000000..c421696dcc --- /dev/null +++ b/challenge-126/stuart-little/perl/ch-1.pl @@ -0,0 +1,16 @@ +#!/usr/bin/env perl +use warnings; +use v5.12; + +# run