最小未使用数量共享一个因素


11

这是工厂问题的一个很好的解决方案。我将定义一个序列,然后您浏览一些代码以输出给定索引的条目。

  • 序列中的第一项是2。

  • 序列中的第n个项目是除n和1以外的最小正整数,与n共享至少一个因子(除1之外),该因子尚未出现在列表中。

测试用例

以下是序列中的前25个项目:

1  2
2  4
3  6
4  8
5  10
6  3
7  14
8  12
9  15
10 5
11 22
12 9
13 26
14 7
15 18
16 20
17 34
18 16
19 38
20 24
21 27
22 11
23 46
24 21
25 30

相关(抵消一)OEIS

Answers:



3

Python 3中118个 117字节

-1字节感谢Cameron Aavik

import math
def f(n,i=3):
 if n<2:return 2
 while 1:
  if math.gcd(n,i)>1>(i in map(f,range(n)))<i!=n:return i
  i+=1

在线尝试!

该代码效率很低(它会强制使用先前结果中不存在的值,并针对每个新值再次计算先前结果),因此它可以正常工作,但我不建议大量运行它。


2
小提示:您可以通过换行def f(n,i=3):并删除该i=3行来保存换行符
Cameron Aavik


2

Haskell60 59字节

编辑:

  • -1个字节:@xnor指出all(/=x)比短x`notElem`

f 接受一个整数并返回一个整数。

f n=[x|x<-[2..],gcd x n>1||n<2,all(/=x)$n:map f[1..n-1]]!!0

在线尝试!

这是非常指数的时间,所以TIO在21点之后超时,而我解释的GHCi在我现在停止之前已上升到22点。存储在列表中的以下9字节长版本很容易增加到数千个:

f n=[x|x<-[2..],gcd x n>1||n<2,all(/=x)$n:take(n-1)l]!!0
l=f<$>[1..]

在线尝试!

  • f n使用列表推导产生候选词x,并取得第一个通过的候选词!!0
  • gcd x n>1检查xn具有共同因素。
  • ||n<2免除n==1因子要求。
  • all(/=x)$n:map f[1..n-1]检查x既不是n也不是前一个序列元素。

@WheatWizard嗯,在这种情况下可能没什么区别。只是默认情况下习惯这样做。它是为数不多的具有固定性的字母数字函数之一,该固定性被定义为可以很好地适应这种情况。
与Orjan约翰森

1
all(/=x)$那里短了1
xnor

2

C#中没有内置的GCD,因此...

C#(.NET Core)197196194字节

n=>{if(n<2)return 2;var p=new int[n-1];int i=0,a,b;for(;i<n-1;)p[i]=f(++i);for(i=2;;i++)if(n!=i){for(a=n,b=i;a*b>0;)if(a>b)a%=b;else b%=a;if(b!=1&a!=1&!System.Array.Exists(p,e=>e==i))return i;}}

在线尝试!

再次避免使用此代码按顺序计算n>30...

  • 通过将GCD while循环更改为一个for循环来获得-1字节。
  • -2个字节感谢Kevin Cruijssen!好东西!

1
a>0&b>0可以打高尔夫球a*b>0
凯文·克鲁伊森

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.