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}}==