diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2021-12-20 00:47:38 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-12-20 00:47:38 +0000 |
| commit | a5b49ac49453d5e6d5c6df854323b7e15037d28f (patch) | |
| tree | 48dce57ba207a1a702711bcc1b5597f8d3a062fb /challenge-143 | |
| parent | 9694329ad08850af2928e18258c2362d453f99ad (diff) | |
| parent | bde8152ce19dca3e7e5054c8ad4f82e799199f06 (diff) | |
| download | perlweeklychallenge-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.txt | 1 | ||||
| -rw-r--r-- | challenge-143/adam-russell/blog1.txt | 1 | ||||
| -rw-r--r-- | challenge-143/adam-russell/perl/TWCCalculator.yp | 53 | ||||
| -rw-r--r-- | challenge-143/adam-russell/perl/ch-1.pl | 22 | ||||
| -rw-r--r-- | challenge-143/adam-russell/perl/ch-2.pl | 37 | ||||
| -rw-r--r-- | challenge-143/adam-russell/prolog/ch-1.p | 22 | ||||
| -rw-r--r-- | challenge-143/adam-russell/prolog/ch-2.p | 17 |
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. |
