和谐的“融合”


16

变调和级数是一个著名的收敛级数。

1/1-1/2 + 1/3-1/4 + 1/5-1/6 + ...

“很明显”,很明显它收敛到2的自然对数。或者是吗?

由于该系列不是绝对收敛的,只需简单地重新排列术语,我就可以使其接近我想要的任何形式。假设我希望级数收敛到e。我所要做的就是:

1/1 + 1/3 + ... + 1/65-1/2 + 1/67 + ... + 1/175-1/4

如果您不了解这一模式,那么没有一个显而易见的模式。运作方式如下:

  1. 从正项和负项考虑交变谐波序列的项。
  2. 正好相加就足以超过我们的目标(e)。(又名sum > target
  3. 减去下一个负项。
  4. 回到2。

请注意,在步骤2中,如果是我们的sum == target,则应添加另一个正项。

由此我们可以定义一个与每个数字关联的序列,如下所示:

  • 遵循上述算法
  • 对于每个正项,输出1。
  • 对于每个负项,输出0。

我们将此序列称为数字的“和谐位模式”。例如,e的HBP开始于:

1, 1, 1, 1, <32 times>, 0, 1, 1, <54 times>, 0, 1, 1, ...

您的挑战:

您将获得:

  • [-10,10]范围内的合理输入目标(请注意:即使通过谐波序列达到10,也需要数百万个项)。这可以是小数(aka 1.1),也可以直接采用有理数(aka 12/100
  • 一个正的int n输入,指定要输出的和谐位模式的项数。

您应该将目标的确切和谐比特模式输出到指定数量的术语。您可以输出以空格分隔的值,逗号分隔,不分隔等。只要0和1的模式清晰可见,并以一致的间隔从左到右读取。

测试用例

>>> 0, 1
1
>>> 0, 2
10
>>> 0, 7
1000010
>>> 1, 10
1101011011
>>> 1.01, 3
110
>>> 1.01, 24
110101101101101101101101
>>> 2.71, 32
11111111111111111111111111111111
>>> 2.71, 144
111111111111111111111111111111110111111111111111111111111111111111111111111111111111111101111111111111111111111111111111111111111111111111111111
>>> -9.8, 100
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

请注意,由于-9.8太大,因此1将输出的第一个在149496620第n个词的某处(通过浮点数计算,因此该值可能不准确)。

Answers:


3

Perl,69个字节

use bigrat;$s+=.5/($s>$ARGV[$_=0]?-++$n:++$p-++$_/2),print for 1..pop

将输入作为命令行参数。

说明bigrat各处均启用分数以进行精确计算。$s是当前项的和,$ARGV[0]是目标值,pop(与相同$ARGV[1])表示项数,$p并且$n表示正项和负项计数。$_10取决于是否添加了正项或负项。


3

Haskell,92 91 90字节

import Data.Ratio
f=(.h 0 1 2).take
h a p q z|a>z=0:h(a-1%q)p(q+2)z|1<2=1:h(a+1%p)(p+2)q z

用法示例:f 24 1.01-> [1,1,0,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1]

h通过携带四个参数来构建无限位模式:a是当前和。pq负数下一个正数的分母。z是目标号码。f开始一切并截断结果n

编辑:@Zgarb找到了要保存的字节。谢谢!


定义h a p q而不是h p q a保存一个字节。
Zgarb 2015年

应当注意,仅将无限结果列表修​​整为长度n之一就花费了7个字节。仅给出无限列表作为结果实际上会更好。
停止旋转逆时针

1

Python 3中,128个 124字节

from fractions import*
F=Fraction
*c,s=2,1,0
t=F(input())
for i in'x'*int(input()):w=s<=t;s+=F(w*2-1,c[w]);c[w]+=2;print(+w)

这利用了Python的Fraction类。

from fractions import* 
F=Fraction
*c,s=2,1,0                # c = [2, 1]. s = 0
                          # c is my positive/negative term counter, s is the sum
t=F(input())              # input a fraction
for i in'x'*int(input()): # Do this for for the chosen number of terms, as per the spec
  w=s<=t;                 # "w" or which one do we choose? Positive or negative?
  s+=F(w*2-1,c[w]);       # w*2-1 gives 1 if w else -1. Gives 1 if we need to add, else -1
  c[w]+=2;                # Increment the coefficient we chose
  print(+w)               # Output that. The +w coerces the bool to an int.

1
'x'*int(input())
FryAmTheEggman 2015年
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.