Jump to content

Price fraction: Difference between revisions

→‎{{header|Mercury}}: add implementation
(→‎{{header|Mercury}}: add implementation)
Line 966:
0.7 0.62 0.9 0.18 0.78
</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}}==
Anonymous user
Cookies help us deliver our services. By using our services, you agree to our use of cookies.