Write a program that converts a decimal to a mixed, simplified fraction.
Sample input:
5.2
Sample output:
5 + (1/5)
The code with the shortest length in bytes wins.
Write a program that converts a decimal to a mixed, simplified fraction.
Sample input:
5.2
Sample output:
5 + (1/5)
The code with the shortest length in bytes wins.
y=gets.to_r;puts"#{y.to_i} + (#{y-y.to_i})"
Pretty straightforward.
'.'/~'+'\.~.@,10\?.@{.@\%.}do;:d/\d/'/'@
Requires no line terminator in the input. Can probably be golfed further.
Executed from a TI-84 calculator
i`A:floor(A)→B:A-B→A:d`Bd`A►Frac
No cigar this time. Numerator
, Denominator
and Rationalize
are big words.
f@x_:=(Row@{⌊#⌋,"+",Numerator@#~Mod~(d=Denominator@#)/d})&[Rationalize@x]
Example
f[23.872]
OK, this isn't the shortest. But the proper way to convert decimals to fractions is to use continued fractions.
#include <stdio.h>
#include <string.h>
#include <math.h>
int main(int argc, char **argv) {
double f = 152/147.;
int temp, i, cf[50], n=0, d=1;
double prec = 1e-6;
memset(cf,0,sizeof(memset));
for (i=0;i<50 && prec<1;i++) {
cf[i] = f;
/* Next line assumes division by zero evaluates to inf */
f = 1/(f-cf[i]);
prec*=f;
}
for (;i>=0;i--) {
temp = n;
n = n*cf[i] + d;
d = temp;
}
if (cf[0] == 0)
printf("%d/%d\n",d,n);
else
printf("%d %d/%d\n",cf[0],d,n);
}
Does the output in right, expected format. Would be way shorter if output in invalid format would be allowed. This gets a number, converts it to rational. nude
method returns denominator and numerator (there are separate denominator
and numerator
methods, but they are crazily long.
[]
is a reduce operator which takes operator between square brackets, and in this case, I use it to shorten the code (so I wouldn't have to specify both array elements, because they are already in correct order (but if they wouldn't, there are R
operators (like R/
, R%
, Rdiv
, and Rmod
) that reverse the order of arguments for operator)). {}
in double quotes puts the result of code in string (like #{}
in Ruby).
my \
is declaration of sigilless variable. In this case it doesn't save characters, but it doesn't waste them either, so why not use it. I could have used my@
, and it would use identical number of characters.
my \n=get.Rat.nude;say "{[div] n} + ({[%] n}/{n[1]})"
Sample output (just to show the correct format):
~ $ perl6 -e 'my \n=get.Rat.nude;say "{[div] n} + ({[%] n}/{n[1]})"'
42.42
42 + (21/50)
If negative number support is needed, this would work (2 bytes more).
~ $ perl6 -e 'my \n=get.Rat.nude;say "{[div] n} + ({[mod] n}/{n[1]})"'
-42.42
-42 + (-21/50)
from fractions import*
a,b=input().split(".")
print("%s + (%s)"%(a,Fraction("."+b)))
+
should be returned (but otherwise, it's close to expected format).
\$\endgroup\$
– Konrad Borowski
Jan 3 '14 at 7:03
How about the way they tought us at grammar school?
f=function(s){
gcd=function(a,b)if(!b)a else gcd(b,a%%b)
a=strsplit(s,'\\.')[[1]]
p=10^nchar(a[2])
x=strtoi(a[2])
d=gcd(x,p);
cat(a[1]," + (",x/d,"/",p/d,")",sep="");
}
Vaguely: works for positive decimals with finite decimal fraction.
> f("23.872")
23 + (109/125)
Input must be a string matching "[0-9]+\.[0-9]+" regular expression.
Isn't pretty, but whatever
import Data.Ratio
main=let r '%'='/';r c=c in interact$(\(x,y)->show x++" + "++map r(show$approxRational y 1e-9)).properFraction.read
kind of cheating, but pressing these characters in a mathematica notebook looks it up in wolfram alpha, which gives the mixed fraction form among other information
==5.2
==1.234
etc...
1.2345 = 12345/10000
. You give me the precision & I'll give you the fraction! \$\endgroup\$ – recursion.ninja Jan 2 '14 at 21:52