diff options
| author | Mohammad Sajid Anwar <Mohammad.Anwar@yahoo.com> | 2024-10-02 21:10:42 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-10-02 21:10:42 +0100 |
| commit | 3a9163a43fc5af9720938446aa7d586f863d857b (patch) | |
| tree | ed8fc55da32120a524200a73a517689a02eb6ba9 | |
| parent | 18fc202c4a8a00a116f516795b660dcc0616f8b8 (diff) | |
| parent | 38ab0c8ff7c569bd128afbd99b68d507e7f6956f (diff) | |
| download | perlweeklychallenge-club-3a9163a43fc5af9720938446aa7d586f863d857b.tar.gz perlweeklychallenge-club-3a9163a43fc5af9720938446aa7d586f863d857b.tar.bz2 perlweeklychallenge-club-3a9163a43fc5af9720938446aa7d586f863d857b.zip | |
Merge pull request #10944 from jaldhar/challenge-288
Challenge 288 by Jaldhar H. Vyas.
| -rw-r--r-- | challenge-288/jaldhar-h-vyas/blog.txt | 1 | ||||
| -rw-r--r-- | challenge-288/jaldhar-h-vyas/matrix1.txt | 4 | ||||
| -rw-r--r-- | challenge-288/jaldhar-h-vyas/matrix2.txt | 4 | ||||
| -rw-r--r-- | challenge-288/jaldhar-h-vyas/matrix3.txt | 4 | ||||
| -rwxr-xr-x | challenge-288/jaldhar-h-vyas/perl/ch-1.pl | 23 | ||||
| -rwxr-xr-x | challenge-288/jaldhar-h-vyas/perl/ch-2.pl | 59 | ||||
| -rwxr-xr-x | challenge-288/jaldhar-h-vyas/raku/ch-1.raku | 25 | ||||
| -rwxr-xr-x | challenge-288/jaldhar-h-vyas/raku/ch-2.raku | 59 |
8 files changed, 179 insertions, 0 deletions
diff --git a/challenge-288/jaldhar-h-vyas/blog.txt b/challenge-288/jaldhar-h-vyas/blog.txt new file mode 100644 index 0000000000..b67b08ba01 --- /dev/null +++ b/challenge-288/jaldhar-h-vyas/blog.txt @@ -0,0 +1 @@ +https://www.braincells.com/perl/2024/10/perl_weekly_challenge_week_288.html diff --git a/challenge-288/jaldhar-h-vyas/matrix1.txt b/challenge-288/jaldhar-h-vyas/matrix1.txt new file mode 100644 index 0000000000..2cd31408b4 --- /dev/null +++ b/challenge-288/jaldhar-h-vyas/matrix1.txt @@ -0,0 +1,4 @@ +xxxxo +xoooo +xoooo +xxxoo diff --git a/challenge-288/jaldhar-h-vyas/matrix2.txt b/challenge-288/jaldhar-h-vyas/matrix2.txt new file mode 100644 index 0000000000..7318438ccb --- /dev/null +++ b/challenge-288/jaldhar-h-vyas/matrix2.txt @@ -0,0 +1,4 @@ +xxxxx +xoooo +xxxxo +xoooo diff --git a/challenge-288/jaldhar-h-vyas/matrix3.txt b/challenge-288/jaldhar-h-vyas/matrix3.txt new file mode 100644 index 0000000000..2d8015de75 --- /dev/null +++ b/challenge-288/jaldhar-h-vyas/matrix3.txt @@ -0,0 +1,4 @@ +xxxoo +oooxx +oxxoo +oooxx diff --git a/challenge-288/jaldhar-h-vyas/perl/ch-1.pl b/challenge-288/jaldhar-h-vyas/perl/ch-1.pl new file mode 100755 index 0000000000..0dee55bcf7 --- /dev/null +++ b/challenge-288/jaldhar-h-vyas/perl/ch-1.pl @@ -0,0 +1,23 @@ +#!/usr/bin/perl +use v5.38; + +sub isPalindrome($str) { + return $str eq reverse $str; +} + +my $str = shift; +my $lower = $str - 1; +my $upper = $str + 1; + +while (1) { + if (isPalindrome($lower)) { + say $lower; + last; + } + if (isPalindrome($upper)) { + say $upper; + last; + } + $lower--; + $upper++; +} diff --git a/challenge-288/jaldhar-h-vyas/perl/ch-2.pl b/challenge-288/jaldhar-h-vyas/perl/ch-2.pl new file mode 100755 index 0000000000..2cea87e81f --- /dev/null +++ b/challenge-288/jaldhar-h-vyas/perl/ch-2.pl @@ -0,0 +1,59 @@ +#!/usr/bin/perl +use v5.38; + +sub load($filename) { + my @matrix; + + open my $file, '<', $filename or die "$!\n"; + while (my $line = <$file>) { + push @matrix, [ split //, $line]; + } + close $file; + + return \@matrix; +} + +sub inBounds($rows, $cols, $x, $y) { + return $x >= 0 && $x < $rows && $y >= 0 && $y < $cols; +} + +sub search($matrix, $rows, $cols, $visited, $x, $y, $symbol) { + if (!inBounds($rows, $cols, $x, $y) || $visited->[$x][$y] || $matrix->[$x][$y] ne $symbol) { + return 0; + } + + $visited->[$x][$y] = 1; + my $size = 1; + state @directions = ([0, 1], [1, 0], [0, -1], [-1, 0]); + + + for my $dir (@directions) { + my ($dx, $dy) = @$dir; + $size += search($matrix, $rows, $cols, $visited, $x + $dx, $y + $dy, $symbol); + } + + return $size; +} + +sub largestContiguousBlock($matrix) { + my $rows = scalar @{$matrix}; + my $cols = scalar @{$matrix->[0]}; + my @visited = map { [(0) x $cols] } (0 .. $rows - 1); + my $maxSize = 0; + + for my $i (0 .. $rows - 1) { + for my $j (0 .. $cols - 1) { + if (!$visited[$i][$j]) { + my $currentSize = search($matrix, $rows, $cols, \@visited, $i, $j, $matrix->[$i][$j]); + if ($currentSize > $maxSize) { + $maxSize = $currentSize; + } + } + } + } + + return $maxSize; +} + +my $filename = shift // die "Need filename\n"; +say largestContiguousBlock(load($filename)); diff --git a/challenge-288/jaldhar-h-vyas/raku/ch-1.raku b/challenge-288/jaldhar-h-vyas/raku/ch-1.raku new file mode 100755 index 0000000000..925f6cacd5 --- /dev/null +++ b/challenge-288/jaldhar-h-vyas/raku/ch-1.raku @@ -0,0 +1,25 @@ +#!/usr/bin/raku + +sub isPalindrome(Str $str) { + return $str eq $str.flip; +} + +sub MAIN( + Str $str +) { + my $lower = $str - 1; + my $upper = $str + 1; + + loop { + if (isPalindrome($lower)) { + say $lower; + last; + } + if (isPalindrome($upper)) { + say $upper; + last; + } + $lower--; + $upper++; + } +}
\ No newline at end of file diff --git a/challenge-288/jaldhar-h-vyas/raku/ch-2.raku b/challenge-288/jaldhar-h-vyas/raku/ch-2.raku new file mode 100755 index 0000000000..ff79358a34 --- /dev/null +++ b/challenge-288/jaldhar-h-vyas/raku/ch-2.raku @@ -0,0 +1,59 @@ +#!/usr/bin/raku + +sub load($filename) { + my @matrix; + + for $filename.IO.lines -> $line { + @matrix.push($line.comb); + } + + return @matrix; +} + +sub inBounds($rows, $cols, $x, $y) { + return $x >= 0 && $x < $rows && $y >= 0 && $y < $cols; +} + +sub search(@matrix, $rows, $cols, @visited, $x, $y, $symbol) { + if (!inBounds($rows, $cols, $x, $y) || @visited[$x][$y] || @matrix[$x][$y] ne $symbol) { + return 0; + } + + @visited[$x][$y] = True; + my $size = 1; + state @directions = ([0, 1], [1, 0], [0, -1], [-1, 0]); + + for @directions -> $dir { + my ($dx, $dy) = @$dir; + $size += search(@matrix, $rows, $cols, @visited, $x + $dx, $y + $dy, $symbol); + } + + return $size; +} + +sub largestContiguousBlock(@matrix) { + my $rows = @matrix.elems; + my $cols = @matrix[0].elems; + my @visited = (0 ..^ $rows).map({ [False xx $cols] }); + my $maxSize = 0; + + for 0 ..^ $rows -> $i { + for 0 ..^ $cols -> $j { + if !@visited[$i][$j] { + my $currentSize = search(@matrix, $rows, $cols, @visited, $i, $j, @matrix[$i][$j]); + + if $currentSize > $maxSize { + $maxSize = $currentSize; + } + } + } + } + + return $maxSize; +} + +sub MAIN( + Str $filename #= path to file containing matrix +) { + say largestContiguousBlock(load($filename)); +}
\ No newline at end of file |
