Price fraction: Difference between revisions
Content added Content deleted
(→{{header|Mercury}}: add implementation) |
|||
Line 966: | Line 966: | ||
0.7 0.62 0.9 0.18 0.78 |
0.7 0.62 0.9 0.18 0.78 |
||
</lang> |
</lang> |
||
=={{header|Mercury}}== |
|||
<lang Mercury>:- module price. |
|||
:- interface. |
|||
:- import_module int. |
|||
:- type price == int. |
|||
:- func standard(price) = price. |
|||
:- implementation. |
|||
:- import_module require, list. |
|||
standard(P) = SP :- |
|||
require(P >= 0, "P must be positive"), |
|||
Cents = P `mod` 100, |
|||
P + adjust(Cents) = SP. |
|||
:- func adjust(int) = int. |
|||
adjust(Cents) = adjust(Cents, rules). |
|||
:- func adjust(int, list(price_rule)) = int. |
|||
adjust(_, []) = unexpected("price", "adjust/2", "exhausted rules"). |
|||
adjust(N, [rule(Low, High, To)|T]) = R :- |
|||
( N >= Low, N < High -> To - N = R ; adjust(N, T) = R ). |
|||
:- type price_rule ---> rule(int, int, int). |
|||
:- func rules = list(price_rule). |
|||
rules = [rule(00, 06, 10), |
|||
rule(06, 11, 18), |
|||
rule(11, 16, 26), |
|||
rule(16, 21, 32), |
|||
rule(21, 26, 38), |
|||
rule(26, 31, 44), |
|||
rule(31, 36, 50), |
|||
rule(36, 41, 54), |
|||
rule(41, 46, 58), |
|||
rule(46, 51, 62), |
|||
rule(51, 56, 66), |
|||
rule(56, 61, 70), |
|||
rule(61, 66, 74), |
|||
rule(66, 71, 78), |
|||
rule(71, 76, 82), |
|||
rule(76, 81, 86), |
|||
rule(81, 86, 90), |
|||
rule(86, 91, 94), |
|||
rule(91, 96, 98), |
|||
rule(96, 101, 100)].</lang> |
|||
A build system might turn the text of the table into the definition of a hundred-element array of adjustments. In that case, |
|||
<lang Mercury>adjust(Cents) = array.lookup(price_table, Cents).</lang> |
|||
=={{header|MUMPS}}== |
=={{header|MUMPS}}== |