将重复的小数转换为分数


23

这个问题不必仅适用于终止小数-重复的小数也可以通过算法转换为分数。

您的任务是制作一个程序,该程序将重复的小数作为输入,并输出产生该小数扩展的相应分子和分母(以最低的条款)。大于1的分数应表示为不正确的分数,例如9/5。您可以假设输入为正。

重复的小数将以以下格式给出:

5.3.87

重复第二个点之后的所有内容,如下所示:

5.3878787878787...

您的程序将输出两个代表分子和分母的整数,并用斜杠分隔(如果不输出纯文本,则为您语言的等效形式):

889/165

请注意,终止小数点在第二个点之后将没有任何内容,而没有非重复小数部分的小数点将在两个点之间没有任何内容。

测试用例

这些测试用例涵盖了所有必需的极端情况:

0..3 = 1/3
0.0.3 = 1/30
0.00.3 = 1/300
0.6875. = 11/16
1.8. = 9/5
2.. = 2/1
5..09 = 56/11
0.1.6 = 1/6
2..142857 = 15/7
0.01041.6 = 1/96
0.2.283950617 = 37/162
0.000000.1 = 1/9000000
0..9 = 1/1
0.0.9 = 1/10
0.24.9 = 1/4

如果您愿意,还可以假设没有整数部分的分数在第一个点的左侧没有任何内容。您可以使用以下可选测试用例进行测试:

.25. = 1/4
.1.6 = 1/6
..09 = 1/11
.. = 0/1

1
是否有必要简化分数?还是将其保留为简化形式(例如:)是否合理9/99
贾斯汀

3
(in lowest terms)即分数必须简化。
Joe Z. 2014年

2
我可以13代替输出13/1吗?
mniip 2014年

4
确保处理此输入1.9999...和输出2/1
Thomas Eding 2014年

3
@ThomasEding 1.9999.19999/10000,为了2/1您的需要1..9,不是吗?
Qwertiy 2014年

Answers:


8

Dyalog APL(75 73 69 68个字符)

这是另一次和第五次尝试(很可能是我的最后一次尝试);我花了整整一天的时间来尝试编写一些少于80个字符且完全符合规则的代码。这个挑战让我很开心!

最后,我得到了由75个字符组成的APL行,它与Dyalog APL一起使用(但由于使用了 execute函数,因此不在联机解释器页面上),如下所示:

(N,D)÷D∨N←(⍎'0',1↓I/⍨2=+\P)+(⍎'0',I/⍨2>+\P)×D←D+0=D←⍎'0',⌽2↓⍕¯1+10⊥P←'.'=I← '1.2.3'

当然,我可以使它更短一些,但是在特殊情况下,缺少一,二或三个字段。我的代码甚至可以处理..输入的情况。

我知道APL很难阅读,而且由于人们喜欢理解一段代码的实际工作原理,因此这里有一些解释。基本上,我计算变量D的最终分母和变量N的最终分子。

APL是从右到左解析的。

  • 首先,字符串存储在变量I(I←)中。
  • 然后,将其映射到指示点在哪里的布尔向量,该向量称为P(P←'.'=)。例如,“ 1.2.3”将映射到0 1 0 1 0。
  • 此向量是以10为底的数字(10⊥);现在“ 1.2.3”是1010。
  • 然后从该数字中减去1(使用1-⍨¯1+,在这里我选择了第二个)。现在“ 1.2.3”是1009。
  • 然后,该数字将转换为字符串(),删除两个初始数字(2↓),这从我们的初始“ 1.2.3”示例中得出09;字符串反转()。
  • 在这里,作为一种特殊情况,我在字符串前面添加了一个初始0字符;这让我伤心使用四个字符'0',,但我这样做是为了避免一个错误,当第二和三分之二的字段都为空。字符串将转换回数字(),并将其存储在分母D中,除非最后两个字段均为空,因为在这种情况下D等于0。
  • 如果D←D+0=代码段当前为空,则将D设置为1,现在D包含分母(但是在GCD除法之前)。
  • 该分母乘以(×)与初始字符串I的内容直到第二个点,第二个点(⍎'0',I/⍨2>+\P)又从P再次开始(在我的示例中为0 1 0 1 0),通过对连续数字求和(使0 1 1 2在我的示例中为2),检查哪些值小于2(使布尔矢量1 1 1 0 0),并在I中采用相应的字符;在字符串前面添加另一个0以防止另一个陷阱(如果两个初始字段为空),则将整个整数转换为数字。
  • 输入字符串的最后一部分用添加到的前一个乘积中(⍎'0',1↓I/⍨2=+\P),再取P,再次进行累加,检查哪些值等于2(请参见前面的说明),取字符,除去第一个为点的字符,添加一个防止开头的0字符并转换为数字。
  • 该乘积后加和的结果存储在分子中的N中。
  • 最终,用D∨N计算GCD,两个数字均被该GCD除。

