/* Price fraction (Rosetta code) in Picat. http://rosettacode.org/wiki/Price_fraction """ A friend of mine runs a pharmacy. He has a specialised function in his Dispensary application which receives a decimal value of currency and replaces it to a standard value. This value is regulated by a government department. Task: Given a floating point value between 0.00 and 1.00, rescale according to the following table: >= 0.00 < 0.06 := 0.10 >= 0.06 < 0.11 := 0.18 >= 0.11 < 0.16 := 0.26 >= 0.16 < 0.21 := 0.32 >= 0.21 < 0.26 := 0.38 >= 0.26 < 0.31 := 0.44 >= 0.31 < 0.36 := 0.50 >= 0.36 < 0.41 := 0.54 >= 0.41 < 0.46 := 0.58 >= 0.46 < 0.51 := 0.62 >= 0.51 < 0.56 := 0.66 >= 0.56 < 0.61 := 0.70 >= 0.61 < 0.66 := 0.74 >= 0.66 < 0.71 := 0.78 >= 0.71 < 0.76 := 0.82 >= 0.76 < 0.81 := 0.86 >= 0.81 < 0.86 := 0.90 >= 0.86 < 0.91 := 0.94 >= 0.91 < 0.96 := 0.98 >= 0.96 < 1.01 := 1.00 """ This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ % import util. % import cp. main => go. go => _ = random2(), D = [ [0.00,0.06,0.10], [0.06,0.11,0.18], [0.11,0.16,0.26], [0.16,0.21,0.32], [0.21,0.26,0.38], [0.26,0.31,0.44], [0.31,0.36,0.50], [0.36,0.41,0.54], [0.41,0.46,0.58], [0.46,0.51,0.62], [0.51,0.56,0.66], [0.56,0.61,0.70], [0.61,0.66,0.74], [0.66,0.71,0.78], [0.71,0.76,0.82], [0.76,0.81,0.86], [0.81,0.86,0.90], [0.86,0.91,0.94], [0.91,0.96,0.98], [0.96,1.01,1.00]], Len = D.length, foreach(_ in 1..10) R = frand2(100), between(1,Len,Ix), R >= D[Ix,1], R < D[Ix,2], New = D[Ix,3], println(R=New) end, nl. % Using a "fact table" of the rules go2 => _ = random2(), foreach(_ in 1..10) R = frand2(100), r(From,To,Val), R >= From, R <= To, println(R=Val) end, nl. r(0.00,0.06,0.10). r(0.06,0.11,0.18). r(0.11,0.16,0.26). r(0.16,0.21,0.32). r(0.21,0.26,0.38). r(0.26,0.31,0.44). r(0.31,0.36,0.50). r(0.36,0.41,0.54). r(0.41,0.46,0.58). r(0.46,0.51,0.62). r(0.51,0.56,0.66). r(0.56,0.61,0.70). r(0.61,0.66,0.74). r(0.66,0.71,0.78). r(0.71,0.76,0.82). r(0.76,0.81,0.86). r(0.81,0.86,0.90). r(0.86,0.91,0.94). r(0.91,0.96,0.98). r(0.96,1.01,1.00). % Getting numbers numbers of precision 2 frand2(N) = (random() mod N)/N.