近似整数与相邻因子的比例


11

如果1不算作因素,则

  • 40有两个相邻因素(4和5)
  • 1092有两个相邻因素(13和14)
  • 350没有两个相邻因子(在因子2、5、7、10、14、25、35、50、70和175中,没有两个是连续的)

具有此属性的正整数比例是可以被6(2×3),12(3×4),20(4×5),30、56…中的任何一个整除的比例。如果我们仅计算可被前n个因子整除的比例,则得到的近似值随着n的增加而变得更加准确。

例如,对于n = 1,我们找到被2×3 = 6整除的整数比例,即1/6。对于n = 2,所有可被3×4 = 12整除的整数也可被6整除,因此近似值仍为1/6。对于n = 3,可被6或20整除的整数比例为1/5,依此类推。

以下是前几个值:

1  1/6                0.16666666666666666
3  1/5                0.20000000000000000
6  22/105             0.20952380952380953
9  491/2310           0.21255411255411255
12 2153/10010         0.21508491508491510
15 36887/170170       0.21676558735382265
21 65563/301070       0.21776663234463747
24 853883/3913910     0.21816623274423785
27 24796879/113503390 0.21846817967287144

对于介于提供的值之间的n值,输出应与上述值的输出相同(例如n = 5 →1/5)。

您的程序应采用n并输出小数或十进制答案。您可以在任何偏移量处取n(例如,在此序列中使用0索引或2索引,而不是1索引)。

对于十进制输出,对于给定的所有测试用例,您的程序必须至少精确到5位数字。

得分是码时间最短。

受启发于什么比例的正整数具有两个相差1的因子?马蒂·科恩(Marty Cohen)讲,特别是由丹(Dan)的回答。


1
小数答案的准确度如何?一种自然的策略似乎是在一个很大的范围内对具有有效除数的整数进行计数,然后除以范围的长度,范围越大,近似值越好。
xnor

@xnor我现在在帖子中解决了这个问题。
Doorknob

Answers:


6

果冻 14 13  10 字节

-1使用Outgolfer的想法Erik取零和一的列表的平均值。
-3通过使用3索引(在问题允许的范围内)-感谢Dennis指出了这一点。

ḊPƝḍⱮ!Ẹ€Æm

接受整数的单子链接n+2,产生浮点数。

[2ñ+2]

(开始时为+2µḊPƝḍⱮ!§T,$Ẉ,取n并屈服[numerator, denominator],未还原)

怎么样?

ḊPƝḍⱮ!Ẹ€Æm - Link: integer, x=n+2
Ḋ          - dequeue (implicit range of) x  - i.e. [2,3,4,...,n+2]
  Ɲ        - apply to neighbours:
 P         -   product                             [2×3,3×4,...,(n+1)×(n+2)]
     !     - factorial of x                        x!
    Ɱ      - map across (implicit range of) x! with:
   ḍ       -   divides?                            [[2×3ḍ1,3×4ḍ1,...,(n+1)×(n+2)ḍ1],[2×3ḍ2,3×4ḍ2,...,(n+1)×(n+2)ḍ2],...,[2×3ḍ(x!),3×4ḍ(x!),...,(n+1)×(n+2)ḍ(x!)]]
       €   - for each:
      Ẹ    -   any?  (1 if divisible by any of the neighbour products else 0)
        Æm - mean

嗯...我怀疑是什么使它比我的短一些,!而不是æl/...啊,规则的乐趣在睡觉时改变了。
暴民埃里克(Erik the Outgolfer)

@EriktheOutgolfer是的,当我仔细观察时,方法非常相似!你可以P用来降低到13岁吗?
乔纳森·艾伦

代替Ẹ€?恐怕P与相同׃1$,因此将无法使用。(无论如何,那将是14 ...)如果不是æl/,也许(毕竟P LCM * k)。
Erik the Outgolfer

@EriktheOutgolfer而不是æl/
Jonathan Allan

是的,我想我可以做到,而且理论上讲,结果与æl/我猜想的一样精确。(夜鹰打高尔夫球确实有问题...)编辑:是的,尽管我不得不将对TIO的争论减少到4...:P
Outgolfer的Erik,18年

3

05AB1E,15 个字节

Ì©!Lε®LüP¦Öà}ÅA

@JonathanAllan的Jelly答案端口,因此也非常慢。

在线尝试验证前三个测试用例

说明:

Ì                 # Add 2 to the (implicit) input
                  #  i.e. 3 → 5
 ©                # Store this in the register (without popping)
  !               # Take the factorial of it
                  #  i.e. 5 → 120
   L              # Create a list in the range [1, (input+2)!]
                  #   i.e. 120 → [1,2,3,...,118,119,120]
    ε       }     #  Map over each value in this list
     ®            #  Push the input+2 from the register
      L           #  Create a list in the range [1, input+2]
                  #   i.e. 5 → [1,2,3,4,5]
       ü          #  Take each pair
                  #    i.e. [1,2,3,4,5] → [[1,2],[2,3],[3,4],[4,5]]
        P         #   And take the product of that pair
                  #    i.e. [[1,2],[2,3],[3,4],[4,5]] → [2,6,12,20]
         ¦        #  Then remove the first value from this product-pair list
                  #   i.e. [2,6,12,20] → [6,12,20]
          Ö       #  Check for each product-pair if it divides the current map-value
                  #  (1 if truthy; 0 if falsey)
                  #   i.e. [1,2,3,...,118,119,120] and [6,12,20]
                  #    → [[0,0,0],[0,0,0],[0,0,0],...,[0,0,0],[0,0,0],[1,1,1]]
           à      #  And check if it's truthy for any by taking the maximum
                  #   i.e. [[0,0,0],[0,0,0],[0,0,0],...,[0,0,0],[0,0,0],[1,1,1]]
                  #    → [0,0,0,...,0,0,1]
             ÅA   # After the map, take the mean (and output implicitly)
                  #  i.e. [0,0,0,...,0,0,1] → 0.2

3

JavaScript(ES6), 94 92  90字节

@Shaggy节省了2个字节+那里还有2个字节

返回十进制近似值。

n=>(x=2,g=a=>n--?g([...a,x*++x]):[...Array(1e6)].map((_,k)=>n+=a.some(d=>k%d<1))&&n/1e6)``

在线尝试!


JavaScript(ES6),131个字节

[ñüË[R一种ŤØ[RdËñØ一世ñ一种ŤØ[R]

f=(n,a=[],p=x=1)=>n?f(n-1,[...a,q=++x*-~x],p*q/(g=(a,b)=>a?g(b%a,a):b)(p,q)):[...Array(p)].map((_,k)=>n+=a.some(d=>-~k%d<1))&&[n,p]

在线尝试!



理论上应该可以工作82个字节。
毛茸茸的

@Shaggy我真的不知道这样的答案是什么共识。尽管它在理论上确实起作用,但在任何输入中实际上都无法起作用。(我个人不喜欢这种答案。这就是为什么当我怀疑会得到诸如“仅适用于for n = 1 on TIO“ ...或在目前情况下根本不起作用。)
Arnauld

我个人是无限时间和记忆共识的忠实
支持者

哦,我也喜欢。:)我唯一的保留意见是,我认为应该至少可以测试几个不同输入的答案。
Arnauld


2

木炭,26字节

FN⊞υ×⁺²ι⁺³ιI∕LΦΠυ¬⌊Eυ﹪ιλΠυ

在线尝试!链接是详细版本的代码。效率极低(O(n!²)),因此只能n=4在TIO上使用。说明:

FN⊞υ×⁺²ι⁺³ι

输入n并计算n邻近因素的第一乘积。

I∕LΦΠυ¬⌊Eυ﹪ιλΠυ

取所有这些因素的乘积,然后使用该乘积计算至少具有那些因素之一的数字的比例。

低30字节的慢速版本只有O(n!),因此可以n=6在TIO上完成:

F⊕N⊞υ⁺²ιI∕LΦΠυΣEυ∧μ¬﹪ι×λ§υ⊖μΠυ

在线尝试!链接是详细版本的代码。

46字节的较快版本只有O(lcm(1..n + 2)),因此可以n=10在TIO上完成:

FN⊞υ×⁺²ι⁺³ι≔⁰η≔⁰ζW∨¬η⌈Eυ﹪ηκ«≦⊕η≧⁺⌈Eυ¬﹪ηκζ»I∕ζη

在线尝试!链接是详细版本的代码。

45字节的更快版本只有O(2ⁿ),因此可以n=13在TIO上完成:

⊞υ±¹FEN×⁺²ι⁺³ιF⮌υ⊞υ±÷×ικ⌈Φ⊕ι∧λ¬∨﹪ιλ﹪κλIΣ∕¹✂υ¹

在线尝试!链接是详细版本的代码。

54字节最快的版本使用更有效的LCM,因此可以n=18在TIO上完成:

⊞υ±¹FEN×⁺²ι⁺³ιFEυ⟦κι⟧«W⊟κ⊞⊞Oκλ﹪§κ±²λ⊞υ±÷Π…κ²⊟κ»IΣ∕¹✂υ¹

在线尝试!链接是详细版本的代码。


2

Wolfram语言(Mathematica)69 68 61 52字节

Count[Range[#!],b_/;Or@@(# #-#&@Range[3,#]∣b)]/#!&

在线尝试!

3分索引。起初我要使用,LCM@@但意识到那#!会更短...但是现在它有很多内存供Range[#!]...

设法将条件降低了2个字节,这很好。


较旧的数值解决方案(56个字节):

N@Count[Range[5^8],b_/;Or@@Array[(# #-#)∣b&,#,3]]/5^8&

在线尝试!

2分索引。当#!>5^8#>9,假设#是整数)时效率更高。


1

Python 2,78个字节

lambda n:sum(any(-~i%(j*-~j)<1for j in range(2,n+2))for i in range(10**7))/1e7

在线尝试!

返回大约十进制的+5位数字;使用xnor在问题评论中建议的朴素暴力手段。

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.