编辑:这是73个字符的修复程序:

(N,D)÷D∨N←(⍎'0',1↓P/I)+(⍎'0',I/⍨~P←2=+\P)×D←D+0=D←⍎'0',⌽2↓⍕¯1+10⊥P←'.'=I←

这种破解的思想是首先计算累积加法的值等于2的情况,将其存储以供以后使用,然后反转此按位掩码以获得第一种情况。因此,计算下一种情况需要较少的字符。

编辑:这是69个字符的另一个修复程序:

(N,D)÷D∨N←(⍎'0',1↓P/I)+(⍎'0',I/⍨~P←2=+\P)×D←⍎'1⌈0',⌽2↓⍕¯1+10⊥P←'.'=I←

破解的想法是将最复杂的特殊情况作为APL代码嵌入到要评估的字符串中(在字符串到数字的转换阶段)。

编辑:这是68个字符的另一个修复程序:

(N,D)÷D∨N←(⍎'0',1↓P/I)+(⍎'0',I/⍨~P←2=+\P)×D←⍎'1⌈0',⌽3↓⍕1-10⊥P←'.'=I←

本hack的想法是,以取代添加-1的值用于由操作从其减去1为该值该值从其减去1,然后在开始时除去后一个字符多种(其将是负号)。

编辑:外观变化:

(N,D)÷D∨N←(⍎'0',1↓P/I)+(⍎'0',I/⍨~P←2=+\P)×D←1⌈⍎'0',⌽3↓⍕1-10⊥P←'.'=I←

大小没有改善,但更满意地从要评估的代码中获得最大功能。


我试图用tryapl.org运行它,但它抱怨INVALID TOKEN。你知道为什么吗?
彼得·泰勒

@Peter Taylor:是的,甚至在我的留言中也有说过。这是因为我使用了“执行”运算符,该运算符对于Dyalog服务器是不安全的,并且已在线禁用(安全模式)。您必须在Dyalog APL的安装版本上尝试。
Thomas Baruchel 2014年

啊,真可惜 我不会花60欧元来测试偶尔的PCG提交。我找到了一个替代的在线APL测试仪,但是您的代码中似乎有些Dyalog特定的东西,因为它会给出排名错误或长度错误。
彼得·泰勒

@彼得·泰勒; 否;-)请通过GNU APL使用我自己的网站(仍处于试验性,而非官方);但我必须添加两个字符以使其兼容(括号内是一个I):参见此固定链接
Thomas Baruchel 2014年

15

Perl 6(93 101 100 80 68 66字节)

$/=split ".",get;say ($0+($1+$2/(9 x$2.comb||1))/10**$1.comb).nude

大小增加了,无法处理任何事情,而不仅仅是失败。Mouq建议使用$/,因此现在正在使用,代码短了20个字节。Ayiko提议将/,所以代码更短(12个字节)。然后Mouq提议将charscomb(在数值上下文,它们是相同的,因为转化成数字后的字符列表的字符的数量)。

样本输出:

$ perl6 script.p6
5.3.87
889 165
$ perl6 script.p6
2.0.0
2 1
$ perl6 script.p6
0..3
1 3
$ perl6 script.p6
0.0.3
1 30
$ perl6 script.p6
0.0.0
0 1
$ perl6 script.p6
0.1.6
1 6
$ perl6 script.p6
0.01041.6
1 96
$ perl6 script.p6
0.2.283950617
37 162
$ perl6 script.p6
123.456.789
41111111 333000

不幸的是,事实证明在两个点之间使用零作为占位符是不行的。0..09返回1/11,但0.0.09返回1/110
Joe Z. 2014年

