我希望我的书远离这张桌子


21

故事

因此,我有一本书想与桌子分开,只剩下其他书。我想知道我需要多少本书才能达到本书的长度。n

这是我在Wolfram的朋友为我绘制的可视化效果:

Wolfram的可视化

WolframWikipedia中有关该主题的更多信息。

挑战

给定整数输入,输出顶书要与桌子水平隔开本书长度需要多少本书。在以下不等式中 找到输入的的最小整数值。 nn

mn

i=1m12一世ñ

编辑:对于分数,至少使用IEEE单精度浮点。抱歉,发布后无法编辑挑战

OEIS A014537

测试用例

 1          4
 2         31
 3        227
 5      12367
10  272400600


是否必须使用这种特殊的书籍安排,哪个IIRC并不是最佳选择?
user253751 '18

Answers:


13

八度41 40 33字节

@Dennis节省了1个字节

@(n)find(cumsum(.5./(1:9^n))>n,1)

在线尝试!

说明

这利用了谐波数可以由对数函数下限的事实。

同样,>=可以用比较代替,>因为谐波数不能是偶数(感谢@Dennis!)。

@(n)                                   % Anonymous function of n
                     1:9^n             % Range [1 2 ... 9^n]
                .5./(     )            % Divide .5 by each entry
         cumsum(           )           % Cumulative sum
                            >n         % Is each entry greater than n?
    find(                     ,1)      % Index of first true entry


10

外壳,8字节

V≥⁰∫m\İ0

在线尝试!

由于Husk尽可能使用有理数,因此没有浮点问题

说明

      İ0    The infinite list of positive even numbers
    m\      Reciprocate each
   ∫        Get the cumulative sum
V           Find the index of the first element
 ≥⁰         that is greater than or equal to the input

8个字节,但是在哪个字符集?
john16384

3
@ john16384 Husk有自己的代码页,其中每个符号对应一个字节。这是相应的hexdump
H.PWiz

5

JavaScript,30个字节

递归函数,因此它会在很早的时候消失。

f=(n,x=0)=>n>0?f(n-.5/++x,x):x

在线尝试


4

Haskell,38个字节

k!n|n<=0=0|x<-n-1/(2*k)=1+(k+1)!x
(1!)

3

迅捷,65字节

func f(n:Double){var i=0.0,s=i;while s<n{i+=1;s+=0.5/i};print(i)}

在线尝试!

不打高尔夫球

func f(n:Double) {
  var i = 0.0, s = 0.0
  while s < n {
    i += 1;
    s += 0.5 / i
  }
  print(i)
}


3

Javascript(ES6),34个字节

n=>eval("for(i=0;n>0;n-=.5/i)++i")

不打高尔夫球

n => {
    for(i = 0; n > 0; ++i)
        n -= .5 / i
    return i;
}

测试用例


使用30字节递归得出了类似的解决方案。看到您的信息后,Dunno是否发布。
粗野的

1
我可能会缺少一些东西,但是为什么需要将其包装在eval声明中?
Caird coinheringaahing

1
@cairdcoinherigaahing,没有eval所述i可变将需要return在端部编,在几个字节的成本。
粗野的


2

Haskell,71 49 48字节

f x=length.fst.span(<x).scanl(+)0$(0.5/)<$>[1..]

@BMO为我节省了多达22个字节!



2

TI-BASIC,27个字节

提示用户输入,并在终止时显示输出。注意: ⁻¹-1(反向)令牌。

Input N
1
Repeat 2N≤Σ(I⁻¹,I,1,Ans
Ans+1
End
Ans

2
如果你要保存AnsN马上,然后Input N或者Prompt N是在为您节省一个字节输入法Ans→N。并且M可以被替换Ans,从而1→M成为1M+1→M成为Ans+1。(但是我对Ans不会显示输出表示怀疑-看到 -所以可能以结尾结尾:Ans:那么该值将显示为“完成”。)
Misha Lavrov

谢谢!我知道Ans→N觉得很有趣。不错的优化。为了安全起见,还采纳了您关于输出的建议。仍然带有净-3个字节:D
kamoroso94 '18年

1

05AB1E,11个字节

XµN·zODI›}N

