tasks a-s
This commit is contained in:
parent
47bf37c096
commit
b83f433714
12433 changed files with 156208 additions and 123 deletions
24
Task/Price-fraction/0DESCRIPTION
Normal file
24
Task/Price-fraction/0DESCRIPTION
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
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
|
||||
2
Task/Price-fraction/1META.yaml
Normal file
2
Task/Price-fraction/1META.yaml
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
---
|
||||
note: Financial operations
|
||||
30
Task/Price-fraction/ALGOL-68/price-fraction.alg
Normal file
30
Task/Price-fraction/ALGOL-68/price-fraction.alg
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
main:
|
||||
(
|
||||
# Just get a random price between 0 and 1 #
|
||||
# srand(time(NIL)); #
|
||||
REAL price := random;
|
||||
REAL tops := 0.06;
|
||||
REAL std val := 0.10;
|
||||
|
||||
# Conditionals are a little odd here "(price-0.001 < tops AND
|
||||
price+0.001 > tops)" is to check if they are equal. Stupid
|
||||
C floats, right? :) #
|
||||
WHILE ( price>tops OR (price-0.001 < tops AND price+0.001 > tops) ) AND tops<=1.01
|
||||
DO
|
||||
tops+:=0.05;
|
||||
|
||||
IF std val < 0.26 THEN
|
||||
std val +:= 0.08
|
||||
ELIF std val < 0.50 THEN
|
||||
std val +:= 0.06
|
||||
ELSE
|
||||
std val +:= 0.04
|
||||
FI;
|
||||
|
||||
IF std val > 0.98 THEN
|
||||
std val := 1.0
|
||||
FI
|
||||
OD;
|
||||
|
||||
printf(($"Value : "z.2dl,"Converted to standard : "z.2dl$, price, std val))
|
||||
)
|
||||
21
Task/Price-fraction/AWK/price-fraction.awk
Normal file
21
Task/Price-fraction/AWK/price-fraction.awk
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
BEGIN {
|
||||
O = ".06 .11 .16 .21 .26 .31 .36 .41 .46 .51 .56 .61 .66 .71 .76 .81 .86 .91 .96 1.01"
|
||||
N = ".10 .18 .26 .32 .38 .44 .50 .54 .58 .62 .66 .70 .74 .78 .82 .86 .90 .94 .98 1.00"
|
||||
fields = split(O,Oarr," ") # original values
|
||||
split(N,Narr," ") # replacement values
|
||||
for (i=-.01; i<=1.02; i+=.01) { # test
|
||||
printf("%5.2f = %4.2f\n",i,lookup(i))
|
||||
}
|
||||
}
|
||||
function lookup(n, i) {
|
||||
if (n < 0 || n > 1.01) {
|
||||
return(0) # when input is out of range
|
||||
}
|
||||
for (i=1; i<=fields; i++) {
|
||||
# +10 is used because .11 returned .18 instead of .26
|
||||
# under AWK95, GAWK, and MAWK; Thompson Automation's TAWK worked correctly
|
||||
if (n+10 < Oarr[i]+10) {
|
||||
return(Narr[i])
|
||||
}
|
||||
}
|
||||
}
|
||||
31
Task/Price-fraction/Ada/price-fraction-1.ada
Normal file
31
Task/Price-fraction/Ada/price-fraction-1.ada
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
type Price is delta 0.01 digits 3 range 0.0..1.0;
|
||||
function Scale (Value : Price) return Price is
|
||||
X : constant array (1..19) of Price :=
|
||||
( 0.06, 0.11, 0.16, 0.21, 0.26, 0.31, 0.36, 0.41, 0.46, 0.51,
|
||||
0.56, 0.61, 0.66, 0.71, 0.76, 0.81, 0.86, 0.91, 0.96
|
||||
);
|
||||
Y : constant array (1..20) of Price :=
|
||||
( 0.10, 0.18, 0.26, 0.32, 0.38, 0.44, 0.50, 0.54, 0.58, 0.62,
|
||||
0.66, 0.70, 0.74, 0.78, 0.82, 0.86, 0.90, 0.94, 0.98, 1.0
|
||||
);
|
||||
Low : Natural := X'First;
|
||||
High : Natural := X'Last;
|
||||
Middle : Natural;
|
||||
begin
|
||||
loop
|
||||
Middle := (Low + High) / 2;
|
||||
if Value = X (Middle) then
|
||||
return Y (Middle + 1);
|
||||
elsif Value < X (Middle) then
|
||||
if Low = Middle then
|
||||
return Y (Low);
|
||||
end if;
|
||||
High := Middle - 1;
|
||||
else
|
||||
if High = Middle then
|
||||
return Y (High + 1);
|
||||
end if;
|
||||
Low := Middle + 1;
|
||||
end if;
|
||||
end loop;
|
||||
end Scale;
|
||||
11
Task/Price-fraction/Ada/price-fraction-2.ada
Normal file
11
Task/Price-fraction/Ada/price-fraction-2.ada
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
with Ada.Text_IO; use Ada.Text_IO;
|
||||
procedure Test_Price_Fraction is
|
||||
-- Put the declarations here
|
||||
Value : Price := Price'First;
|
||||
begin
|
||||
loop
|
||||
Put_Line (Price'Image (Value) & "->" & Price'Image (Scale (Value)));
|
||||
exit when Value = Price'Last;
|
||||
Value := Price'Succ (Value);
|
||||
end loop;
|
||||
end Test_Price_Fraction;
|
||||
34
Task/Price-fraction/AutoHotkey/price-fraction.ahk
Normal file
34
Task/Price-fraction/AutoHotkey/price-fraction.ahk
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
; Submitted by MasterFocus --- http://tiny.cc/iTunis
|
||||
|
||||
Loop
|
||||
{
|
||||
InputBox, OutputVar, Price Fraction Example, Insert the value to be rounded.`n* [ 0 < value < 1 ]`n* Press ESC or Cancel to exit, , 200, 150
|
||||
If ErrorLevel
|
||||
Break
|
||||
MsgBox % "Input: " OutputVar "`nResult: " PriceFraction( OutputVar )
|
||||
}
|
||||
|
||||
;-----------------------------------------
|
||||
|
||||
PriceFraction( p_Input )
|
||||
{
|
||||
|
||||
If p_Input is not float ; returns 0 if input is not a float
|
||||
Return 0
|
||||
|
||||
If ( ( p_Input <= 0 ) OR ( p_Input >= 1 ) ) ; returns 0 is input is out of range
|
||||
Return 0
|
||||
|
||||
; declaring the table (arbitrary delimiters in use are '§' and '|')
|
||||
l_List := "0.06|0.10§0.11|0.18§0.16|0.26§0.21|0.32§0.26|0.38§0.31|0.44§0.36|0.50§0.41|0.54§0.46|0.58§0.51|0.62§0.56|0.66§0.61|0.70§0.66|0.74§0.71|0.78§0.76|0.82§0.81|0.86§0.86|0.90§0.91|0.94§0.96|0.98§1.01|1.00"
|
||||
|
||||
Loop, Parse, l_List, § ; retrieves each field (delimited by '§')
|
||||
{
|
||||
StringSplit, l_Array, A_LoopField, | ; splits current field (using delimiter '|')
|
||||
If ( p_Input <= l_Array1 )
|
||||
Return l_Array2 ; returns the second value if input <= first value
|
||||
}
|
||||
|
||||
Return 0 ; returns 0, indicating failure (shouldn't be reached though)
|
||||
|
||||
}
|
||||
56
Task/Price-fraction/BASIC/price-fraction.basic
Normal file
56
Task/Price-fraction/BASIC/price-fraction.basic
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
DECLARE FUNCTION PriceFraction! (price AS SINGLE)
|
||||
|
||||
RANDOMIZE TIMER
|
||||
DIM x AS SINGLE
|
||||
x = RND
|
||||
PRINT x, PriceFraction(x)
|
||||
|
||||
FUNCTION PriceFraction! (price AS SINGLE)
|
||||
'returns price unchanged if invalid value
|
||||
SELECT CASE price
|
||||
CASE IS < 0!
|
||||
PriceFraction! = price
|
||||
CASE IS < .06
|
||||
PriceFraction! = .1
|
||||
CASE IS < .11
|
||||
PriceFraction! = .18
|
||||
CASE IS < .16
|
||||
PriceFraction! = .26
|
||||
CASE IS < .21
|
||||
PriceFraction! = .32
|
||||
CASE IS < .26
|
||||
PriceFraction! = .38
|
||||
CASE IS < .31
|
||||
PriceFraction! = .44
|
||||
CASE IS < .36
|
||||
PriceFraction! = .5
|
||||
CASE IS < .41
|
||||
PriceFraction! = .54
|
||||
CASE IS < .46
|
||||
PriceFraction! = .58
|
||||
CASE IS < .51
|
||||
PriceFraction! = .62
|
||||
CASE IS < .56
|
||||
PriceFraction! = .66
|
||||
CASE IS < .61
|
||||
PriceFraction! = .7
|
||||
CASE IS < .66
|
||||
PriceFraction! = .74
|
||||
CASE IS < .71
|
||||
PriceFraction! = .78
|
||||
CASE IS < .76
|
||||
PriceFraction! = .82
|
||||
CASE IS < .81
|
||||
PriceFraction! = .86
|
||||
CASE IS < .86
|
||||
PriceFraction! = .9
|
||||
CASE IS < .91
|
||||
PriceFraction! = .94
|
||||
CASE IS < .96
|
||||
PriceFraction! = .98
|
||||
CASE IS < 1.01
|
||||
PriceFraction! = 1!
|
||||
CASE ELSE
|
||||
PriceFraction! = price
|
||||
END SELECT
|
||||
END FUNCTION
|
||||
24
Task/Price-fraction/BBC-BASIC/price-fraction.bbc
Normal file
24
Task/Price-fraction/BBC-BASIC/price-fraction.bbc
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
PRINT FNpricefraction(0.5)
|
||||
END
|
||||
|
||||
DEF FNpricefraction(p)
|
||||
IF p < 0.06 THEN = 0.10
|
||||
IF p < 0.11 THEN = 0.18
|
||||
IF p < 0.16 THEN = 0.26
|
||||
IF p < 0.21 THEN = 0.32
|
||||
IF p < 0.26 THEN = 0.38
|
||||
IF p < 0.31 THEN = 0.44
|
||||
IF p < 0.36 THEN = 0.50
|
||||
IF p < 0.41 THEN = 0.54
|
||||
IF p < 0.46 THEN = 0.58
|
||||
IF p < 0.51 THEN = 0.62
|
||||
IF p < 0.56 THEN = 0.66
|
||||
IF p < 0.61 THEN = 0.70
|
||||
IF p < 0.66 THEN = 0.74
|
||||
IF p < 0.71 THEN = 0.78
|
||||
IF p < 0.76 THEN = 0.82
|
||||
IF p < 0.81 THEN = 0.86
|
||||
IF p < 0.86 THEN = 0.90
|
||||
IF p < 0.91 THEN = 0.94
|
||||
IF p < 0.96 THEN = 0.98
|
||||
= 1.00
|
||||
37
Task/Price-fraction/Bracmat/price-fraction.bracmat
Normal file
37
Task/Price-fraction/Bracmat/price-fraction.bracmat
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
( ( convert
|
||||
=
|
||||
. ("0.06"."0.10")
|
||||
("0.11"."0.18")
|
||||
("0.16"."0.26")
|
||||
("0.21"."0.32")
|
||||
("0.26"."0.38")
|
||||
("0.31"."0.44")
|
||||
("0.36"."0.50")
|
||||
("0.41"."0.54")
|
||||
("0.46"."0.58")
|
||||
("0.51"."0.62")
|
||||
("0.56"."0.66")
|
||||
("0.61"."0.70")
|
||||
("0.66"."0.74")
|
||||
("0.71"."0.78")
|
||||
("0.76"."0.82")
|
||||
("0.81"."0.86")
|
||||
("0.86"."0.90")
|
||||
("0.91"."0.94")
|
||||
("0.96"."0.98")
|
||||
("1.01"."1.00")
|
||||
: ? (>!arg.?arg) ?
|
||||
& !arg
|
||||
| "invalid input"
|
||||
)
|
||||
& -1:?n
|
||||
& whl
|
||||
' ( !n+1:?n:<103
|
||||
& ( @(!n:? [<2)&str$("0.0" !n):?a
|
||||
| @(!n:? [<3)&str$("0." !n):?a
|
||||
| @(!n:?ones [-3 ?decimals)
|
||||
& str$(!ones "." !decimals):?a
|
||||
)
|
||||
& out$(!a "-->" convert$!a)
|
||||
)
|
||||
)
|
||||
30
Task/Price-fraction/C++/price-fraction.cpp
Normal file
30
Task/Price-fraction/C++/price-fraction.cpp
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
#include <iostream>
|
||||
#include <cmath>
|
||||
|
||||
int main( ) {
|
||||
double froms[ ] = { 0.00 , 0.06 , 0.11 , 0.16 , 0.21 , 0.26 ,
|
||||
0.31 , 0.36 , 0.41 , 0.46 , 0.51 , 0.56 , 0.61 , 0.66 ,
|
||||
0.71 , 0.76 , 0.81 , 0.86 , 0.91 , 0.96 } ;
|
||||
double tos[ ] = { 0.06 , 0.11 , 0.16 , 0.21 , 0.26 , 0.31 ,
|
||||
0.36 , 0.41 , 0.46 , 0.51 , 0.56 , 0.61 , 0.66 , 0.71 ,
|
||||
0.76 , 0.81 , 0.86 , 0.91 , 0.96 , 1.01 } ;
|
||||
double replacements [] = { 0.10 , 0.18 , 0.26 , 0.32 , 0.38 ,
|
||||
0.44 , 0.50 , 0.54 , 0.58 , 0.62 , 0.66 , 0.70 , 0.74 ,
|
||||
0.78 , 0.82 , 0.86 , 0.90 , 0.94 , 0.98 , 1.00 } ;
|
||||
double number = 0.1 ;
|
||||
std::cout << "Enter a fractional number between 0 and 1 ( 0 to end )!\n" ;
|
||||
std::cin >> number ;
|
||||
while ( number != 0 ) {
|
||||
if ( number < 0 || number > 1 ) {
|
||||
std::cerr << "Error! Only positive values between 0 and 1 are allowed!\n" ;
|
||||
return 1 ;
|
||||
}
|
||||
int n = 0 ;
|
||||
while ( ! ( number >= froms[ n ] && number < tos[ n ] ) )
|
||||
n++ ;
|
||||
std::cout << "-->" << replacements[ n ] << '\n' ;
|
||||
std::cout << "Enter a fractional number ( 0 to end )!\n" ;
|
||||
std::cin >> number ;
|
||||
}
|
||||
return 0 ;
|
||||
}
|
||||
28
Task/Price-fraction/C/price-fraction.c
Normal file
28
Task/Price-fraction/C/price-fraction.c
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
#include<stdio.h>
|
||||
|
||||
double table[][2] = {
|
||||
{0.06, 0.10}, {0.11, 0.18}, {0.16, 0.26}, {0.21, 0.32},
|
||||
{0.26, 0.38}, {0.31, 0.44}, {0.36, 0.50}, {0.41, 0.54},
|
||||
{0.46, 0.58}, {0.51, 0.62}, {0.56, 0.66}, {0.61, 0.70},
|
||||
{0.66, 0.74}, {0.71, 0.78}, {0.76, 0.82}, {0.81, 0.86},
|
||||
{0.86, 0.90}, {0.91, 0.94}, {0.96, 0.98}, {1.01, 1.00},
|
||||
{-1, 0}, /* guarding element */
|
||||
};
|
||||
|
||||
double price_fix(double x)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; table[i][0] > 0; i++)
|
||||
if (x < table[i][0]) return table[i][1];
|
||||
|
||||
abort(); /* what else to do? */
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i <= 100; i++)
|
||||
printf("%.2f %.2f\n", i / 100., price_fix(i / 100.));
|
||||
|
||||
return 0;
|
||||
}
|
||||
33
Task/Price-fraction/Clipper/price-fraction-1.clipper
Normal file
33
Task/Price-fraction/Clipper/price-fraction-1.clipper
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
FUNCTION PriceFraction( npQuantDispensed )
|
||||
LOCAL aPriceFraction := { {0,.06,.1},;
|
||||
{.06,.11,.18}, ;
|
||||
{.11,.16,.26}, ;
|
||||
{.16,.21,.32}, ;
|
||||
{.21,.26,.38}, ;
|
||||
{.26,.31,.44}, ;
|
||||
{.31,.36,.5}, ;
|
||||
{.36,.41,.54}, ;
|
||||
{.41,.46,.58}, ;
|
||||
{.46,.51,.62}, ;
|
||||
{.51,.56,.66}, ;
|
||||
{.56,.61,.7}, ;
|
||||
{.61,.66,.74}, ;
|
||||
{.66,.71,.78}, ;
|
||||
{.71,.76,.82}, ;
|
||||
{.76,.81,.86}, ;
|
||||
{.81,.86,.9}, ;
|
||||
{.86,.91,.94}, ;
|
||||
{.91,.96,.98} }
|
||||
LOCAL nResult
|
||||
LOCAL nScan
|
||||
IF npQuantDispensed = 0
|
||||
nResult = 0
|
||||
ELSEIF npQuantDispensed >= .96
|
||||
nResult = 1
|
||||
ELSE
|
||||
nScan := ASCAN( aPriceFraction, ;
|
||||
{ |aItem| npQuantDispensed >= aItem[ 1 ] .AND.;
|
||||
npQuantDispensed < aItem[ 2 ] } )
|
||||
nResult := aPriceFraction[ nScan ][ 3 ]
|
||||
END IF
|
||||
RETURN nResult
|
||||
44
Task/Price-fraction/Clipper/price-fraction-2.clipper
Normal file
44
Task/Price-fraction/Clipper/price-fraction-2.clipper
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
Procedure Main()
|
||||
Local i
|
||||
For i := -0.02 to 1.02 STEP 0.03
|
||||
? i, "->", PriceFraction(i), i+0.02, "->", PriceFraction(i+0.02)
|
||||
Next
|
||||
Return
|
||||
|
||||
|
||||
Static Function PriceFraction( nValue )
|
||||
Local nResult
|
||||
Local n
|
||||
// Function is only defined for values 0 to 1.00
|
||||
// Return NIL for anything else
|
||||
// Table of values {V1, V2} = {Threshhold, Standard value}
|
||||
#define TV_THRESHHOLD 1
|
||||
#define TV_STD_VALUE 2
|
||||
Local aTable := { {0, NIL },;
|
||||
{0.06, 0.10},;
|
||||
{0.11, 0.18},;
|
||||
{0.16, 0.26},;
|
||||
{0.21, 0.32},;
|
||||
{0.26, 0.38},;
|
||||
{0.31, 0.44},;
|
||||
{0.36, 0.50},;
|
||||
{0.41, 0.54},;
|
||||
{0.46, 0.58},;
|
||||
{0.51, 0.62},;
|
||||
{0.56, 0.66},;
|
||||
{0.61, 0.70},;
|
||||
{0.66, 0.74},;
|
||||
{0.71, 0.78},;
|
||||
{0.76, 0.82},;
|
||||
{0.81, 0.86},;
|
||||
{0.86, 0.90},;
|
||||
{0.91, 0.94},;
|
||||
{0.96, 0.98},;
|
||||
{1.01, 1.00} }
|
||||
n := AScan( aTable, {|x| nValue < x[TV_THRESHHOLD] })
|
||||
If n > 0
|
||||
nResult := aTable[n][TV_STD_VALUE]
|
||||
Else
|
||||
nResult := NIL
|
||||
Endif
|
||||
Return nResult
|
||||
20
Task/Price-fraction/D/price-fraction.d
Normal file
20
Task/Price-fraction/D/price-fraction.d
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
import std.stdio;
|
||||
|
||||
double priceRounder(in double price) pure nothrow
|
||||
in {
|
||||
assert(price >= 0 && price <= 1.0);
|
||||
} body {
|
||||
enum cin = [.06, .11, .16, .21, .26, .31, .36, .41, .46, .51,
|
||||
.56, .61, .66, .71, .76, .81, .86, .91, .96, 1.01];
|
||||
enum cout = [.10, .18, .26, .32, .38, .44, .50, .54, .58, .62,
|
||||
.66, .70, .74, .78, .82, .86, .90, .94, .98, 1.00];
|
||||
foreach (i, p; cin)
|
||||
if (p >= price)
|
||||
return cout[i];
|
||||
assert(0);
|
||||
}
|
||||
|
||||
void main() {
|
||||
foreach (price; [0.7388727, 0.8593103, 0.826687, 0.3444635])
|
||||
writeln(priceRounder(price));
|
||||
}
|
||||
22
Task/Price-fraction/Erlang/price-fraction.erl
Normal file
22
Task/Price-fraction/Erlang/price-fraction.erl
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
priceFraction(N) when N < 0 orelse N > 1 ->
|
||||
erlang:error('Values must be between 0 and 1.');
|
||||
priceFraction(N) when N < 0.06 -> 0.10;
|
||||
priceFraction(N) when N < 0.11 -> 0.18;
|
||||
priceFraction(N) when N < 0.16 -> 0.26;
|
||||
priceFraction(N) when N < 0.21 -> 0.32;
|
||||
priceFraction(N) when N < 0.26 -> 0.38;
|
||||
priceFraction(N) when N < 0.31 -> 0.44;
|
||||
priceFraction(N) when N < 0.36 -> 0.50;
|
||||
priceFraction(N) when N < 0.41 -> 0.54;
|
||||
priceFraction(N) when N < 0.46 -> 0.58;
|
||||
priceFraction(N) when N < 0.51 -> 0.62;
|
||||
priceFraction(N) when N < 0.56 -> 0.66;
|
||||
priceFraction(N) when N < 0.61 -> 0.70;
|
||||
priceFraction(N) when N < 0.66 -> 0.74;
|
||||
priceFraction(N) when N < 0.71 -> 0.78;
|
||||
priceFraction(N) when N < 0.76 -> 0.82;
|
||||
priceFraction(N) when N < 0.81 -> 0.86;
|
||||
priceFraction(N) when N < 0.86 -> 0.90;
|
||||
priceFraction(N) when N < 0.91 -> 0.94;
|
||||
priceFraction(N) when N < 0.96 -> 0.98;
|
||||
priceFraction(N) -> 1.00.
|
||||
20
Task/Price-fraction/Euphoria/price-fraction.euphoria
Normal file
20
Task/Price-fraction/Euphoria/price-fraction.euphoria
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
constant table = {
|
||||
{0.06, 0.10}, {0.11, 0.18}, {0.16, 0.26}, {0.21, 0.32},
|
||||
{0.26, 0.38}, {0.31, 0.44}, {0.36, 0.50}, {0.41, 0.54},
|
||||
{0.46, 0.58}, {0.51, 0.62}, {0.56, 0.66}, {0.61, 0.70},
|
||||
{0.66, 0.74}, {0.71, 0.78}, {0.76, 0.82}, {0.81, 0.86},
|
||||
{0.86, 0.90}, {0.91, 0.94}, {0.96, 0.98}, {1.01, 1.00}
|
||||
}
|
||||
|
||||
function price_fix(atom x)
|
||||
for i = 1 to length(table) do
|
||||
if x < table[i][1] then
|
||||
return table[i][2]
|
||||
end if
|
||||
end for
|
||||
return -1
|
||||
end function
|
||||
|
||||
for i = 0 to 99 do
|
||||
printf(1, "%.2f %.2f\n", { i/100, price_fix(i/100) })
|
||||
end for
|
||||
69
Task/Price-fraction/Fantom/price-fraction.fantom
Normal file
69
Task/Price-fraction/Fantom/price-fraction.fantom
Normal file
|
|
@ -0,0 +1,69 @@
|
|||
class Defn // to hold the three numbers from a 'row' in the table
|
||||
{
|
||||
Float low
|
||||
Float high
|
||||
Float value
|
||||
new make (Float low, Float high, Float value)
|
||||
{
|
||||
this.low = low
|
||||
this.high = high
|
||||
this.value = value
|
||||
}
|
||||
}
|
||||
|
||||
class PriceConverter
|
||||
{
|
||||
Defn[] defns := [,]
|
||||
new make (Str table) // process given table and store numbers from each row in a defn
|
||||
{
|
||||
table.split('\n').each |Str line|
|
||||
{
|
||||
data := line.split
|
||||
defns.add (Defn(Float.fromStr(data[1]), Float.fromStr(data[3]), Float.fromStr(data[5])))
|
||||
}
|
||||
}
|
||||
|
||||
public Float convert (Float price) // convert by looking through list of defns
|
||||
{
|
||||
Float result := price
|
||||
defns.each |Defn defn|
|
||||
{
|
||||
if (price >= defn.low && price < defn.high)
|
||||
result = defn.value
|
||||
}
|
||||
return result
|
||||
}
|
||||
}
|
||||
|
||||
class Main
|
||||
{
|
||||
public static Void main ()
|
||||
{
|
||||
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"
|
||||
converter := PriceConverter (table)
|
||||
10.times // simple test with random values
|
||||
{
|
||||
price := (0..100).random.toFloat / 100
|
||||
echo ("$price -> ${converter.convert (price)}")
|
||||
}
|
||||
}
|
||||
}
|
||||
12
Task/Price-fraction/Forth/price-fraction.fth
Normal file
12
Task/Price-fraction/Forth/price-fraction.fth
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
: as begin parse-word dup while evaluate , repeat 2drop ;
|
||||
|
||||
create bounds as 96 91 86 81 76 71 66 61 56 51 46 41 36 31 26 21 16 11 6 0
|
||||
create official as 100 98 94 90 86 82 78 74 70 66 62 58 54 50 44 38 32 26 18 10
|
||||
|
||||
: official@ ( a-bounds -- +n )
|
||||
\ (a+n) - a + b = (a+n) + (b - a) = (b+n)
|
||||
[ official bounds - ] literal + @ ;
|
||||
|
||||
: round ( n-cents -- n-cents' )
|
||||
>r bounds begin dup @ r@ > while cell+ repeat
|
||||
r> drop official@ ;
|
||||
19
Task/Price-fraction/Fortran/price-fraction-1.f
Normal file
19
Task/Price-fraction/Fortran/price-fraction-1.f
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
program price_fraction
|
||||
|
||||
implicit none
|
||||
integer, parameter :: i_max = 10
|
||||
integer :: i
|
||||
real, dimension (20), parameter :: in = &
|
||||
& (/0.00, 0.06, 0.11, 0.16, 0.21, 0.26, 0.31, 0.36, 0.41, 0.46, &
|
||||
& 0.51, 0.56, 0.61, 0.66, 0.71, 0.76, 0.81, 0.86, 0.91, 0.96/)
|
||||
real, dimension (20), parameter :: out = &
|
||||
& (/0.10, 0.18, 0.26, 0.32, 0.38, 0.44, 0.50, 0.54, 0.58, 0.62, &
|
||||
& 0.66, 0.70, 0.74, 0.78, 0.82, 0.86, 0.90, 0.94, 0.98, 1.00/)
|
||||
real :: r
|
||||
|
||||
do i = 1, i_max
|
||||
call random_number (r)
|
||||
write (*, '(f8.6, 1x, f4.2)') r, out (maxloc (in, r >= in))
|
||||
end do
|
||||
|
||||
end program price_fraction
|
||||
10
Task/Price-fraction/Fortran/price-fraction-2.f
Normal file
10
Task/Price-fraction/Fortran/price-fraction-2.f
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
0.997560 1.00
|
||||
0.566825 0.70
|
||||
0.965915 1.00
|
||||
0.747928 0.82
|
||||
0.367391 0.54
|
||||
0.480637 0.62
|
||||
0.073754 0.18
|
||||
0.005355 0.10
|
||||
0.347081 0.50
|
||||
0.342244 0.50
|
||||
24
Task/Price-fraction/Go/price-fraction.go
Normal file
24
Task/Price-fraction/Go/price-fraction.go
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
func pf(v float64) float64 {
|
||||
switch {
|
||||
case v < .06: return .10
|
||||
case v < .11: return .18
|
||||
case v < .16: return .26
|
||||
case v < .21: return .32
|
||||
case v < .26: return .38
|
||||
case v < .31: return .44
|
||||
case v < .36: return .50
|
||||
case v < .41: return .54
|
||||
case v < .46: return .58
|
||||
case v < .51: return .62
|
||||
case v < .56: return .66
|
||||
case v < .61: return .70
|
||||
case v < .66: return .74
|
||||
case v < .71: return .78
|
||||
case v < .76: return .82
|
||||
case v < .81: return .86
|
||||
case v < .86: return .90
|
||||
case v < .91: return .94
|
||||
case v < .96: return .98
|
||||
}
|
||||
return 1
|
||||
}
|
||||
17
Task/Price-fraction/Groovy/price-fraction.groovy
Normal file
17
Task/Price-fraction/Groovy/price-fraction.groovy
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
def priceFraction(value) {
|
||||
assert value >= 0.0 && value <= 1.0
|
||||
|
||||
def priceMappings = [(0.06): 0.10, (0.11): 0.18, (0.16): 0.26, (0.21): 0.32, (0.26): 0.38,
|
||||
(0.31): 0.44, (0.36): 0.50, (0.41): 0.54, (0.46): 0.58, (0.51): 0.62,
|
||||
(0.56): 0.66, (0.61): 0.70, (0.66): 0.74, (0.71): 0.78, (0.76): 0.82,
|
||||
(0.81): 0.86, (0.86): 0.90, (0.91): 0.94, (0.96): 0.98]
|
||||
|
||||
for (price in priceMappings.keySet()) {
|
||||
if (value < price) return priceMappings[price]
|
||||
}
|
||||
1.00
|
||||
}
|
||||
|
||||
for (def v = 0.00; v <= 1.00; v += 0.01) {
|
||||
println "$v --> ${priceFraction(v)}"
|
||||
}
|
||||
22
Task/Price-fraction/Haskell/price-fraction-1.hs
Normal file
22
Task/Price-fraction/Haskell/price-fraction-1.hs
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
price_fraction n
|
||||
| n < 0 || n > 1 = error "Values must be between 0 and 1."
|
||||
| n < 0.06 = 0.10
|
||||
| n < 0.11 = 0.18
|
||||
| n < 0.16 = 0.26
|
||||
| n < 0.21 = 0.32
|
||||
| n < 0.26 = 0.38
|
||||
| n < 0.31 = 0.44
|
||||
| n < 0.36 = 0.50
|
||||
| n < 0.41 = 0.54
|
||||
| n < 0.46 = 0.58
|
||||
| n < 0.51 = 0.62
|
||||
| n < 0.56 = 0.66
|
||||
| n < 0.61 = 0.70
|
||||
| n < 0.66 = 0.74
|
||||
| n < 0.71 = 0.78
|
||||
| n < 0.76 = 0.82
|
||||
| n < 0.81 = 0.86
|
||||
| n < 0.86 = 0.90
|
||||
| n < 0.91 = 0.94
|
||||
| n < 0.96 = 0.98
|
||||
| otherwise = 1.00
|
||||
10
Task/Price-fraction/Haskell/price-fraction-2.hs
Normal file
10
Task/Price-fraction/Haskell/price-fraction-2.hs
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
table = [
|
||||
(0.06, 0.10), (0.11, 0.18), (0.16, 0.26), (0.21, 0.32), (0.26, 0.38),
|
||||
(0.31, 0.44), (0.36, 0.50), (0.41, 0.54), (0.46, 0.58), (0.51, 0.62),
|
||||
(0.56, 0.66), (0.61, 0.70), (0.66, 0.74), (0.71, 0.78), (0.76, 0.82),
|
||||
(0.81, 0.86), (0.86, 0.90), (0.91, 0.94), (0.96, 0.98), (1.01, 1.00),
|
||||
]
|
||||
|
||||
price_fraction n
|
||||
| n < 0 || n > 1 = error "Values must be between 0 and 1."
|
||||
| otherwise = snd $ head $ dropWhile ((<= n) . fst) table
|
||||
10
Task/Price-fraction/HicEst/price-fraction.hicest
Normal file
10
Task/Price-fraction/HicEst/price-fraction.hicest
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
DIMENSION upperbound(20), rescaleTo(20), temp(20)
|
||||
upperbound = (.06,.11,.16,.21,.26,.31,.36,.41,.46,.51,.56,.61,.66,.71,.76,.81,.86,.91,.96,1.01)
|
||||
rescaleTo = (.10,.18,.26,.32,.38,.44,.50,.54,.58,.62,.66,.70,.74,.78,.82,.86,.90,.94,.98,1.00)
|
||||
|
||||
DO test = 1, 10
|
||||
value = RAN(0.5, 0.5)
|
||||
temp = value > upperbound
|
||||
PriceFraction = rescaleTo( INDEX(temp, 0) )
|
||||
WRITE(Format="F8.6, F6.2") value, PriceFraction
|
||||
ENDDO
|
||||
39
Task/Price-fraction/Icon/price-fraction.icon
Normal file
39
Task/Price-fraction/Icon/price-fraction.icon
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
record Bounds(low,high,new)
|
||||
|
||||
# rescale given value according to a list of bounds
|
||||
procedure rescale (i, bounds)
|
||||
every bound := !bounds do
|
||||
if bound.low <= i < bound.high
|
||||
then return bound.new
|
||||
return fail # could not find i in bounds
|
||||
end
|
||||
|
||||
procedure main ()
|
||||
bounds := [
|
||||
Bounds(0.00, 0.06, 0.10),
|
||||
Bounds(0.06, 0.11, 0.18),
|
||||
Bounds(0.11, 0.16, 0.26),
|
||||
Bounds(0.16, 0.21, 0.32),
|
||||
Bounds(0.21, 0.26, 0.38),
|
||||
Bounds(0.26, 0.31, 0.44),
|
||||
Bounds(0.31, 0.36, 0.50),
|
||||
Bounds(0.36, 0.41, 0.54),
|
||||
Bounds(0.41, 0.46, 0.58),
|
||||
Bounds(0.46, 0.51, 0.62),
|
||||
Bounds(0.51, 0.56, 0.66),
|
||||
Bounds(0.56, 0.61, 0.70),
|
||||
Bounds(0.61, 0.66, 0.74),
|
||||
Bounds(0.66, 0.71, 0.78),
|
||||
Bounds(0.71, 0.76, 0.82),
|
||||
Bounds(0.76, 0.81, 0.86),
|
||||
Bounds(0.81, 0.86, 0.90),
|
||||
Bounds(0.86, 0.91, 0.94),
|
||||
Bounds(0.91, 0.96, 0.98),
|
||||
Bounds(0.96, 1.01, 1.00)
|
||||
]
|
||||
|
||||
# test the procedure
|
||||
every i := 0.00 to 1.00 by 0.1 do {
|
||||
write (i || " rescaled is " || rescale(i, bounds))
|
||||
}
|
||||
end
|
||||
37
Task/Price-fraction/Inform-7/price-fraction.inf
Normal file
37
Task/Price-fraction/Inform-7/price-fraction.inf
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
Home is a room.
|
||||
|
||||
Price is a kind of value. 0.99 specifies a price.
|
||||
|
||||
Table of Price Standardization
|
||||
upper bound replacement
|
||||
0.06 0.10
|
||||
0.11 0.18
|
||||
0.16 0.26
|
||||
0.21 0.32
|
||||
0.26 0.38
|
||||
0.31 0.44
|
||||
0.36 0.50
|
||||
0.41 0.54
|
||||
0.46 0.58
|
||||
0.51 0.62
|
||||
0.56 0.66
|
||||
0.61 0.70
|
||||
0.66 0.74
|
||||
0.71 0.78
|
||||
0.76 0.82
|
||||
0.81 0.86
|
||||
0.86 0.90
|
||||
0.91 0.94
|
||||
0.96 0.98
|
||||
1.01 1.00
|
||||
|
||||
To decide which price is the standardized value of (P - price):
|
||||
repeat with N running from 1 to the number of rows in the Table of Price Standardization:
|
||||
choose row N in the Table of Price Standardization;
|
||||
if P is less than the upper bound entry, decide on the replacement entry.
|
||||
|
||||
When play begins:
|
||||
repeat with N running from 1 to 5:
|
||||
let P be a random price between 0.00 and 1.00;
|
||||
say "[P] -> [standardized value of P].";
|
||||
end the story.
|
||||
4
Task/Price-fraction/J/price-fraction-1.j
Normal file
4
Task/Price-fraction/J/price-fraction-1.j
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
le =: -0.96 0.91 0.86 0.81 0.76 0.71 0.66 0.61 0.56 0.51 0.46 0.41 0.36 0.31 0.26 0.21 0.16 0.11 0.06 0.0
|
||||
out =: 1.00 0.98 0.94 0.90 0.86 0.82 0.78 0.74 0.70 0.66 0.62 0.58 0.54 0.50 0.44 0.38 0.32 0.26 0.18 0.1
|
||||
|
||||
priceFraction =: out {~ le I. -
|
||||
2
Task/Price-fraction/J/price-fraction-2.j
Normal file
2
Task/Price-fraction/J/price-fraction-2.j
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
priceFraction 0.34 0.070145 0.06 0.05 0.50214 0.56 1 0.99 0
|
||||
0.5 0.18 0.18 0.1 0.62 0.7 1 1 0.1
|
||||
35
Task/Price-fraction/Java/price-fraction.java
Normal file
35
Task/Price-fraction/Java/price-fraction.java
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
import java.util.Random;
|
||||
|
||||
public class Main {
|
||||
private static float priceFraction(float f) {
|
||||
if (0.00f <= f && f < 0.06f) return 0.10f;
|
||||
else if (f < 0.11f) return 0.18f;
|
||||
else if (f < 0.16f) return 0.26f;
|
||||
else if (f < 0.21f) return 0.32f;
|
||||
else if (f < 0.26f) return 0.38f;
|
||||
else if (f < 0.31f) return 0.44f;
|
||||
else if (f < 0.36f) return 0.50f;
|
||||
else if (f < 0.41f) return 0.54f;
|
||||
else if (f < 0.46f) return 0.58f;
|
||||
else if (f < 0.51f) return 0.62f;
|
||||
else if (f < 0.56f) return 0.66f;
|
||||
else if (f < 0.61f) return 0.70f;
|
||||
else if (f < 0.66f) return 0.74f;
|
||||
else if (f < 0.71f) return 0.78f;
|
||||
else if (f < 0.76f) return 0.82f;
|
||||
else if (f < 0.81f) return 0.86f;
|
||||
else if (f < 0.86f) return 0.90f;
|
||||
else if (f < 0.91f) return 0.94f;
|
||||
else if (f < 0.96f) return 0.98f;
|
||||
else if (f < 1.01f) return 1.00f;
|
||||
else throw new IllegalArgumentException();
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
Random rnd = new Random();
|
||||
for (int i = 0; i < 5; i++) {
|
||||
float f = rnd.nextFloat();
|
||||
System.out.format("%8.6f -> %4.2f%n", f, priceFraction(f));
|
||||
}
|
||||
}
|
||||
}
|
||||
8
Task/Price-fraction/JavaScript/price-fraction.js
Normal file
8
Task/Price-fraction/JavaScript/price-fraction.js
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
function getScaleFactor(v) {
|
||||
|
||||
var values = ['0.10','0.18','0.26','0.32','0.38','0.44','0.50','0.54',
|
||||
'0.58','0.62','0.66','0.70','0.74','0.78','0.82','0.86',
|
||||
'0.90','0.94','0.98','1.00'];
|
||||
|
||||
return values[(v * 100 - 1) / 5 | 0];
|
||||
}
|
||||
4
Task/Price-fraction/K/price-fraction-1.k
Normal file
4
Task/Price-fraction/K/price-fraction-1.k
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
le:- 0.96 0.91 0.86 0.81 0.76 0.71 0.66 0.61 0.56 0.51 0.46 0.41 0.36 0.31 0.26 0.21 0.16 0.11 0.06 0.0
|
||||
out: 1.00 0.98 0.94 0.90 0.86 0.82 0.78 0.74 0.70 0.66 0.62 0.58 0.54 0.50 0.44 0.38 0.32 0.26 0.18 0.1
|
||||
|
||||
pf:{out@_bin[le;-x]}'
|
||||
2
Task/Price-fraction/K/price-fraction-2.k
Normal file
2
Task/Price-fraction/K/price-fraction-2.k
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
pf 0.6094701 0.5003597 0.8512954 0.08951883 0.6868076
|
||||
0.7 0.62 0.9 0.18 0.78
|
||||
23
Task/Price-fraction/Liberty-BASIC/price-fraction.liberty
Normal file
23
Task/Price-fraction/Liberty-BASIC/price-fraction.liberty
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
dim DR(38) 'decimal range
|
||||
dim PF(38) 'corresponding price fraction
|
||||
range$="0.06 0.11 0.16 0.21 0.26 0.31 0.36 0.41 0.46 0.51 0.56 0.61 0.66 0.71 0.76 0.81 0.86 0.91 0.96 0.01"
|
||||
frac$="0.10 0.18 0.26 0.32 0.38 0.44 0.50 0.54 0.58 0.62 0.66 0.70 0.74 0.78 0.82 0.86 0.90 0.94 0.98 1.00"
|
||||
for i = 1 to 38
|
||||
DR(i)=val(word$(range$,i))
|
||||
PF(i)=val(word$(frac$,i))
|
||||
next
|
||||
|
||||
for i = 0 to .99 step 0.03
|
||||
print i;" -> ";PriceFraction(i)
|
||||
next
|
||||
end
|
||||
|
||||
Function PriceFraction(n)
|
||||
PriceFraction=n 'return original if outside test bounds
|
||||
for i = 1 to 38
|
||||
if n<=DR(i) then
|
||||
PriceFraction=PF(i)
|
||||
exit for
|
||||
end if
|
||||
next
|
||||
end function
|
||||
13
Task/Price-fraction/MATLAB/price-fraction.m
Normal file
13
Task/Price-fraction/MATLAB/price-fraction.m
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
function y = rescale(x)
|
||||
|
||||
L = [0,.06:.05:1.02];
|
||||
V = [.1,.18,.26,.32,.38,.44,.50,.54,.58,.62,.66,.70,.74,.78,.82,.86,.9,.94,.98,1];
|
||||
|
||||
y = x;
|
||||
for k=1:numel(x);
|
||||
y(k) = V(sum(L<=x(k)));
|
||||
end;
|
||||
end;
|
||||
|
||||
t=0:0.001:1;
|
||||
plot(t,rescale(t));
|
||||
11
Task/Price-fraction/MUMPS/price-fraction.mumps
Normal file
11
Task/Price-fraction/MUMPS/price-fraction.mumps
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
PRICFRAC(X)
|
||||
;Outputs a specified value dependent upon the input value
|
||||
;The non-inclusive upper limits are encoded in the PFMAX string, and the values
|
||||
;to convert to are encoded in the PFRES string.
|
||||
NEW PFMAX,PFRES,I,RESULT
|
||||
SET PFMAX=".06^.11^.16^.21^.26^.31^.36^.41^.46^.51^.56^.61^.66^.71^.76^.81^.86^.91^.96^1.01"
|
||||
SET PFRES=".10^.18^.26^.32^.38^.44^.50^.54^.58^.62^.66^.70^.74^.78^.82^.86^.90^.94^.98^1.00"
|
||||
Q:(X<0)!(X>1.01) ""
|
||||
FOR I=1:1:$LENGTH(PFMAX,"^") Q:($DATA(RESULT)'=0) SET:X<$P(PFMAX,"^",I) RESULT=$P(PFRES,"^",I)
|
||||
KILL PFMAX,PFRES,I
|
||||
QUIT RESULT
|
||||
5
Task/Price-fraction/Mathematica/price-fraction.math
Normal file
5
Task/Price-fraction/Mathematica/price-fraction.math
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
PriceFraction[x_]:=Piecewise[{{.1, 0 <= x < 0.06}, {.18, x < .11}, {.26,x < 0.16},
|
||||
{.32, x < .21}, {.38, x < .26}, {.44, x < 0.31}, {.5, x < .36},
|
||||
{.54, x < .41}, {.58, x < .46}, {.62, x < .51}, {.66, x < .56},
|
||||
{.70, x < .61}, {.74, x < .66}, {.78, x < .71}, {.82, x < .76},
|
||||
{.86, x < .81}, {.90, x < .86}, {.94, x < .91}, {.98, x < .96}}, 1]
|
||||
44
Task/Price-fraction/Mercury/price-fraction-1.mercury
Normal file
44
Task/Price-fraction/Mercury/price-fraction-1.mercury
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
:- 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)].
|
||||
1
Task/Price-fraction/Mercury/price-fraction-2.mercury
Normal file
1
Task/Price-fraction/Mercury/price-fraction-2.mercury
Normal file
|
|
@ -0,0 +1 @@
|
|||
adjust(Cents) = array.lookup(price_table, Cents).
|
||||
15
Task/Price-fraction/OCaml/price-fraction-1.ocaml
Normal file
15
Task/Price-fraction/OCaml/price-fraction-1.ocaml
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
let price_fraction v =
|
||||
if v < 0.0 || v >= 1.01 then
|
||||
invalid_arg "price_fraction";
|
||||
let rec aux = function
|
||||
| (x,r)::tl ->
|
||||
if v < x then r
|
||||
else aux tl
|
||||
| [] -> assert false
|
||||
in
|
||||
aux [
|
||||
0.06, 0.10; 0.11, 0.18; 0.16, 0.26; 0.21, 0.32; 0.26, 0.38;
|
||||
0.31, 0.44; 0.36, 0.50; 0.41, 0.54; 0.46, 0.58; 0.51, 0.62;
|
||||
0.56, 0.66; 0.61, 0.70; 0.66, 0.74; 0.71, 0.78; 0.76, 0.82;
|
||||
0.81, 0.86; 0.86, 0.90; 0.91, 0.94; 0.96, 0.98; 1.01, 1.00;
|
||||
]
|
||||
18
Task/Price-fraction/OCaml/price-fraction-2.ocaml
Normal file
18
Task/Price-fraction/OCaml/price-fraction-2.ocaml
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
let () =
|
||||
let ok_tests = [
|
||||
(0.3793, 0.54);
|
||||
(0.4425, 0.58);
|
||||
(0.0746, 0.18);
|
||||
(0.6918, 0.78);
|
||||
(0.2993, 0.44);
|
||||
(0.5486, 0.66);
|
||||
(0.7848, 0.86);
|
||||
(0.9383, 0.98);
|
||||
(0.2292, 0.38);
|
||||
] in
|
||||
Printf.printf " input res ok\n";
|
||||
List.iter (fun (v,ok) ->
|
||||
let r = price_fraction v in
|
||||
Printf.printf " %6g %g %b\n" v r (r = ok);
|
||||
) ok_tests;
|
||||
;;
|
||||
15
Task/Price-fraction/Oz/price-fraction.oz
Normal file
15
Task/Price-fraction/Oz/price-fraction.oz
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
fun {PriceFraction X}
|
||||
OutOfRange = {Value.failed outOfRange(X)}
|
||||
in
|
||||
for Limit#Result in
|
||||
[0.00#OutOfRange
|
||||
0.06#0.10 0.11#0.18 0.16#0.26 0.21#0.32 0.26#0.38 0.31#0.44 0.36#0.5
|
||||
0.41#0.54 0.46#0.58 0.51#0.62 0.56#0.66 0.61#0.70 0.66#0.74 0.71#0.78
|
||||
0.76#0.82 0.81#0.86 0.86#0.90 0.91#0.94 0.96#0.98 1.01#1.00
|
||||
]
|
||||
return:Return
|
||||
default:OutOfRange
|
||||
do
|
||||
if X < Limit then {Return Result} end
|
||||
end
|
||||
end
|
||||
9
Task/Price-fraction/PARI-GP/price-fraction.pari
Normal file
9
Task/Price-fraction/PARI-GP/price-fraction.pari
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
priceLookup=[6,11,16,21,26,31,41,46,51,56,61,66,71,76,81,86,91,96,101];
|
||||
priceReplace=[10,18,26,32,38,44,50,54,58,62,66,70,74,78,82,86,90,94,98,100];
|
||||
pf(x)={
|
||||
x*=100;
|
||||
for(i=1,19,
|
||||
if(x<priceLookup[i], return(priceReplace[i]))
|
||||
);
|
||||
"nasal demons"
|
||||
};
|
||||
14
Task/Price-fraction/PL-I/price-fraction.pli
Normal file
14
Task/Price-fraction/PL-I/price-fraction.pli
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
declare t(20) fixed decimal (3,2) static initial (
|
||||
.06, .11, .16, .21, .26, .31, .36, .41, .46, .51,
|
||||
.56, .61, .66, .71, .76, .81, .86, .91, .96, 1.01);
|
||||
declare r(20) fixed decimal (3,2) static initial (
|
||||
.10, .18, .26, .32, .38, .44, .50, .54, .58, .62,
|
||||
.66, .70, .74, .78, .82, .86, .90, .94, .98, 1);
|
||||
declare x float, d fixed decimal (3,2);
|
||||
declare i fixed binary;
|
||||
|
||||
loop:
|
||||
do i = 1 to 20;
|
||||
if x < t(i) then
|
||||
do; d = r(i); leave loop; end;
|
||||
end;
|
||||
25
Task/Price-fraction/Pascal/price-fraction.pascal
Normal file
25
Task/Price-fraction/Pascal/price-fraction.pascal
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
Program PriceFraction(output);
|
||||
|
||||
const
|
||||
limit: array [1..20] of real =
|
||||
(0.06, 0.11, 0.16, 0.21, 0.26, 0.31, 0.36, 0.41, 0.46, 0.51,
|
||||
0.56, 0.61, 0.66, 0.71, 0.76, 0.81, 0.86, 0.91, 0.96, 1.01);
|
||||
price: array [1..20] of real =
|
||||
(0.10, 0.18, 0.26, 0.32, 0.38, 0.44, 0.50, 0.54, 0.58, 0.62,
|
||||
0.66, 0.70, 0.74, 0.78, 0.81, 0.86, 0.90, 0.94, 0.98, 1.00);
|
||||
|
||||
var
|
||||
cost: real;
|
||||
i, j: integer;
|
||||
|
||||
begin
|
||||
randomize;
|
||||
for i := 1 to 10 do
|
||||
begin
|
||||
cost := random;
|
||||
j := high(limit);
|
||||
while cost < limit[j] do
|
||||
dec(j);
|
||||
writeln (cost:6:4, ' -> ', price[j+1]:4:2);
|
||||
end;
|
||||
end.
|
||||
35
Task/Price-fraction/Perl-6/price-fraction-1.pl6
Normal file
35
Task/Price-fraction/Perl-6/price-fraction-1.pl6
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
my $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
|
||||
";
|
||||
|
||||
my $value = 0.44;
|
||||
|
||||
say price($value);
|
||||
|
||||
sub price($value)
|
||||
{
|
||||
for $table.lines -> $line {
|
||||
$line ~~ / '>=' \s+ (\S+) \s+ '<' \s+ (\S+) \s+ ':=' \s+ (\S+)/;
|
||||
return $2 if $0 <= $value < $1;
|
||||
}
|
||||
fail "Out of range";
|
||||
}
|
||||
26
Task/Price-fraction/Perl-6/price-fraction-2.pl6
Normal file
26
Task/Price-fraction/Perl-6/price-fraction-2.pl6
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
my @price = map *.value,
|
||||
( 0 ..^ 6 X=> 0.10),
|
||||
( 6 ..^ 11 X=> 0.18),
|
||||
(11 ..^ 16 X=> 0.26),
|
||||
(16 ..^ 21 X=> 0.32),
|
||||
(21 ..^ 26 X=> 0.38),
|
||||
(26 ..^ 31 X=> 0.44),
|
||||
(31 ..^ 36 X=> 0.50),
|
||||
(36 ..^ 41 X=> 0.54),
|
||||
(41 ..^ 46 X=> 0.58),
|
||||
(46 ..^ 51 X=> 0.62),
|
||||
(51 ..^ 56 X=> 0.66),
|
||||
(56 ..^ 61 X=> 0.70),
|
||||
(61 ..^ 66 X=> 0.74),
|
||||
(66 ..^ 71 X=> 0.78),
|
||||
(71 ..^ 76 X=> 0.82),
|
||||
(76 ..^ 81 X=> 0.86),
|
||||
(81 ..^ 86 X=> 0.90),
|
||||
(86 ..^ 91 X=> 0.94),
|
||||
(91 ..^ 96 X=> 0.98),
|
||||
(96 ..^101 X=> 1.00),
|
||||
;
|
||||
|
||||
while prompt("value: ") -> $value {
|
||||
say @price[ $value * 100 ] // note "Out of range";
|
||||
}
|
||||
28
Task/Price-fraction/Perl-6/price-fraction-3.pl6
Normal file
28
Task/Price-fraction/Perl-6/price-fraction-3.pl6
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
sub price_fraction ( Num $n where { $^n >= 0 and $^n <= 1 } ) {
|
||||
( $n < 0.06 ) ?? 0.10
|
||||
!! ( $n < 0.11 ) ?? 0.18
|
||||
!! ( $n < 0.16 ) ?? 0.26
|
||||
!! ( $n < 0.21 ) ?? 0.32
|
||||
!! ( $n < 0.26 ) ?? 0.38
|
||||
!! ( $n < 0.31 ) ?? 0.44
|
||||
!! ( $n < 0.36 ) ?? 0.50
|
||||
!! ( $n < 0.41 ) ?? 0.54
|
||||
!! ( $n < 0.46 ) ?? 0.58
|
||||
!! ( $n < 0.51 ) ?? 0.62
|
||||
!! ( $n < 0.56 ) ?? 0.66
|
||||
!! ( $n < 0.61 ) ?? 0.70
|
||||
!! ( $n < 0.66 ) ?? 0.74
|
||||
!! ( $n < 0.71 ) ?? 0.78
|
||||
!! ( $n < 0.76 ) ?? 0.82
|
||||
!! ( $n < 0.81 ) ?? 0.86
|
||||
!! ( $n < 0.86 ) ?? 0.90
|
||||
!! ( $n < 0.91 ) ?? 0.94
|
||||
!! ( $n < 0.96 ) ?? 0.98
|
||||
!! 1.00
|
||||
;
|
||||
}
|
||||
|
||||
while prompt("value: ") -> $value {
|
||||
last if $value ~~ /exit|quit/;
|
||||
say price_fraction(+$value);
|
||||
}
|
||||
36
Task/Price-fraction/Perl/price-fraction.pl
Normal file
36
Task/Price-fraction/Perl/price-fraction.pl
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
my @table = map [ /([\d\.]+)/g ], split "\n", <<'TBL';
|
||||
>= 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
|
||||
TBL
|
||||
|
||||
sub convert {
|
||||
my $money = shift;
|
||||
for (@table) {
|
||||
return $_->[2] if $_->[0] <= $money and $_->[1] > $money
|
||||
}
|
||||
die "Can't find currency conversion for $money. Counterfeit?"
|
||||
}
|
||||
|
||||
# try it out
|
||||
for (1 .. 10) {
|
||||
my $m = rand(1);
|
||||
printf "%.3f -> %g\n", $m, convert($m);
|
||||
}
|
||||
31
Task/Price-fraction/PicoLisp/price-fraction.l
Normal file
31
Task/Price-fraction/PicoLisp/price-fraction.l
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
(scl 2)
|
||||
|
||||
(de price (Pr)
|
||||
(format
|
||||
(cdr
|
||||
(rank Pr
|
||||
(quote
|
||||
(0.00 . 0.10)
|
||||
(0.06 . 0.18)
|
||||
(0.11 . 0.26)
|
||||
(0.16 . 0.32)
|
||||
(0.21 . 0.38)
|
||||
(0.26 . 0.44)
|
||||
(0.31 . 0.50)
|
||||
(0.36 . 0.54)
|
||||
(0.41 . 0.58)
|
||||
(0.46 . 0.62)
|
||||
(0.51 . 0.66)
|
||||
(0.56 . 0.70)
|
||||
(0.61 . 0.74)
|
||||
(0.66 . 0.78)
|
||||
(0.71 . 0.82)
|
||||
(0.76 . 0.86)
|
||||
(0.81 . 0.90)
|
||||
(0.86 . 0.94)
|
||||
(0.91 . 0.98)
|
||||
(0.96 . 1.00) ) ) )
|
||||
*Scl ) )
|
||||
|
||||
(for N (0.3793 0.4425 0.0746 0.6918 0.2993 0.5486 0.7848 0.9383 0.2292)
|
||||
(prinl (price N)) )
|
||||
63
Task/Price-fraction/PureBasic/price-fraction.purebasic
Normal file
63
Task/Price-fraction/PureBasic/price-fraction.purebasic
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
Procedure.f PriceFraction(price.f)
|
||||
;returns price unchanged if value is invalid
|
||||
Protected fraction
|
||||
Select price * 100
|
||||
Case 0 To 5
|
||||
fraction = 10
|
||||
Case 06 To 10
|
||||
fraction = 18
|
||||
Case 11 To 15
|
||||
fraction = 26
|
||||
Case 16 To 20
|
||||
fraction = 32
|
||||
Case 21 To 25
|
||||
fraction = 38
|
||||
Case 26 To 30
|
||||
fraction = 44
|
||||
Case 31 To 35
|
||||
fraction = 5
|
||||
Case 36 To 40
|
||||
fraction = 54
|
||||
Case 41 To 45
|
||||
fraction = 58
|
||||
Case 46 To 50
|
||||
fraction = 62
|
||||
Case 51 To 55
|
||||
fraction = 66
|
||||
Case 56 To 60
|
||||
fraction = 7
|
||||
Case 61 To 65
|
||||
fraction = 74
|
||||
Case 66 To 70
|
||||
fraction = 78
|
||||
Case 71 To 75
|
||||
fraction = 82
|
||||
Case 76 To 80
|
||||
fraction = 86
|
||||
Case 81 To 85
|
||||
fraction = 9
|
||||
Case 86 To 90
|
||||
fraction = 94
|
||||
Case 91 To 95
|
||||
fraction = 98
|
||||
Case 96 To 100
|
||||
fraction = 100
|
||||
Default
|
||||
ProcedureReturn price
|
||||
EndSelect
|
||||
|
||||
ProcedureReturn fraction / 100
|
||||
EndProcedure
|
||||
|
||||
If OpenConsole()
|
||||
Define x.f, i
|
||||
|
||||
For i = 1 To 10
|
||||
x = Random(10000)/10000
|
||||
PrintN(StrF(x, 4) + " -> " + StrF(PriceFraction(x), 2))
|
||||
Next
|
||||
|
||||
Print(#CRLF$ + #CRLF$ + "Press ENTER to exit")
|
||||
Input()
|
||||
CloseConsole()
|
||||
EndIf
|
||||
5
Task/Price-fraction/Python/price-fraction-1.py
Normal file
5
Task/Price-fraction/Python/price-fraction-1.py
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
>>> import bisect
|
||||
>>> _cin = [.06, .11, .16, .21, .26, .31, .36, .41, .46, .51, .56, .61, .66, .71, .76, .81, .86, .91, .96, 1.01]
|
||||
>>> _cout = [.10, .18, .26, .32, .38, .44, .50, .54, .58, .62, .66, .70, .74, .78, .82, .86, .90, .94, .98, 1.00]
|
||||
>>> def pricerounder(pricein):
|
||||
return _cout[ bisect.bisect_right(_cin, pricein) ]
|
||||
5
Task/Price-fraction/Python/price-fraction-2.py
Normal file
5
Task/Price-fraction/Python/price-fraction-2.py
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
>>> import bisect
|
||||
>>> _cin = [ 6, 11, 16, 21, 26, 31, 36, 41, 46, 51, 56, 61, 66, 71, 76, 81, 86, 91, 96, 101]
|
||||
>>> _cout = [10, 18, 26, 32, 38, 44, 50, 54, 58, 62, 66, 70, 74, 78, 82, 86, 90, 94, 98, 100]
|
||||
>>> def centsrounder(centsin):
|
||||
return _cout[ bisect.bisect_right(_cin, centsin) ]
|
||||
20
Task/Price-fraction/Python/price-fraction-3.py
Normal file
20
Task/Price-fraction/Python/price-fraction-3.py
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
def bisect_right(a, x, lo=0, hi=None):
|
||||
"""Return the index where to insert item x in list a, assuming a is sorted.
|
||||
|
||||
The return value i is such that all e in a[:i] have e <= x, and all e in
|
||||
a[i:] have e > x. So if x already appears in the list, a.insert(x) will
|
||||
insert just after the rightmost x already there.
|
||||
|
||||
Optional args lo (default 0) and hi (default len(a)) bound the
|
||||
slice of a to be searched.
|
||||
"""
|
||||
|
||||
if lo < 0:
|
||||
raise ValueError('lo must be non-negative')
|
||||
if hi is None:
|
||||
hi = len(a)
|
||||
while lo < hi:
|
||||
mid = (lo+hi)//2
|
||||
if x < a[mid]: hi = mid
|
||||
else: lo = mid+1
|
||||
return lo
|
||||
11
Task/Price-fraction/R/price-fraction-1.r
Normal file
11
Task/Price-fraction/R/price-fraction-1.r
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
price_fraction <- function(x)
|
||||
{
|
||||
stopifnot(all(x >= 0 & x <= 1))
|
||||
breaks <- seq(0.06, 1.01, 0.05)
|
||||
values <- c(.1, .18, .26, .32, .38, .44, .5, .54, .58, .62, .66, .7, .74, .78, .82, .86, .9, .94, .98, 1)
|
||||
indices <- sapply(x, function(x) which(x < breaks)[1])
|
||||
values[indices]
|
||||
}
|
||||
|
||||
#Example usage:
|
||||
price_fraction(c(0, .01, 0.06, 0.25, 1)) # 0.10 0.10 0.18 0.38 1.00
|
||||
23
Task/Price-fraction/R/price-fraction-2.r
Normal file
23
Task/Price-fraction/R/price-fraction-2.r
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
dfr <- read.table(tc <- textConnection(
|
||||
">= 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")); close(tc)
|
||||
breaks <- dfr$V4
|
||||
values <- dfr$V6
|
||||
32
Task/Price-fraction/REXX/price-fraction.rexx
Normal file
32
Task/Price-fraction/REXX/price-fraction.rexx
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
/*REXX program to rescale a (decimal fraction) price (0.99 ──► 1.00).*/
|
||||
pad=' ' /*for inserting spaces into msg. */
|
||||
do j=0 to 1 by .01; if j==0 then j=0.00 /*special case.*/
|
||||
say pad 'original price ──►' j pad adjPrice(j) " ◄── adjusted price"
|
||||
end /*j*/
|
||||
exit /*stick a fork in it, we're done.*/
|
||||
/*──────────────────────────────────ADJPRICE subroutine─────────────────*/
|
||||
adjPrice: procedure; parse arg ?
|
||||
select
|
||||
when ?<0.06 then ?=0.10
|
||||
when ?<0.11 then ?=0.18
|
||||
when ?<0.16 then ?=0.26
|
||||
when ?<0.21 then ?=0.32
|
||||
when ?<0.26 then ?=0.38
|
||||
when ?<0.31 then ?=0.44
|
||||
when ?<0.36 then ?=0.50
|
||||
when ?<0.41 then ?=0.54
|
||||
when ?<0.46 then ?=0.58
|
||||
when ?<0.51 then ?=0.62
|
||||
when ?<0.56 then ?=0.66
|
||||
when ?<0.61 then ?=0.70
|
||||
when ?<0.66 then ?=0.74
|
||||
when ?<0.71 then ?=0.78
|
||||
when ?<0.76 then ?=0.82
|
||||
when ?<0.81 then ?=0.86
|
||||
when ?<0.86 then ?=0.90
|
||||
when ?<0.91 then ?=0.94
|
||||
when ?<0.96 then ?=0.98
|
||||
when ?<1.01 then ?=1.00
|
||||
otherwise nop
|
||||
end /*select*/
|
||||
return ?
|
||||
24
Task/Price-fraction/Ruby/price-fraction-1.rb
Normal file
24
Task/Price-fraction/Ruby/price-fraction-1.rb
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
def rescale_price_fraction(value)
|
||||
raise ArgumentError, "value=#{value}, must have: 0 <= value < 1.01" if value < 0 || value >= 1.01
|
||||
if value < 0.06 then 0.10
|
||||
elsif value < 0.11 then 0.18
|
||||
elsif value < 0.16 then 0.26
|
||||
elsif value < 0.21 then 0.32
|
||||
elsif value < 0.26 then 0.38
|
||||
elsif value < 0.31 then 0.44
|
||||
elsif value < 0.36 then 0.50
|
||||
elsif value < 0.41 then 0.54
|
||||
elsif value < 0.46 then 0.58
|
||||
elsif value < 0.51 then 0.62
|
||||
elsif value < 0.56 then 0.66
|
||||
elsif value < 0.61 then 0.70
|
||||
elsif value < 0.66 then 0.74
|
||||
elsif value < 0.71 then 0.78
|
||||
elsif value < 0.76 then 0.82
|
||||
elsif value < 0.81 then 0.86
|
||||
elsif value < 0.86 then 0.90
|
||||
elsif value < 0.91 then 0.94
|
||||
elsif value < 0.96 then 0.98
|
||||
elsif value < 1.01 then 1.00
|
||||
end
|
||||
end
|
||||
48
Task/Price-fraction/Ruby/price-fraction-2.rb
Normal file
48
Task/Price-fraction/Ruby/price-fraction-2.rb
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
class Price
|
||||
ConversionTable = <<-END_OF_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
|
||||
END_OF_TABLE
|
||||
|
||||
RE = %r{ ([<>=]+) \s* (\d\.\d\d) \s* ([<>=]+) \s* (\d\.\d\d) \D+ (\d\.\d\d) }x
|
||||
|
||||
# extract the comparison operators and numbers from the table
|
||||
CONVERSION_TABLE = ConversionTable.lines.inject([]) do |table, line|
|
||||
m = line.match(RE)
|
||||
if not m.nil? and m.length == 6
|
||||
table << [m[1], m[2].to_f, m[3], m[4].to_f, m[5].to_f]
|
||||
end
|
||||
table
|
||||
end
|
||||
|
||||
MIN_COMP, MIN = CONVERSION_TABLE[0][0..1]
|
||||
MAX_COMP, MAX = CONVERSION_TABLE[-1][2..3]
|
||||
|
||||
def initialize(value)
|
||||
if (not value.send(MIN_COMP, MIN)) or (not value.send(MAX_COMP, MAX))
|
||||
raise ArgumentError, "value=#{value}, must have: #{MIN} #{MIN_COMP} value #{MAX_COMP} #{MAX}"
|
||||
end
|
||||
@standard_value = CONVERSION_TABLE.find do |comp1, lower, comp2, upper, standard|
|
||||
value.send(comp1, lower) and value.send(comp2, upper)
|
||||
end.last
|
||||
end
|
||||
attr_reader :standard_value
|
||||
end
|
||||
27
Task/Price-fraction/Ruby/price-fraction-3.rb
Normal file
27
Task/Price-fraction/Ruby/price-fraction-3.rb
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
require 'test/unit'
|
||||
|
||||
class PriceFractionTests < Test::Unit::TestCase
|
||||
@@ok_tests = [
|
||||
[0.3793, 0.54],
|
||||
[0.4425, 0.58],
|
||||
[0.0746, 0.18],
|
||||
[0.6918, 0.78],
|
||||
[0.2993, 0.44],
|
||||
[0.5486, 0.66],
|
||||
[0.7848, 0.86],
|
||||
[0.9383, 0.98],
|
||||
[0.2292, 0.38],
|
||||
]
|
||||
@@bad_tests = [1.02, -3]
|
||||
|
||||
def test_ok
|
||||
@@ok_tests.each do |val, exp|
|
||||
assert_equal(exp, rescale_price_fraction(val))
|
||||
assert_equal(exp, Price.new(val).standard_value)
|
||||
end
|
||||
@@bad_tests.each do |val|
|
||||
assert_raise(ArgumentError) {rescale_price_fraction(val)}
|
||||
assert_raise(ArgumentError) {Price.new(val).standard_value}
|
||||
end
|
||||
end
|
||||
end
|
||||
20
Task/Price-fraction/Run-BASIC/price-fraction.run
Normal file
20
Task/Price-fraction/Run-BASIC/price-fraction.run
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
data .06, .1,.11,.18,.16,.26,.21,.32,.26,.38,.31,.44,.36,.50,.41,.54,.46,.58,.51,.62
|
||||
data .56,.66,.61,.70,.66,.74,.71,.78,.76,.82,.81,.86,.86,.90,.91,.94,.96,.98
|
||||
|
||||
dim od(100)
|
||||
dim nd(100)
|
||||
for i = 1 to 19
|
||||
read oldDec
|
||||
read newDec
|
||||
j = j + 1
|
||||
for j = j to oldDec * 100
|
||||
nd(j) = newDec
|
||||
next j
|
||||
next i
|
||||
|
||||
[loop]
|
||||
input "Gimme a number";numb
|
||||
decm = val(using("##",(numb mod 1) * 100))
|
||||
print numb;" -->";nd(decm)
|
||||
|
||||
goto [loop]
|
||||
10
Task/Price-fraction/Scala/price-fraction.scala
Normal file
10
Task/Price-fraction/Scala/price-fraction.scala
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
def priceFraction(x:Double)=x match {
|
||||
case n if n>=0 && n<0.06 => 0.10
|
||||
case n if n<0.11 => 0.18
|
||||
case n if n<0.36 => ((((n*100).toInt-11)/5)*6+26)/100.toDouble
|
||||
case n if n<0.96 => ((((n*100).toInt-31)/5)*4+50)/100.toDouble
|
||||
case _ => 1.00
|
||||
}
|
||||
|
||||
def testPriceFraction()=
|
||||
for(n <- 0.00 to (1.00, 0.01)) println("%.2f %.2f".format(n, priceFraction(n)))
|
||||
28
Task/Price-fraction/Seed7/price-fraction-1.seed7
Normal file
28
Task/Price-fraction/Seed7/price-fraction-1.seed7
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
$ include "seed7_05.s7i";
|
||||
include "float.s7i";
|
||||
|
||||
const func float: computePrice (in float: x) is func
|
||||
result
|
||||
var float: price is 0.0;
|
||||
begin
|
||||
if x >= 0.0 and x < 0.06 then
|
||||
price := 0.10;
|
||||
elsif x < 0.11 then
|
||||
price := 0.18;
|
||||
elsif x < 0.36 then
|
||||
price := flt(((trunc(x * 100.0) - 11) div 5) * 6 + 26) / 100.0;
|
||||
elsif x < 0.96 then
|
||||
price := flt(((trunc(x * 100.0) - 31) div 5) * 4 + 50) / 100.0;
|
||||
else
|
||||
price := 1.0;
|
||||
end if;
|
||||
end func;
|
||||
|
||||
const proc: main is func
|
||||
local
|
||||
var integer: i is 0;
|
||||
begin
|
||||
for i range 0 to 100 do
|
||||
writeln(flt(i) / 100.0 digits 2 <& " " <& computePrice(flt(i) / 100.0) digits 2);
|
||||
end for;
|
||||
end func;
|
||||
21
Task/Price-fraction/Seed7/price-fraction-2.seed7
Normal file
21
Task/Price-fraction/Seed7/price-fraction-2.seed7
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
const array array float: table is [] (
|
||||
[] (0.06, 0.10), [] (0.11, 0.18), [] (0.16, 0.26), [] (0.21, 0.32), [] (0.26, 0.38),
|
||||
[] (0.31, 0.44), [] (0.36, 0.50), [] (0.41, 0.54), [] (0.46, 0.58), [] (0.51, 0.62),
|
||||
[] (0.56, 0.66), [] (0.61, 0.70), [] (0.66, 0.74), [] (0.71, 0.78), [] (0.76, 0.82),
|
||||
[] (0.81, 0.86), [] (0.86, 0.90), [] (0.91, 0.94), [] (0.96, 0.98), [] (1.01, 1.00));
|
||||
|
||||
const func float: computePrice (in float: x) is func
|
||||
result
|
||||
var float: price is 0.0;
|
||||
local
|
||||
var integer: index is 1;
|
||||
begin
|
||||
if x >= 0.0 then
|
||||
while x >= table[index][1] do
|
||||
incr(index);
|
||||
end while;
|
||||
price := table[index][2];
|
||||
else
|
||||
raise RANGE_ERROR;
|
||||
end if;
|
||||
end func;
|
||||
49
Task/Price-fraction/Smalltalk/price-fraction.st
Normal file
49
Task/Price-fraction/Smalltalk/price-fraction.st
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
"Table driven rescale"
|
||||
Object subclass: PriceRescale [
|
||||
|table|
|
||||
PriceRescale class >> new: theTable [
|
||||
^ self basicNew initialize: theTable
|
||||
]
|
||||
initialize: theTable [
|
||||
table := theTable asOrderedCollection.
|
||||
^self
|
||||
]
|
||||
rescale: aPrice [ |v1 v2|
|
||||
1 to: (table size - 1) do: [:i|
|
||||
v1 := table at: i.
|
||||
v2 := table at: (i+1).
|
||||
((aPrice >= (v1 x)) & (aPrice < (v2 x)))
|
||||
ifTrue: [ ^ v1 y ]
|
||||
].
|
||||
(aPrice < ((v1:=(table first)) x)) ifTrue: [ ^ v1 y ].
|
||||
(aPrice >= ((v1:=(table last)) x)) ifTrue: [ ^ v1 y ]
|
||||
]
|
||||
].
|
||||
|
||||
|pr|
|
||||
pr := PriceRescale
|
||||
new: { 0.00@0.10 .
|
||||
0.06@0.18 .
|
||||
0.11@0.26 .
|
||||
0.16@0.32 .
|
||||
0.21@0.38 .
|
||||
0.26@0.44 .
|
||||
0.31@0.50 .
|
||||
0.36@0.54 .
|
||||
0.41@0.58 .
|
||||
0.46@0.62 .
|
||||
0.51@0.66 .
|
||||
0.56@0.70 .
|
||||
0.61@0.74 .
|
||||
0.66@0.78 .
|
||||
0.71@0.82 .
|
||||
0.76@0.86 .
|
||||
0.81@0.90 .
|
||||
0.86@0.94 .
|
||||
0.91@0.98 .
|
||||
0.96@1.00 .
|
||||
1.01@1.00
|
||||
}.
|
||||
|
||||
"get a price"
|
||||
(pr rescale: ( (Random between: 0 and: 100)/100 )) displayNl.
|
||||
23
Task/Price-fraction/Tcl/price-fraction-1.tcl
Normal file
23
Task/Price-fraction/Tcl/price-fraction-1.tcl
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
# Used once to turn the table into a "nice" form
|
||||
proc parseTable table {
|
||||
set map {}
|
||||
set LINE_RE {^ *>= *([0-9.]+) *< *([0-9.]+) *:= *([0-9.]+) *$}
|
||||
foreach line [split $table \n] {
|
||||
if {[string trim $line] eq ""} continue
|
||||
if {[regexp $LINE_RE $line -> min max target]} {
|
||||
lappend map $min $max $target
|
||||
} else {
|
||||
error "invalid table format: $line"
|
||||
}
|
||||
}
|
||||
return $map
|
||||
}
|
||||
|
||||
# How to apply the "nice" table to a particular value
|
||||
proc priceFraction {map value} {
|
||||
foreach {minimum maximum target} $map {
|
||||
if {$value >= $minimum && $value < $maximum} {return $target}
|
||||
}
|
||||
# Failed to map; return the input
|
||||
return $value
|
||||
}
|
||||
29
Task/Price-fraction/Tcl/price-fraction-2.tcl
Normal file
29
Task/Price-fraction/Tcl/price-fraction-2.tcl
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
# Make the mapping
|
||||
set inputTable {
|
||||
>= 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
|
||||
}
|
||||
set map [parseTable $inputTable]
|
||||
|
||||
# Apply the mapping to some inputs (from the Oz example)
|
||||
foreach example {.7388727 .8593103 .826687 .3444635 .0491907} {
|
||||
puts "$example -> [priceFraction $map $example]"
|
||||
}
|
||||
6
Task/Price-fraction/Ursala/price-fraction-1.ursala
Normal file
6
Task/Price-fraction/Ursala/price-fraction-1.ursala
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
#import flo
|
||||
|
||||
le = <0.06,.11,.16,.21,.26,.31,.36,.41,.46,.51,.56,.61,.66,.71,.76,.81,.86,.91,.96,1.01>
|
||||
out = <0.10,.18,.26,.32,.38,.44,.50,.54,.58,.62,.66,.70,.74,.78,.82,.86,.90,.94,.98,1.>
|
||||
|
||||
price_fraction = fleq@rlPlX*|rhr\~&p(le,out)
|
||||
3
Task/Price-fraction/Ursala/price-fraction-2.ursala
Normal file
3
Task/Price-fraction/Ursala/price-fraction-2.ursala
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#cast %eL
|
||||
|
||||
test = price_fraction* <0.34,0.070145,0.06,0.05,0.50214,0.56,1.,0.99,0.>
|
||||
33
Task/Price-fraction/XPL0/price-fraction.xpl0
Normal file
33
Task/Price-fraction/XPL0/price-fraction.xpl0
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
include c:\cxpl\codes; \intrinsic 'code' declarations
|
||||
|
||||
func real Price(V); \Convert to standard value
|
||||
real V;
|
||||
[V:= V + 0.001; \avoids possible rounding error i.e. 0.059999999
|
||||
case of
|
||||
V < 0.06: ret 0.10;
|
||||
V < 0.11: ret 0.18;
|
||||
V < 0.16: ret 0.26;
|
||||
V < 0.21: ret 0.32;
|
||||
V < 0.26: ret 0.38;
|
||||
V < 0.31: ret 0.44;
|
||||
V < 0.36: ret 0.50;
|
||||
V < 0.41: ret 0.54;
|
||||
V < 0.46: ret 0.58;
|
||||
V < 0.51: ret 0.62;
|
||||
V < 0.56: ret 0.66;
|
||||
V < 0.61: ret 0.70;
|
||||
V < 0.66: ret 0.74;
|
||||
V < 0.71: ret 0.78;
|
||||
V < 0.76: ret 0.82;
|
||||
V < 0.81: ret 0.86;
|
||||
V < 0.86: ret 0.90;
|
||||
V < 0.91: ret 0.94;
|
||||
V < 0.96: ret 0.98
|
||||
other ret 1.00;
|
||||
];
|
||||
|
||||
[Format(1,2);
|
||||
RlOut(0, Price(0.0599)); CrLf(0);
|
||||
RlOut(0, Price(0.10)); CrLf(0);
|
||||
RlOut(0, Price(1.0)); CrLf(0);
|
||||
]
|
||||
Loading…
Add table
Add a link
Reference in a new issue