@JoeZ。哦好的。我更新了代码以处理没有键入任何内容的情况。
Konrad Borowski

我不知道Perl 6,但是我猜对了,如果给定'abc',您的程序使用精确的有理数算法来计算c / 99 ... 9,而仅使用浮点数来计算ab吗?在这种情况下,如果b有很多数字,它将给出错误的答案。
奥马尔2014年

@OmarAntolín-Camarena:不完全是。在Perl 6中,默认值是有理数,而不是浮点数。例如,0.1 + 0.2 == 0.3在Perl 6
康拉德博罗夫斯基

2
高尔夫球至80个字符:$/=split ".",get;say join "/",($0+($1+$2/(9 x chars $2 or 1))/10**$1.chars).nude:)
Mouq 2014年

6

J(85 90 89个字符)

我的原始函数比第二个短5个字符,但有几个错误:它没有将整数输出为“ n / 1”,并且对十二位数左右的数字给出了错误的答案。这是J中的更正函数,还结合了Eelvex的建议来保存字符:

f=:3 :0
'a t'=.|:(".@('0','x',~]),10x^#);._1'.',y
(,'/'&,)&":/(,%+.)&1+/a%*/\1,0 1-~}.t
)

它接收一个字符串并返回一个字符串。这是一个示例会话:

   f '..'
0/1
   f '0.0.0'
0/1
   f '3..'
3/1
   f '..052631578947368421'
1/19
   f '0.2.283950617'
37/162
   f '.0.103092783505154639175257731958762886597938144329896907216494845360824742268041237113402061855670'
1/97

您应该将函数固定为输出0/13/1inf前两个测试用例,请参
见此

我将输出的整数固定为5个字符,即@mniip。
奥马尔

使用('0','x',~])并保存一个字节。
Eelvex

5

C,171

相当长。可以进一步减少。不scanf,如果点之间没有任何数字,那真的无法处理。没有strtol。只是数字运算:

a,b,c,d,q;main(){while((q=getchar()-48)>-3)q<0?(d=b>0,b+=!b):d?(c=c*10+q,d*=10):(a=a*10+q,b*=10);for(a=a*--d+c,q=b*=d;q>1;a%q+b%q?--q:(a/=q,b/=q));printf("%d/%d\n",a,b);}

测试:

rfc <<< "2..142857"
15/7

5

DC(不完全通用,缩短为76个字符)

并不是很全面,但是请考虑一下我是用世界上最古老的东西之一做的:

5.3.87 dsaX10r^d1-rla*sasbdscX10r^dlc*rlb*rlb*la+snsdlnld[dSarLa%d0<a]dsax+dldr/rlnr/f

编辑:我编辑我的解决方案;它不是更通用,但更短:

sadsbX10r^sclaX10r^dd1-dsdlblc**rla*+dsnrld*dsd[dSarLa%d0<a]dsax+dldr/rlnr/f

用作:

5.3.87 sadsbX10r^sclaX10r^dd1-dsdlblc**rla*+dsnrld*dsd[dSarLa%d0<a]dsax+dldr/rlnr/f
  • 不需要第一个字段:

    .1.3 sadsbX10r^sclaX10r^dd1-dsdlblc**rla*+dsnrld*dsd[dSarLa%d0<a]dsax+dldr/rlnr/f
    

    还可以

  • 第二和口渴字段至少需要一位数字


5

JavaScript 203

太长了,但仍然很有趣。换行符,因为分号不可读。

s=prompt(b=1).split(".")
P=Math.pow
a=s[0]
c=s[1]
d=P(10,l=c.length)
f=(P(10,s[2].length)-1)*P(10,l)||1
e=s[2]=+s[2]
a=d*a+b*c;b*=d
a=f*a+b*e;b*=f
function g(a,b){return b?g(b,a%b):a}g=g(a,b);a/g+"/"+b/g

889/NaN跑步时得到5.3.87...我做错什么了吗?
rafaelcastrocouto 2014年

我不知道...如果我只是将此代码粘贴到Safari控制台中(Firefox或Chrome也应该这样做),请按Enter键并输入“ 5.3.87”,我就进入"889/165"了控制台。你好吗?@rafaelcastrocouto
tomsmeding

