aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad Sajid Anwar <Mohammad.Anwar@yahoo.com>2025-06-06 23:24:18 +0100
committerGitHub <noreply@github.com>2025-06-06 23:24:18 +0100
commit81a3fa34d9c7495afeef58debdfb496d2cc5b4c3 (patch)
treef0a065a0982347ccd493285f9e15eeb24d1dd578
parentcd87a854dd039199fdc61c1a021a7a2b3e6b180e (diff)
parent943d453f171775aed6b2bd3cd85228e932595c52 (diff)
downloadperlweeklychallenge-club-81a3fa34d9c7495afeef58debdfb496d2cc5b4c3.tar.gz
perlweeklychallenge-club-81a3fa34d9c7495afeef58debdfb496d2cc5b4c3.tar.bz2
perlweeklychallenge-club-81a3fa34d9c7495afeef58debdfb496d2cc5b4c3.zip
Merge pull request #12130 from adamcrussell/challenge-323
Challenge 323
-rw-r--r--challenge-323/adam-russell/blog.txt1
-rw-r--r--challenge-323/adam-russell/blog1.txt1
-rw-r--r--challenge-323/adam-russell/perl/IncrementDecrement.yp85
-rw-r--r--challenge-323/adam-russell/perl/ch-1.pl43
-rw-r--r--challenge-323/adam-russell/perl/ch-2.pl36
-rw-r--r--challenge-323/adam-russell/prolog/ch-1.p73
-rw-r--r--challenge-323/adam-russell/prolog/ch-2.p15
7 files changed, 254 insertions, 0 deletions
diff --git a/challenge-323/adam-russell/blog.txt b/challenge-323/adam-russell/blog.txt
new file mode 100644
index 0000000000..f3b5f56af8
--- /dev/null
+++ b/challenge-323/adam-russell/blog.txt
@@ -0,0 +1 @@
+http://www.rabbitfarm.com/cgi-bin/blosxom/perl/2025/06/05
diff --git a/challenge-323/adam-russell/blog1.txt b/challenge-323/adam-russell/blog1.txt
new file mode 100644
index 0000000000..9b3302d2c2
--- /dev/null
+++ b/challenge-323/adam-russell/blog1.txt
@@ -0,0 +1 @@
+http://www.rabbitfarm.com/cgi-bin/blosxom/prolog/2025/06/06
diff --git a/challenge-323/adam-russell/perl/IncrementDecrement.yp b/challenge-323/adam-russell/perl/IncrementDecrement.yp
new file mode 100644
index 0000000000..bd2e48d352
--- /dev/null
+++ b/challenge-323/adam-russell/perl/IncrementDecrement.yp
@@ -0,0 +1,85 @@
+
+
+
+ %token INCREMENT
+ %token DECREMENT
+ %token LETTER
+ %expect 2
+
+
+ %{
+ my $variable_state = {};
+ %}
+
+
+
+ %%
+
+
+ program: statement {$variable_state}
+ | program statement
+ ;
+
+ statement: variable_declaration
+ | increment_variable
+ | decrement_variable
+ ;
+
+ variable_declaration: LETTER {$variable_state->{$_[1]} = 0}
+ ;
+
+ increment_variable: INCREMENT LETTER {$variable_state->{$_[2]}++}
+ | LETTER INCREMENT {$variable_state->{$_[1]}++}
+ ;
+
+ decrement_variable: DECREMENT LETTER {$variable_state->{$_[2]}--}
+ | LETTER DECREMENT {$variable_state->{$_[1]}--}
+ ;
+
+
+
+ %%
+
+
+
+ sub lexer{
+ my($parser) = @_;
+ $parser->YYData->{INPUT} or return(q//, undef);
+ $parser->YYData->{INPUT} =~ s/^[ \t]//g;
+ ##
+ # send tokens to parser
+ ##
+ for($parser->YYData->{INPUT}){
+ s/^(\s+)// and return (q/SPACE/, $1);
+ s/^([a-z]{1})// and return (q/LETTER/, $1);
+ s/^(\+\+)// and return (q/INCREMENT/, $1);
+ s/^(--)// and return (q/DECREMENT/, $1);
+ }
+ }
+
+
+ sub parse{
+ my($self, $input) = @_;
+ $input =~ tr/\t/ /s;
+ $input =~ tr/\n/ /s;
+ $self->YYData->{INPUT} = $input;
+ my $result = $self->YYParse(yylex => \&lexer, yyerror => \&error);
+ return $result;
+ }
+
+
+ sub error{
+ exists $_[0]->YYData->{ERRMSG}
+ and do{
+ print $_[0]->YYData->{ERRMSG};
+ return;
+ };
+ print "syntax error\n";
+ }
+
+
+ sub clear{
+ $variable_state = {};
+ }
+
+
diff --git a/challenge-323/adam-russell/perl/ch-1.pl b/challenge-323/adam-russell/perl/ch-1.pl
new file mode 100644
index 0000000000..28698eecb8
--- /dev/null
+++ b/challenge-323/adam-russell/perl/ch-1.pl
@@ -0,0 +1,43 @@
+
+
+ use v5.40;
+ use IncrementDecrement;
+
+use constant TEST0 => q/--x x++ x++/;
+use constant TEST1 => q/x++ ++x x++/;
+use constant TEST2 => q/x++ ++x --x x--/;
+use constant COMPLEX_TEST => <<~END_TEST;
+ a b c
+ a++ b++ c++
+ ++a ++b ++c
+ --a --b --c
+ a-- b-- c--
+ a++ ++b c++
+ END_TEST
+
+
+
+ sub print_variables{
+ my($results) = @_;
+ for my $k (keys %{$results}){
+ print $k;
+ say qq/:\t$results->{$k}/;
+ }
+ }
+
+
+MAIN:{
+ my $parser = IncrementDecrement->new();
+ say TEST0;
+ say print_variables $parser->parse(TEST0);
+ say TEST1;
+ $parser->clear();
+ say print_variables $parser->parse(TEST1);
+ say TEST2;
+ $parser->clear();
+ say print_variables $parser->parse(TEST2);
+ say COMPLEX_TEST;
+ $parser->clear();
+ say print_variables $parser->parse(COMPLEX_TEST);
+}
+
diff --git a/challenge-323/adam-russell/perl/ch-2.pl b/challenge-323/adam-russell/perl/ch-2.pl
new file mode 100644
index 0000000000..6ecc78586f
--- /dev/null
+++ b/challenge-323/adam-russell/perl/ch-2.pl
@@ -0,0 +1,36 @@
+
+ use v5.40;
+
+ sub calculate_tax{
+ my($income, $tax_brackets) = @_;
+
+ $tax_brackets = [sort {$a->[0] <=> $b->[0]} @{$tax_brackets}];
+
+ my $tax = 0;
+ my $taxed = 0;
+ my $taxable = 0;
+
+ {
+ my $tax_bracket = shift @{$tax_brackets};
+ if($tax_bracket->[0] <= $income){
+ $taxable = $tax_bracket->[0] - $taxable;
+ $tax += ($taxable * ($tax_bracket->[1]/100));
+ $taxed += $taxable;
+ }
+ else{
+ $tax += (($income - $taxed) * ($tax_bracket->[1]/100));
+ $taxed = $income;
+ }
+ redo unless $taxed >= $income || @{$tax_brackets} == 0;
+ }
+
+ return $tax;
+ }
+
+
+MAIN:{
+ say calculate_tax 10, [[3, 50], [7, 10], [12,25]];
+ say calculate_tax 2, [[1, 0], [4, 25], [5,50]];
+ say calculate_tax 0, [[2, 50]];
+}
+
diff --git a/challenge-323/adam-russell/prolog/ch-1.p b/challenge-323/adam-russell/prolog/ch-1.p
new file mode 100644
index 0000000000..0ae1ce8088
--- /dev/null
+++ b/challenge-323/adam-russell/prolog/ch-1.p
@@ -0,0 +1,73 @@
+
+
+ increment_variable(X, U, V):-
+ member(X-I, U),
+ delete(U, X-I, U1),
+ I1 is I + 1,
+ append([X-I1], U1, V).
+ increment_variable(X, U, V):-
+ \+ member(X-_, U),
+ append([X-1], U, V).
+ decrement_variable(X, U, V):-
+ member(X-I, U),
+ delete(U, X-I, U1),
+ I1 is I - 1,
+ append([X-I1], U1, V).
+ decrement_variable(X, U, V):-
+ \+ member(X-_, U),
+ append([X-(-1)], U, V).
+ declare_variable(X, U, V):-
+ delete(U, X-_, U1),
+ append([X-0], U1, V).
+
+
+ variables(VariableState), [VariableState] --> [VariableState].
+ variables(V, VariableState), [VariableState] --> [V].
+
+
+ process(Input) --> variables(V, VariableState),
+ {Input = [Code1, Code2, Code3 | Codes],
+ Code1 == 43, Code2 == 43, Code3 >= 97,
+ Code3 =< 122,
+ increment_variable(Code3, V, VariableState)},
+ process(Codes).
+ process(Input) --> variables(V, VariableState),
+ {Input = [Code1, Code2, Code3 | Codes],
+ Code2 == 43, Code3 == 43, Code1 >= 97,
+ Code1 =< 122,
+ increment_variable(Code1, V, VariableState)},
+ process(Codes).
+ process(Input) --> variables(V, VariableState),
+ {Input = [Code1, Code2, Code3 | Codes],
+ Code1 == 45, Code2 == 45, Code3 >= 97,
+ Code3 =< 122,
+ decrement_variable(Code3, V, VariableState)},
+ process(Codes).
+ process(Input) --> variables(V, VariableState),
+ {Input = [Code1, Code2, Code3 | Codes],
+ Code2 == 45, Code3 == 45, Code1 >= 97,
+ Code1 =< 122,
+ decrement_variable(Code1, V, VariableState)},
+ process(Codes).
+ process(Input) --> variables(V, VariableState),
+ {Input = [Code | Codes],
+ Code >= 97, Code =< 122,
+ declare_variable(Code, V, VariableState)},
+ process(Codes).
+ process(Input) --> {Input = [Code | Codes],
+ Code == 32},
+ process(Codes).
+ process([]) --> [].
+
+
+ show_variables(X-I):-
+ atom_codes(A, [X]),
+ write(A),
+ write(': '),
+ write(I), nl.
+
+
+ increment_decrement(Input):-
+ phrase(process(Input), [[]], [Output]), !,
+ maplist(show_variables, Output).
+
diff --git a/challenge-323/adam-russell/prolog/ch-2.p b/challenge-323/adam-russell/prolog/ch-2.p
new file mode 100644
index 0000000000..9af958e248
--- /dev/null
+++ b/challenge-323/adam-russell/prolog/ch-2.p
@@ -0,0 +1,15 @@
+
+
+ compute_taxes(Income, TaxBrackets, Tax):-
+ compute_taxes(Income, TaxBrackets, 0, 0, Tax).
+ compute_taxes(0, _, 0, 0, 0).
+ compute_taxes(Income, [[Limit, Rate]|TaxBrackets], Taxable, Taxed, Tax):-
+ Limit =< Income,
+ Taxable1 is Limit - Taxable,
+ Taxed1 is Taxed + Taxable1,
+ compute_taxes(Income, TaxBrackets, Taxable1, Taxed1, Tax1),
+ Tax is Tax1 + (Taxable1 * (Rate/100)).
+ compute_taxes(Income, [[Limit, Rate]|_], _, Taxed, Tax):-
+ Limit > Income,
+ Tax is ((Income - Taxed) * (Rate/100)).
+