aboutsummaryrefslogtreecommitdiff
path: root/challenge-143
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2021-12-20 00:47:38 +0000
committerGitHub <noreply@github.com>2021-12-20 00:47:38 +0000
commita5b49ac49453d5e6d5c6df854323b7e15037d28f (patch)
tree48dce57ba207a1a702711bcc1b5597f8d3a062fb /challenge-143
parent9694329ad08850af2928e18258c2362d453f99ad (diff)
parentbde8152ce19dca3e7e5054c8ad4f82e799199f06 (diff)
downloadperlweeklychallenge-club-a5b49ac49453d5e6d5c6df854323b7e15037d28f.tar.gz
perlweeklychallenge-club-a5b49ac49453d5e6d5c6df854323b7e15037d28f.tar.bz2
perlweeklychallenge-club-a5b49ac49453d5e6d5c6df854323b7e15037d28f.zip
Merge pull request #5389 from adamcrussell/challenge-143
Challenge 143
Diffstat (limited to 'challenge-143')
-rw-r--r--challenge-143/adam-russell/blog.txt1
-rw-r--r--challenge-143/adam-russell/blog1.txt1
-rw-r--r--challenge-143/adam-russell/perl/TWCCalculator.yp53
-rw-r--r--challenge-143/adam-russell/perl/ch-1.pl22
-rw-r--r--challenge-143/adam-russell/perl/ch-2.pl37
-rw-r--r--challenge-143/adam-russell/prolog/ch-1.p22
-rw-r--r--challenge-143/adam-russell/prolog/ch-2.p17
7 files changed, 153 insertions, 0 deletions
diff --git a/challenge-143/adam-russell/blog.txt b/challenge-143/adam-russell/blog.txt
new file mode 100644
index 0000000000..88cdd5c13e
--- /dev/null
+++ b/challenge-143/adam-russell/blog.txt
@@ -0,0 +1 @@
+http://www.rabbitfarm.com/cgi-bin/blosxom/2021/12/19/perl
diff --git a/challenge-143/adam-russell/blog1.txt b/challenge-143/adam-russell/blog1.txt
new file mode 100644
index 0000000000..263703952d
--- /dev/null
+++ b/challenge-143/adam-russell/blog1.txt
@@ -0,0 +1 @@
+http://www.rabbitfarm.com/cgi-bin/blosxom/2021/12/19/prolog
diff --git a/challenge-143/adam-russell/perl/TWCCalculator.yp b/challenge-143/adam-russell/perl/TWCCalculator.yp
new file mode 100644
index 0000000000..86b1cb1ee4
--- /dev/null
+++ b/challenge-143/adam-russell/perl/TWCCalculator.yp
@@ -0,0 +1,53 @@
+%token NUMBER
+%left '+' '-' '*' '/'
+
+%%
+
+line:
+ | expression {print $_[1] . "\n"}
+;
+
+expression: NUMBER
+ | expression '+' expression {$_[1] + $_[3]}
+ | expression '-' expression {$_[1] - $_[3]}
+ | expression '*' expression {$_[1] * $_[3]}
+ | expression '/' expression {$_[1] / $_[3]}
+ | '(' expression ')' {$_[2]}
+;
+
+%%
+
+sub lexer{
+ my($parser) = @_;
+ $parser->YYData->{INPUT} or return('', undef);
+ $parser->YYData->{INPUT} =~ s/^[ \t]//;
+ ##
+ # send tokens to parser
+ ##
+ for($parser->YYData->{INPUT}){
+ s/^([0-9]+)// and return ("NUMBER", $1);
+ s/^(\+)// and return ("+", $1);
+ s/^(-)// and return ("-", $1);
+ s/^(\*)// and return ("*", $1);
+ s/^(\/)// and return ("/", $1);
+ s/^(\()// and return ("(", $1);
+ s/^(\))// and return (")", $1);
+ s/^(\n)// and return ("\n", $1);
+ }
+}
+
+sub error{
+ exists $_[0]->YYData->{ERRMSG}
+ and do{
+ print $_[0]->YYData->{ERRMSG};
+ return;
+ };
+ print "syntax error\n";
+}
+
+sub parse{
+ my($self, $input) = @_;
+ $self->YYData->{INPUT} = $input;
+ my $result = $self->YYParse(yylex => \&lexer, yyerror => \&error);
+ return $result;
+}
diff --git a/challenge-143/adam-russell/perl/ch-1.pl b/challenge-143/adam-russell/perl/ch-1.pl
new file mode 100644
index 0000000000..ea2125c27c
--- /dev/null
+++ b/challenge-143/adam-russell/perl/ch-1.pl
@@ -0,0 +1,22 @@
+use strict;
+use warnings;
+##
+# Write a script to implement a four function infix calculator.
+##
+use TWCCalculator;
+use constant ADD => "10 + 8";
+use constant SUBTRACT => "18 - 66";
+use constant ADD_SUBTRACT => "10 + 20 - 5";
+use constant MULTIPLY => "10 * 8";
+use constant DIVIDE => "52 / 2";
+use constant CALCULATE => "(10 + 20 - 5) * 2";
+
+MAIN:{
+ my $parser = new TWCCalculator();
+ $parser->parse(ADD);
+ $parser->parse(SUBTRACT);
+ $parser->parse(ADD_SUBTRACT);
+ $parser->parse(MULTIPLY);
+ $parser->parse(DIVIDE);
+ $parser->parse(CALCULATE);
+}
diff --git a/challenge-143/adam-russell/perl/ch-2.pl b/challenge-143/adam-russell/perl/ch-2.pl
new file mode 100644
index 0000000000..d4bdef7828
--- /dev/null
+++ b/challenge-143/adam-russell/perl/ch-2.pl
@@ -0,0 +1,37 @@
+use strict;
+use warnings;
+##
+# You are given a positive number, $n. Write a script to
+# find out if the given number is Stealthy Number.
+##
+use boolean;
+
+sub factor{
+ my($n) = @_;
+ my @factors = ();
+ for my $j (2 .. sqrt($n)){
+ push @factors, [$j, $n / $j] if $n % $j == 0;
+ }
+ return @factors;
+}
+
+sub stealthy{
+ my($n) = @_;
+ my @factors = factor($n);
+ for(my $i = 0; $i < @factors; $i++){
+ for(my $j = 0; $j < @factors; $j++){
+ unless($i == $j){
+ my($s, $t) = @{$factors[$i]};
+ my($u, $v) = @{$factors[$j]};
+ return true if $s + $t == $u + $v + 1;
+ }
+ }
+ }
+ return false;
+}
+
+MAIN:{
+ print stealthy(12) . "\n";
+ print stealthy(36) . "\n";
+ print stealthy(6) . "\n";
+}
diff --git a/challenge-143/adam-russell/prolog/ch-1.p b/challenge-143/adam-russell/prolog/ch-1.p
new file mode 100644
index 0000000000..f4588ccde4
--- /dev/null
+++ b/challenge-143/adam-russell/prolog/ch-1.p
@@ -0,0 +1,22 @@
+:-initialization(main).
+
+expression(Answer) --> term(Answer).
+expression(Answer) --> term(Answer0), [(+)], expression(Answer1), {Answer is Answer0 + Answer1}.
+expression(Answer) --> term(Answer0), [(-)], expression(Answer1), {Answer is Answer0 - Answer1}.
+
+term(Answer) --> operand(Answer).
+term(Answer) --> operand(Answer0), [(*)], term(Answer1), {Answer is Answer0 * Answer1}.
+term(Answer) --> operand(Answer0), [(/)], term(Answer1), {Answer is Answer0 / Answer1}.
+
+operand(X) --> [X], {number(X)}.
+operand(Answer) --> ['('], expression(Answer), [')'].
+
+calculator(Expression, Answer):-
+ phrase(expression(Answer), Expression).
+
+main:-
+ calculator([10, (+), 20, (-), 5], AnswerA),
+ write(AnswerA), nl,
+ calculator(['(', 10, (+), 20, (-), 5, ')', (*), 2], AnswerB),
+ write(AnswerB), nl,
+ halt.
diff --git a/challenge-143/adam-russell/prolog/ch-2.p b/challenge-143/adam-russell/prolog/ch-2.p
new file mode 100644
index 0000000000..af301e157a
--- /dev/null
+++ b/challenge-143/adam-russell/prolog/ch-2.p
@@ -0,0 +1,17 @@
+:-initialization(main).
+
+stealthy(N):-
+ fd_domain(S, 2, N),
+ fd_domain(T, 2, N),
+ fd_domain(U, 2, N),
+ fd_domain(V, 2, N),
+ S * T #= N,
+ U * V #= N,
+ S + T #= U + V + 1,
+ fd_labeling([S, T, U, V]).
+
+main:-
+ (stealthy(36), format("~d~n", [1]);format("~d~n", [0])),
+ (stealthy(12), format("~d~n", [1]);format("~d~n", [0])),
+ (stealthy(6), format("~d~n", [1]);format("~d~n", [0])),
+ halt.