没关系...我想我做错了什么,因为它现在正在工作...
rafaelcastrocouto 2014年

1
您可以通过在b=1内部移动零件来保存1个字符prompt()
user2428118 2014年

1
f=(P(10,s[2].length)-1)*P(10,l),f=f?f:1=>f=(P(10,s[2].length)-1)*P(10,l)||1
f.ardelian

3

J(不同的方法)

基于完全不同的方法的另一种解决方案;这次完全笼统了;提交整数时,唯一缺少的是1分母:

   ".((({.~(i.&1)),'+'"_,((":@(10&^)@#,'%~',])@}.@#~~:/\),'+%',((,~(##'9'"_),'%x:0'"_)@}.@#~2:=+/\@]))(=&'.')) '.1.3'
2r15
   ".((({.~(i.&1)),'+'"_,((":@(10&^)@#,'%~',])@}.@#~~:/\),'+%',((,~(##'9'"_),'%x:0'"_)@}.@#~2:=+/\@]))(=&'.')) '.1.'
1r10
   ".((({.~(i.&1)),'+'"_,((":@(10&^)@#,'%~',])@}.@#~~:/\),'+%',((,~(##'9'"_),'%x:0'"_)@}.@#~2:=+/\@]))(=&'.')) '1..'
1
   ".((({.~(i.&1)),'+'"_,((":@(10&^)@#,'%~',])@}.@#~~:/\),'+%',((,~(##'9'"_),'%x:0'"_)@}.@#~2:=+/\@]))(=&'.')) '1..3'
4r3

3

GolfScript(67个字符)

`{'.'/1$=.10\,?@-).!+0@+~}+3,/1$4$*]-1%~;*+*+].~{.@\%.}do;{/}+/'/'@

注意:这支持空整数部分。

如果字符串为格式,'n.p.q'则该值是n + p/E + q/(DE) = ((nD + p)E + q)/DEwhere D = 10^(len p)E = 10^(len q) - 1除非是 when len q = 0,在这种情况下E = 1(以避免除以0)。

解剖:

           # Stack: 'n.p.q'
`{         # Combined with the }+ below this pulls the value into the block
           # Stack: idx 'n.p.q'
    '.'/   # Stack: idx ['n' 'p' 'q']
    1$=    # Stack: idx str   (where str is the indexed element of ['n' 'p' 'q'])
    .10\,? # Stack: idx str 10^(len str)
    @-)    # Stack: str 10^(len str)-idx+1
           #   If idx = 0 we don't care about the top value on the stack
           #   If idx = 1 we compute D = 10^(len 'p')
           #   If idx = 2 we compute E' = 10^(len 'q') - 1
    .!+    # Handle the special case E'=0; note that D is never 0
    0@+~   # Stack: 10^(len str)-idx+1 eval('0'+str) (GolfScript doesn't treat 011 as octal)
}+         # See above
3,/        # Run the block for idx = 0, 1, 2
           # Stack: _ n D p E q
1$4$*      # Stack: _ n D p E q D*E
]-1%~;     # Stack: D*E q E p D n
*+*+       # Stack: D*E q+E*(p+D*n)
].~        # Stack: [denom' num'] denom' num'
{.@\%.}do; # Stack: [denom' num'] gcd
{/}+/      # Stack: denom num
'/'@       # Stack: num '/' denom

在线演示,它使用每个测试输入模拟一次运行程序。


我尝试了一下,但它似乎并没有遵循所有规则:“请注意,终止小数点在第二个点之后将没有任何内容,而没有非重复小数部分的小数点将在两个点之间没有任何内容。” 我不能让输入工作代码的工作0.1.
托马斯巴吕谢尔

-1。注意到您获得+300分后,我再次尝试了该方法。这是不公平的,因为其他解决方案已尽力遵循所有规则,而您显然还没有做到。
Thomas Baruchel 2014年

@ברוכאל,我反对您断言我没有尝试遵守规则。可选测试用例的位置使我感到困惑,以为最后一块包含了所有必需的用例。事实证明我错了,为了避免其他人犯同样的错误,我将很快编辑问题。现在,我更新了代码以处理以前未处理的极端情况,并更新了指向测试的链接以证明这一点。
彼得·泰勒

没关系。您可能值得300分。这是CodeGolf的新手,这300点对我来说是一个具有挑战性的目标,但我仍然感到失望,因为我仍然认为在截止日期之前我的代码是最短的时间,无法完全符合规则,所以我没有得到它们。无论如何,我一生都在争取积分。问候。
Thomas Baruchel 2014年

@ברוכאל:我想获得500点的奖励(是的,我很慷慨,不是我可以少给点)赏金,并给你这些点,但是我想已经有赏金开始了。好吧,随便 我想知道这笔赏金何时结束,谁能得到这些积分。
Konrad Borowski 2014年

2

蟒蛇

没有图书馆-156个字符

_=lambda a,b:b and _(b,a%b)or a;a,b,c=raw_input().split('.');d,e=int(a+b+c)-bool(c)*int(a+b),
(10**len(c)-bool(c))*10**len(b);f=_(d,e);print'%i/%i'%(d/f,e/f)

使用fractions-127个字符

from fractions import*;a,b,c=raw_input().split('.');print Fraction(int(a+b+c)-bool(c)*int(a+b
),(10**len(c)-bool(c))*10**len(b))

fractions版本打印诸如“ Fraction(7,5)”之类的内容,而不是“ 7/5”,不是吗?
奥马尔2014年

不会的 顺便说一句,我没有让头一个工作。_=lambda a,b:b and _(b,a%b)or a;a,b,c=raw_input().split('.');d,e=int(a+b+c)-bool(c)*int(a+b), ValueError: need more than 1 value to unpack

@OmarAntolín-卡马雷纳据我所知,print使用str时可用,没有repr。这是我的输出:puu.sh/7w64w.png
Oberon

@tomsmeding两者都在同一行;添加了换行符以使它们适合答案。_=lambda a,b:b and _(b,a%b)or a;a,b,c=raw_input().split('.');d,e=int(a+b+c)-bool(c)*int(a+b),(10**len(c)-bool(c))*10**len(b);f=_(d,e);print'%i/%i'%(d/f,e/f)应该合而为一。
Oberon 2014年

哦,对了,@ Oberon,您可能会猜到我不在我的电脑旁并且无法运行代码。
奥马尔2014年

2

Mathematica,143

与往常一样,Mathematica提供了许多高级功能来完成这项工作,但给它们起了冗长的名称。

x=StringTake;c=ToExpression;p=s~StringPosition~".";{o,t}=First/@p;u=StringLength@s-t;d=t-o-1;Rationalize@(c@x[s,t-1]+c@x[s,-u]/((10^u)-1)/10^d)

样本输出将在以后有时间时添加。


在我看来,这似乎将整数输出为n而不是n / 1。那正确吗?(我的解决方案具有相同的错误... :()
2014年

啊,现在我明白了。。。一个奇怪的要求...如果每隔一个分数减少一次,为什么不允许n/1减少到n?稍后,我将添加额外的〜50个字节以转换整数。
Jonathan Van Matre 2014年

您的方法很好。我的利用了,FromDigits所以我决定也发布它。
DavidC

2

红宝石-112

x,y,z=gets.chop.split".";y||='0';z||='0';puts((y.to_i+Rational(z.to_i,10**z.length-1))/10**y.length+x.to_i).to_s

这是我对红宝石的第一个实验,请随时提出改进建议。

$ ruby20 % <<< '5.3.87'
889/165
$ ruby20 % <<< '0..3'
1/3
$ ruby20 % <<< '0.0.3'
1/30
$ ruby20 % <<< '0.00.3'
1/300
$ ruby20 % <<< '0.6875.0'
11/16
$ ruby20 % <<< '1.8.0'
9/5
$ ruby20 % <<< '2..'
2/1
$ ruby20 % <<< '..'
0/1

删除支持“ ..”和“ .1.2”表示您不遵循规范,对吗?(我也希望删除它们。)
Omar 2014年

规范说,@OmarAntolín-Camarena If you wish。我不希望,所以我不支持没有第一或第三组数字的分数。但是,我支持缺少第二组数字的分数,这与规范相符。
mniip 2014年

@minip,您误读了规范:它没有说“如果您希望可以支持..和.1.2”,而是说:“如果您希望,可以假设0 ..和0.1.2始终为..和.1.2“。
奥马尔2014年

@OmarAntolín-Camarena点了。编辑。
mniip 2014年

2

C 164

即使我从头开始,它也类似于猎户座的C解决方案。但是,我承认窃取了他的许多优化。它不是很短,但是可以处理.25。= 1/4和0.000000.1 = 1/9000000。

long a,b,c,d,e;main(){while((c=getchar()-48)>-3)c+2?a=a*10+c,b*=10:b?e=a,d=b:(b=1);
b>d?a-=e,b-=d:0;for(d=2;d<=a;)a%d+b%d?d++:(a/=d,b/=d);printf("%ld/%ld\n",a,b);}

2

不使用库的两个python答案。First处理first之前的可选输入而没有数字。是162个字符

_=lambda a,b:b and _(b,a%b)or a;i,t,r=raw_input().split(".");b=r!="";d=(10**len(r)-b)*10**len(t);n=int((i+t+r)or 0)-b*int((i+t)or 0);f=_(d,n);print "%i/%i"%(n,d)

第二个字符在第一个数字之前不会处理任何内容,但会正确处理所有必需的输入,并且为150个字符

_=lambda a,b:b and _(b,a%b)or a;i,t,r=raw_input().split(".");b=r!="";d=(10**len(r)-b)*10**len(t);n=int(i+t+r)-b*int(i+t);f=_(d,n);print "%i/%i"%(n,d)

2

哈斯克尔

import Data.Ratio
f n=case s '.' n of
    [x,y,z]->(r x)%1+(r y)%(10^(length y))+(r z)%((10^t-1)*(10^(length y)))
        where
            r ""=0
            r n=read n
            t = if length z==0 then 9 else length z
s _ []=[[]]
s n (x:xs) | x==n = []:(s n xs)
           | otherwise = let (l:ls)=s n xs in (x:l):ls

嘿,这是代码高尔夫球,您甚至都没有尝试!
mniip 2014年

@mniip我不擅长打高尔夫球。我至少使用了单字符变量名称。
PyRulez 2014年

1
您从未指定语言或使用的字符/字节总数。
贾斯汀·菲2014年

2
使用{;}可以节省缩进的空间,span以实现s,为函数添加简短的别名,并尽可能删除空间。import Data.Ratio v=span(/='.');w=tail;l=length;f n=(r x)%1+(r y)%p+(r z)%((10^t-1)*p)where{(x,b)=v n;(y,d)=v(w b);z=w d;p=10^(l y);r""=0;r n=read n;t=if null z then 9 else l z}Trueotherwisenull zlength z==0
-178

2

的JavaScript(EcmaScript的6)180 175

G=(a,d)=>d?G(d,a%d):a;P=a=>+("1e"+a);L=a=>a.length;f=prompt().split(".");B=P(L(b=f[1]));D=P(L(b)+L(c=f[2]))-P(L(b))||1;alert((m=(f[0]+b||0)*D+B*(c||0))/(g=G(m,n=B*D))+"/"+n/g)

虽然不是300赏金的明显赢家...这是我能想到的最短的奖赏:

  • 与先前版本的更改:对逻辑进行了一些细微改动,并通过将Power P函数更改为+("1e"+a)而不是Math.pow(10,a)由此节省了更多字符来更改Power 函数...

1

Mathematica 175

f@i_:=
If[IntegerQ[g=FromDigits[Map[IntegerDigits@ToExpression@#&,StringSplit[i,"."]/.""-> {}]
/.{a_,b_,c_}:> {{Sequence@@Join[a,b],c},Length@a}]],HoldForm[Evaluate@g]/HoldForm@1,g]

大部分例程用于按摩输入。大约50个字符用于处理整数。


例子

f["7801.098.765"]

frac1

更多示例:

TableForm[
 Partition[{#, f[#]} & /@ {"19..87", "19.3.87", "5.3.87", "0.0.3", "0..3", "0.2.283950617", 
"123.456.789", "6666.7777.8888", "2.0.0","0.0.0"}, 5], TableSpacing -> {5, 5}]

frac2


在Mathematica中通常如何完成

FromDigits可以直接从重复的十进制小数中获得分数,只要输入形式特殊。整数显示为整数。

z={{{1, 9, {8, 7}}, 2}, {{1, 9, 3, {8, 7}}, 2}, {{5, 3, {8, 7}}, 1}, {{{3}}, -1}, {{{3}}, 0}, 
{{2, {2, 8, 3, 9, 5, 0, 6, 1, 7}}, 0}, {{1, 2, 3, 4, 5, 6, {7, 8, 9}}, 3}, 
{{6, 6, 6, 6, 7, 7, 7, 7, {8}}, 4}, {{2}, 1}, {{0}, 1}}

FromDigits/@z

ž


您的输出格式错误,太漂亮了。
奥马尔2014年

奇怪的是,这是在Mathematica中表达分数的默认格式。要将这种格式更改为更简单的格式,将需要几个字符。
DavidC 2014年

1

J(96个字符)

我不使用斜杠符号作为分隔符(但是Mathematica中的解决方案也没有,因为它使用了更好的图形表示形式)。在J语言中,分数显示r/

   (((-.@]#[)((".@[%#@[(10x&^)@-{.@])+({.@](10x&^)@-#@[)*<:@{:@](".%<:@(10x&^)@#)@}.[)I.@])(=&'.')) '1..3'
4r3
   (((-.@]#[)((".@[%#@[(10x&^)@-{.@])+({.@](10x&^)@-#@[)*<:@{:@](".%<:@(10x&^)@#)@}.[)I.@])(=&'.')) '123.456.789'
41111111r333000

1

APL(不完全通用)

不完全通用(例如我的直流解决方案);可与Dyalog APL一起使用(但不能在Dyalog APL的在线版本上使用,不确定为什么):

(R,F)÷(F←D×N)∨R←(⍎C)+D×(⍎I/⍨2>+\P)×N←10*¯1++/≠\P⊣D←¯1+10*⍴C←1↓I/⍨2=+\P←'.'=I← '123.456.789'

第一个字段是可选的,但其他两个字段至少需要一个数字。


1

的JavaScript(189)

i=prompt().split(".");a=i[0];b=i[1];c=i[2];B=b.length;p=Math.pow;n=a+b+c-(a+b);d=p(10,B+c.length)-p(10,B);f=1;while(f){f=0;for(i=2;i<=n;i++)if(n%i==0&&d%i==0){n/=i;d/=i;f=1}};alert(n+"/"+d)

例:

输入:

5.3.87

输出:

889/165

1

C(写为420个字符;删除不必要的空格后较少)

注意,这里假设使用64位long(例如64位Linux);0.2.283950617在使用32位的系统上,该测试用例将失败long。可以通过将类型long long更改为并相应地更改printf格式字符串来解决某些字符的问题。

#include <stdio.h>

long d[3], n[3], i;

int main(int c, char** v)
{
  while (c = *v[1]++)
    switch(c)
    {
    case '.':
      n[++i] = 1;
      break;
    default:
      d[i] = 10 * d[i] + c - '0';
      n[i] *= 10;
    }

  n[2] -= n[2] != 1;

  while (i--)
    d[2] += d[i] * n[i+1], n[i]*=n[i+1];

  i = d[2];
  *n = n[1];

  while (i)
    *d = i, i = *n%i, *n = *d;
  printf("%ld/%ld\n", d[2]/ *n, n[1]/ *n);
}

真好 您可以通过更改'0'为删除1个字符48
托德·雷曼

我认为您也可以通过将switch语句重写为来节省更多if(c==46) n[++i]=1; else d[i]=10*d[i]+c-48,n[i]*=10;
托德·雷曼

-3

GTB,81

`_:s;_,1,l?_)-S;_,"."
s;A;,1,S;_,".")-1
s;_,1+S;_,"."),l?_)-S;_,"."))→_
x?A;+_)►Frac

?3.25.
            13/4

4
在免费提供该语言的编译器之前,我将投票否决使用该语言的所有答案。
Gareth 2014年

1
上面链接的页面上似乎有编译器?
skibrianski 2014年

@skibrianski 在meta
2014年

2
@Gareth,还有一些Mathematica答案供您投票。:P
Omar

2
@OmarAntolín-CamarenaMathematica有一个编译器/解释器。GTB没有。GTB如果您不相信我,请点击上面的链接。您将获得专有程序的一些压缩内容,然后搜索该程序,并发现声称提供下载的站点说该站点不可用。那么我们如何编译呢?
Gareth 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.