diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2021-12-27 07:50:13 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-12-27 07:50:13 +0000 |
| commit | c4acdc630726947f45d1a41c06a7370c1c87d27a (patch) | |
| tree | 228d87f5f29d781937822e9122e84dd015a003c4 | |
| parent | 621e4c556323d832c3fe97ca693a19b7e7f2d9c3 (diff) | |
| parent | 57e55bff0b5f37571b486f37542fc798d04ad6d0 (diff) | |
| download | perlweeklychallenge-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.txt | 1 | ||||
| -rwxr-xr-x | challenge-143/jaldhar-h-vyas/perl/ch-1.pl | 39 | ||||
| -rwxr-xr-x | challenge-143/jaldhar-h-vyas/perl/ch-2.pl | 41 | ||||
| -rwxr-xr-x | challenge-143/jaldhar-h-vyas/raku/ch-1.raku | 62 | ||||
| -rwxr-xr-x | challenge-143/jaldhar-h-vyas/raku/ch-2.raku | 10 |
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 |