在线尝试!

说明

Xµ       }    # loop until counter is 1
  N·z         # push 1/(2*N)
     O        # sum the stack
      DI›     # break if the sum is greater than the input
          N   # push N


1

杰普特,12个字节

与递归选项的长度相同,但效率略高。

@T¨(Uµ½÷X}a1

试试吧


说明

@T¨(Uµ½÷X}a1
                 :Implicit input of integer U
@        }a1     :Return the first number X >=1 that returns truthy when passed through the following function
 T               :Zero
  ¨              :Greater than or equal to
    Uµ           :Decrement U by...
      ½÷X        :0.5 divided by X

1

J,22个字节

-6字节归功于frownyfrog

I.~0+/\@,1%2*1+[:i.9&^

在线尝试!

原始答案

路易斯在J中的回答:

1+]i.~[:<.[:+/\1%2*1+[:i.9&^

不打高尔夫球

1 + ] i.~ [: <. [: +/\ 1 % 2 * 1 + [: i. 9&^

最想知道它是否可以大大改善(咳嗽寻呼英里)

说明

1 +      NB. 1 plus... 
] i.~    NB. find the index of the arg in...
[: <.    NB. the floor of...
[: +/\   NB. the sumscan of...
1 %      NB. the reciprical of...
2 *      NB. two times...
1 +      NB. 1 plus...
[: i.    NB.  the integers up to 
9&^      NB. 9 raised to the power of the arg

在线尝试!


1+]i.~[:<.-> 1+]I.~->I.~0,
FrownyFrog

的!谢谢你frownyfrog
约拿

然后I.~0+/\@,
FrownyFrog

如果您进行编辑,您将击败朱莉娅:)
FrownyFrog

@FrownyFrog,完成了。如果您有时间,我希望看到您解决此问题:codegolf.stackexchange.com/questions/154345/bracket-expansion。我能想到的所有解决方案都太冗长而无法发布良心……
乔纳

0

PHP,35字节

while($argv[1]>$s+=.5/++$i);echo$i;

使用CLI运行它:

$ php -d error_reporting=0 -r 'while($argv[1]>$s+=.5/++$i);echo$i;' 5


0

Java 8,49字节

n->{float r=0,s=0;for(;s<n;)s+=.5f/++r;return r;}

说明:

在线尝试。(以上测试用例超时n=7。)

n->{             // Method with integer parameter and float return-type
  float r=0,     //  Result-float, starting at 0
        s=0;     //  Sum-float, starting at 0
  for(;s<n;)     //  Loop as long as the sum is smaller than the input
    s+=.5f/++r;  //   Increase the sum by `0.5/(r+1)`,
                 //   by first increasing `r` by 1 with `r++`
  return r;}     //  Return the result-float

0

tinylisp,98字节

(load library
(d _(q((k # N D)(i(l N(* D # 2))(_(inc k)#(+(* N k)D)(* D k))(dec k
(q((#)(_ 1 # 0 1

最后一行是一个未命名的lambda函数,该函数获取书本长度的数量并返回所需的书本数量。在线尝试!

说明

tinylisp唯一具有的数字数据类型是整数,因此我们通过跟踪分子和分母来将谐波序列计算为分数。在每一步,N是分子,D是分母,k是和索引。我们希望新的部分和为N/D + 1/k(N*k + D)/(D*k)。因此,我们使用的新分子N*K + D,的新分母D*k和的新索引递归。k+1

一旦部分总和大于或等于#所需的书本长度,则递归应停止。至此,我们已经完成了一本书了,所以我们回来了k-1。条件是1/2 * N/D < #; 将分母相乘,我们得到N < D*#*2,这是编写它的最简单的方法。

递归辅助函数_执行所有这些计算;主要功能仅仅是一个参数的包装,调用_与正确的起始值kND

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.