diff options
| author | Mohammad Sajid Anwar <Mohammad.Anwar@yahoo.com> | 2025-06-06 23:24:18 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-06-06 23:24:18 +0100 |
| commit | 81a3fa34d9c7495afeef58debdfb496d2cc5b4c3 (patch) | |
| tree | f0a065a0982347ccd493285f9e15eeb24d1dd578 | |
| parent | cd87a854dd039199fdc61c1a021a7a2b3e6b180e (diff) | |
| parent | 943d453f171775aed6b2bd3cd85228e932595c52 (diff) | |
| download | perlweeklychallenge-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.txt | 1 | ||||
| -rw-r--r-- | challenge-323/adam-russell/blog1.txt | 1 | ||||
| -rw-r--r-- | challenge-323/adam-russell/perl/IncrementDecrement.yp | 85 | ||||
| -rw-r--r-- | challenge-323/adam-russell/perl/ch-1.pl | 43 | ||||
| -rw-r--r-- | challenge-323/adam-russell/perl/ch-2.pl | 36 | ||||
| -rw-r--r-- | challenge-323/adam-russell/prolog/ch-1.p | 73 | ||||
| -rw-r--r-- | challenge-323/adam-russell/prolog/ch-2.p | 15 |
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)). + |
