反复互惠


11

您需要做的是创建一个将小数作为输入的函数/程序,并输出重复取数字小数部分的倒数的结果,直到数字变成整数。

更具体地说,过程如下:

  1. 令x为输入

  2. 如果x是整数,则将其输出。

  3. 否则:X1个F[R一种CX。回到2。

F[R一种CX是的小数成分X,并且等于X-XX是x的地板上,这是最大的整数小于X

测试用例:

0 = 0
0.1 = 1/10 -> 10
0.2 = 1/5 -> 5
0.3 = 3/10 -> 10/3 -> 1/3 -> 3
0.4 = 2/5 -> 5/2 -> 1/2 -> 2
0.5 = 1/2 -> 2
0.6 = 3/5 -> 5/3 -> 2/3 -> 3/2 -> 1/2 -> 2
0.7 = 7/10 -> 10/7 -> 3/7 -> 7/3 -> 1/3 -> 3
0.8 = 4/5 -> 5/4 -> 1/4 -> 4
0.9 = 9/10 -> 10/9 -> 1/9 -> 9
1 = 1
3.14 = 157/50 -> 7/50 -> 50/7 -> 1/7 -> 7
6.28 = 157/25 -> 7/25 -> 25/7 -> 4/7 -> 7/4 -> 3/4 -> 4/3 -> 1/3 -> 3

以0.1为增量的0到1的摘要:0、10、5、3、2、2、2、2、3、4、9、1

这是,因此最少的字节获胜。

说明:

  • “奖励积分”,无舍入错误
  • 应该适用于任何非负有理数(忽略舍入误差)
  • 您可以,但不必输出已采取的步骤
  • 您可以将输入作为小数,小数或数字对,可以是字符串。

对不起,所有问题,这是我在本网站上的第一个问题。


该终止的事实与以连续分数表示小数的可能性密切相关。
Leaky Nun

4
我们是否期望输出浮点数?它们引起一些精度问题。
Leaky Nun

7
您能详细说明一下该过程吗?我不确定“小数部分的倒数”是什么,并且测试用例也无济于事
Ad Hoc Garf Hunter

4
我们可以将两个整数用作表示有理数的输入吗?
Leaky Nun

1
这等于输入的简单连续部分的最后一个元素。
isaacg

Answers:


5

J,18个字节

%@(-<.)^:(~:<.)^:_

在J中,成语的u ^: v ^:_意思是“ u在条件v返回true 时继续应用动词。

在我们的例子中,结束条件由hook定义~:<.,这意味着“数字的底数<.不等于~:数字本身”-因此,当主动词u返回int 时,我们将停止。

u在这种情况下是另一个钩子-<.-数字减去它的底线-它的返回值被输入到@倒数动词中%

在线尝试!


也为18,但由于公差可能具有一些浮点误差:_2{(%@-<.) ::]^:a:
科尔

%@|~&1^:(~:<.)^:_
FrownyFrog

5

Python 3,101字节

lambda s:g(int(s.replace(".","")),10**s[::-1].index("."))
g=lambda a,b:a and(b%a and g(b%a,a)or b//a)

在线尝试!

格式:字符串必须包含小数点。


.replace(".","")-> .replace(*"._")保存1个字节
tsh

5

Mathematica,36个字节

Last@*ContinuedFraction@*Rationalize

演示版

In[1]:= f = Last@*ContinuedFraction@*Rationalize

Out[1]= Last @* ContinuedFraction @* Rationalize

In[2]:= f[0]

Out[2]= 0

In[3]:= f[0.1]

Out[3]= 10

In[4]:= f[0.2]

Out[4]= 5

In[5]:= f[0.3]

Out[5]= 3

In[6]:= f[0.4]

Out[6]= 2

In[7]:= f[0.5]

Out[7]= 2

In[8]:= f[0.6]

Out[8]= 2

In[9]:= f[0.7]

Out[9]= 3

In[10]:= f[0.8]

Out[10]= 4

In[11]:= f[0.9]

Out[11]= 9

In[12]:= f[1]

Out[12]= 1

没有会发生什么Rationalize
格雷格·马丁

1
@GregMartin如果不使用Rationalize,Mathematica认为没有足够的精度来生成连续分数的所有项。例如,ContinuedFraction[0.1]is {0}
Anders Kaseorg '17

4

Perl 6,42个字节

{($_,{1/($_-.floor)}...*.nude[1]==1)[*-1]}

在线尝试!

nude方法返回NU merator和有理数的提名作为两个元素的列表。用这种方法获得分母要比denominator直接调用该方法要短。


4

哈斯克尔,47个字节

这超越了Wheat Wizard的答案,因为它GHC.Real允许我们使用:%,以及较短的名称对有理模式进行匹配

import GHC.Real
f(x:%1)=x
f x=f$1/(x-floor x%1)

在线尝试!

f需要一个Rational数字作为输入,虽然GHC允许它们在十进制格式写入,有一定的精度内。


4

哈斯克尔 40 34字节

编辑:

  • -6个字节:@WheatWizard指出小数可以作为两个单独的参数给出。

(在看到Haskell的详细输入答案后,我忍不住发布了此消息-现在,我看到一些其他语言的答案也基本上都在使用此方法。)

!接受两个整数参数(分数的分子和分母;它们不必用最小的项,但分母必须为正)并返回一个整数。呼叫为314!100

n!d|m<-mod n d,m>0=d!m|0<1=div n d

在线尝试!

  • 忽略类型不匹配,的小数部分n/d(假设d正)是mod n d/d,因此,除非mod n d==0!用的表示递归d/mod n d


@WheatWizard嗯,我将“ pair”解释为必须是一对,而不是两个不同的参数。我想这是一个以Haskell为中心的解释。
与Orjan约翰森

3

Python 3 + sympy,67字节

from sympy import*
k=Rational(input())
while k%1:k=1/(k%1)
print(k)

在线尝试!

Sympy是Python的符号数学包。因为它是符号性的而不是二进制的,所以没有浮点数错误。




2

JavaScript ES6,25个字节

f=(a,b)=>a%b?f(b,a%b):a/b

打电话f(a,b)a/b


如果gcd(a,b)=1可以移除/b
l4m2 '18年


1

APL(Dyalog Classic),18字节

{1e¯9>t1|⍵:⍵⋄∇÷t}

在线尝试!

APL NARS,18个字符

-1字节,通过Uriel测试

f←{1e¯9>t1|⍵:⍵⋄∇÷t}
v0 .1 .2 .3 .4 .5 .6 .7 .8 .9 1 3.14
⎕←vf¨v
  0 0  0.1 10  0.2 5  0.3 3  0.4 2  0.5 2  0.6 2  0.7 3  0.8 4  0.9 9  1 1  3.14 7 

⍵-⌊⍵1|⍵一字节
Uriel '18

@Uriel谢谢...所以字节就是J解决方案
RosLuP



0

JavaScript,70个字节

x=>(y=(x+'').slice(2),p=(a,b)=>b?a%b?p(b,a%b):a/b:0,p(10**y.length,y))

如果我们可以将输入类型更改为字符串,则可以节省5个字节。


这不会对数字> = 10工作
长毛

@Shaggy是否需要支持数字> 1?
tsh

是的,它应该适用于任何有理数(忽略舍入误差)。
所罗门·乌科
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.