aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2021-12-27 07:50:13 +0000
committerGitHub <noreply@github.com>2021-12-27 07:50:13 +0000
commitc4acdc630726947f45d1a41c06a7370c1c87d27a (patch)
tree228d87f5f29d781937822e9122e84dd015a003c4
parent621e4c556323d832c3fe97ca693a19b7e7f2d9c3 (diff)
parent57e55bff0b5f37571b486f37542fc798d04ad6d0 (diff)
downloadperlweeklychallenge-club-c4acdc630726947f45d1a41c06a7370c1c87d27a.tar.gz
perlweeklychallenge-club-c4acdc630726947f45d1a41c06a7370c1c87d27a.tar.bz2
perlweeklychallenge-club-c4acdc630726947f45d1a41c06a7370c1c87d27a.zip
Merge pull request #5422 from jaldhar/challenge-143
Challenge 143 by Jaldhar H. Vyas.
-rw-r--r--challenge-143/jaldhar-h-vyas/blog.txt1
-rwxr-xr-xchallenge-143/jaldhar-h-vyas/perl/ch-1.pl39
-rwxr-xr-xchallenge-143/jaldhar-h-vyas/perl/ch-2.pl41
-rwxr-xr-xchallenge-143/jaldhar-h-vyas/raku/ch-1.raku62
-rwxr-xr-xchallenge-143/jaldhar-h-vyas/raku/ch-2.raku10
5 files changed, 153 insertions, 0 deletions
diff --git a/challenge-143/jaldhar-h-vyas/blog.txt b/challenge-143/jaldhar-h-vyas/blog.txt
new file mode 100644
index 0000000000..3c6f3cadea
--- /dev/null
+++ b/challenge-143/jaldhar-h-vyas/blog.txt
@@ -0,0 +1 @@
+https://www.braincells.com/perl/2021/12/perl_weekly_challenge_week_143.html
diff --git a/challenge-143/jaldhar-h-vyas/perl/ch-1.pl b/challenge-143/jaldhar-h-vyas/perl/ch-1.pl
new file mode 100755
index 0000000000..7d5375d17b
--- /dev/null
+++ b/challenge-143/jaldhar-h-vyas/perl/ch-1.pl
@@ -0,0 +1,39 @@
+#!/usr/bin/perl
+use 5.020;
+use warnings;
+use Parse::RecDescent;
+
+# $RD_HINT = 1;
+
+my $calculator = <<'-EOT-';
+ expression: term(s /([+-])/) {
+ $return = $item[1]->[0];
+
+ for (my $i = 1; $i < scalar @{$item[1]}; $i+=2) {
+ if ($item[1]->[$i] eq q{+}) {
+ $return += $item[1]->[$i + 1];
+ } elsif ($item[1]->[$i] eq q{-}) {
+ $return -= $item[1]->[$i + 1];
+ }
+ }
+ }
+
+ group: '(' expression ')' { $item[2]; }
+
+ term: factor(s /\*/) {
+ $return = 1;
+
+ for my $factor (@{$item[1]}) {
+ $return *= $factor;
+ }
+ }
+
+ factor: number
+ | group
+
+ number: /\-?\d+(\.\d+)?/
+-EOT-
+
+my ($expression) = shift @ARGV // die "Need an expression.\n";
+my $parser = new Parse::RecDescent ($calculator);
+say $parser->expression($expression) // die "Parse error.\n";
diff --git a/challenge-143/jaldhar-h-vyas/perl/ch-2.pl b/challenge-143/jaldhar-h-vyas/perl/ch-2.pl
new file mode 100755
index 0000000000..79682f4c99
--- /dev/null
+++ b/challenge-143/jaldhar-h-vyas/perl/ch-2.pl
@@ -0,0 +1,41 @@
+#!/usr/bin/perl
+use 5.020;
+use warnings;
+
+sub combinations {
+ my @list = @{$_[0]};
+ my $length = $_[1];
+
+ if ($length <= 1) {
+ return map [$_], @list;
+ }
+
+ my @combos;
+
+ for (my $i = 0; $i + $length <= scalar @list; $i++) {
+ my $val = $list[$i];
+ my @rest = @list[$i + 1 .. $#list];
+ for my $c (combinations(\@rest, $length - 1)) {
+ push @combos, [$val, @{$c}] ;
+ }
+ }
+
+ return @combos;
+}
+
+sub isStealthy {
+ my ($n) = @_;
+ my @factorSums = map { $_ + $n / $_; } grep { $n % $_ == 0 } (2 .. $n / 2);
+
+ for my $combo (combinations (\@factorSums, 2)) {
+ if (abs($combo->[0] - $combo->[1]) == 1) {
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+my $n = shift // die "Need an integer.\n";
+
+say isStealthy($n); \ No newline at end of file
diff --git a/challenge-143/jaldhar-h-vyas/raku/ch-1.raku b/challenge-143/jaldhar-h-vyas/raku/ch-1.raku
new file mode 100755
index 0000000000..cf1a55a1ec
--- /dev/null
+++ b/challenge-143/jaldhar-h-vyas/raku/ch-1.raku
@@ -0,0 +1,62 @@
+#!/usr/bin/raku
+# use Grammar::Tracer;
+
+grammar Calculator {
+ rule TOP { <expression> }
+
+ rule expression {
+ <term>+ % $<op>=(['+'|'-'])
+ }
+
+ rule group { '(' <expression> ')' }
+
+ rule term { <factor>+ % '*' }
+
+ rule factor { <number> | <group> }
+
+ token number { '-'?\d+ ('.' \d+)? }
+}
+
+class CalculatorActions {
+ method TOP($/) {
+ make($<expression>.made);
+ }
+
+ method expression($/) {
+ my $result = $<term>.shift.made;
+
+ if ($<op>) {
+ my @ops = $<op>.map({ $_.Str; });
+ my @values = $<term>.map({ $_.made; });
+
+ for @ops -> $op {
+ given $op {
+ when '+' { $result += @values.shift; }
+ when '-' { $result -= @values.shift; }
+ }
+ }
+ }
+
+ make($result);
+ }
+
+ method group($/) {
+ make($<expression>.made);
+ }
+
+ method term($/) {
+ make([*] $<factor>.map({ $_.made; }));
+ }
+
+ method number($/) {
+ make $/.Num;
+ }
+
+ method factor($/) {
+ make($<number> ?? $<number>.made !! $<group>.made);
+ }
+}
+
+sub MAIN(Str $expression) {
+ say Calculator.parse($expression, actions => CalculatorActions.new ).made;
+} \ No newline at end of file
diff --git a/challenge-143/jaldhar-h-vyas/raku/ch-2.raku b/challenge-143/jaldhar-h-vyas/raku/ch-2.raku
new file mode 100755
index 0000000000..c159e1d881
--- /dev/null
+++ b/challenge-143/jaldhar-h-vyas/raku/ch-2.raku
@@ -0,0 +1,10 @@
+#!/usr/bin/raku
+
+sub MAIN(Int $n) {
+ say (2 .. $n div 2)
+ .grep({ $n %% $_ })
+ .map({ [+] ($_, $n div $_) })
+ .combinations(2)
+ .grep({ ([-] $_).abs == 1 })
+ !~~ () ?? 1 !! 0;
+} \ No newline at end of file