Work out change
Mathematica: 110 chars
Sort[IntegerPartitions[Rationalize@#,Infinity,{10,5,2,1,1/2,1/4,1/10,5/100,1/100}],
Length@#1<Length@#2&][[1]]&
Usage
%[0.98]
{1/100, 1/100, 1/100, 1/10, 1/10, 1/4, 1/2}
Or
Tally@Sort[IntegerPartitions[Rationalize@#,Infinity,
{10,5,2,1,1/2,1/4,1/10,5/100,1/100}],
Length@#1<Length@#2&][[1]]&
(6 chars more) gives
{{1/100, 3}, {1/10, 2}, {1/4, 1}, {1/2, 1}}
For other denominations, just change the rationals table {10,....,5/100,1/100}
Windows PowerShell, 108 111 117
Very first attempt, ungolfed so far:
$i=+("$input"-replace'[^\d.]')
$args|%{0d+$_}|sort -des|%{$a=[math]::floor($i/$_)
if($a){$i-=$a*$_
"$a×$_"}}
Implementation notes:
- Accepts the quantity to return via the pipeline
- Accepts the list of currency denominations via the command-line
- The quantity can be given with a currency sign; that will be stripped (in fact, anything non-numeric).
- The list of denominations does not need to be sorted.
- The program will output the largest change smaller than the requested quantity achievable with the given denominations, i.e. 1.5 for 1.53 if the 1-cent coin is missing.
If 3 and 4 do not need to be satisfied (i.e. I control the input format ;-)), then the following program suffices (71):
$i=+"$input"
$args|%{$a=[math]::floor($i/$_)
if($a){$i-=$a*$_
"$a×$_"}}
D: 225 Characters
import std.algorithm,std.conv,std.stdio;void main(string[]args){auto m=args[1].findSplit(".");void p(T,S)(T t,T u,S s){foreach(v;[u,10,5,1]){writefln("%s %s%s",t/v,v,s);t-=(t/v)*v;}}p(to!int(m[0]),20,"");p(to!int(m[2]),25,"/100");}
More Legibly:
import std.algorithm,std.conv,std.stdio;
void main(string[] a)
{
auto m = a[1].findSplit(".");
void p(T, S)(T t, T u, S s)
{
foreach(v; [u, 10, 5, 1])
{
writefln("%s %s%s", t / v, v, s);
t -= (t / v) * v;
}
}
p(to!int(m[0]), 20, "");
p(to!int(m[2]), 25, "/100");
}
Only handles US currency. Takes the value as a floating point value on the command line (must have the leading 0 for values under 1 dollar). Does not accept $ as part of value. Outputs the number of each type of bill/coin on a separate line. E.g. an input of 1.53 results in:
0 20
0 10
0 5
1 1
2 25/100
0 10/100
0 5/100
3 1/100