最小的正整数,与前两个倒数互为质数并且尚未出现;a(1)= 1,a(2)= 2


10

定义

  • 如果两个整数除以外没有其他正数除数,则它们是互质1
  • a(1) = 1
  • a(2) = 2
  • a(n)是integer的最小正整数,它是和的互质数,a(n-1)并且a(n-2)尚未出现n >= 3

任务

  • 给定正整数n,输出/打印a(n)

  • a(11) = 6因为6它与最后两个前任(即1113)互质,并且6从未出现过。

笔记

  • 请注意,顺序不是递增的,这意味着元素可以小于其前身。

眼镜

  • 必须使用1索引。

测试用例

n      a(n)
1      1
2      2
3      3
4      5
5      4
6      7
7      9
8      8
9      11
10     13
11     6
12     17
13     19
14     10
15     21
16     23
17     16
18     15
19     29
20     14
100    139
1000   1355
10000  13387
100000 133361

计分

  • 由于coprime意味着两个数字仅共享一个除数(1),并且1是一个小数字,因此就字节数而言,您的代码应尽可能小。

参考文献


4
短代码的那些“原因” ...
路易斯·门多

1
我不知道为什么这被否决了。当然不是因为可怕的理由吗?
科纳·奥布莱恩

@Conor不是我。其实我赞成。我希望人们会把理由和我的评论当成笑话
Luis Mendo

3
这些关于代码高尔夫的“有趣”理由的问题是,我需要阅读一个跨越四行的坏笑话,以发现这是标准代码高尔夫。它只是无缘无故地掩盖了挑战的规则。
马丁·恩德

1
@ ConorO'Brien并非所有的浏览器都总是显示标题(然后是移动应用程序),并且除了使用标签外,我们通常还会在帖子中描述得分,因为对于新手而言,仅标签并不意味着任何意义到站点。尽管我熟悉我们的挑战类型的标签,我从来不看他们想出一个挑战是如何打进,但试图找到在挑战身体。该标签用于标签Wiki中的分类,可搜索性和质询类型特定信息。
马丁·恩德

Answers:


5

蟒3.5,160个 141 126 124 121 109字节

这是序列定义的简单实现。欢迎打高尔夫球。

编辑: -17字节感谢泄漏尼姑。-9个字节感谢Peter Taylor。-6字节归功于Sp3000并切换到Python 3.5。

import math;f=lambda n,r=[2,1],c=3:n<2and r[1]or(c in r)+math.gcd(c,r[0]*r[1])<2and f(n-1,[c]+r)or f(n,r,c+1)

开球:

import math
def f(n, r=[2,1], c=3):
    if n<2:
        return r[1]
    elif (c in r) + math.gcd(c,r[0]*r[1]) < 2:
        return f(n-1, [c]+r)
    else:
        return f(n, r, c+1)

对于Python 3.5及更高版本,import math那么g=math.gcd应该比定义自己的短g。对于3.5之前的版本,您可以from fractions import*针对gcd
Sp3000

如果c=3在循环内部进行初始化,则只需执行一次。根据我的计算,您节省了3个字符。
彼得·泰勒

从相反的方向构建数组还节省了2个字符:您必须使用r=[c]+r而不是+=,但是三个负索引变为正数。然后,将其重写为lambda可以节省2个字符,尽管这是一个相当大的改变:from fractions import*;F=lambda n,r=[2,1],c=3:n<2and r[1]or(c in r)+gcd(r[0]*r[1],c)<2and F(n-1,[c]+r)or F(n,r,c+1)并且不需要a,print因为它不再是一个完整的程序。
彼得·泰勒

2

MATL28 27字节

2:i:"`@ym1MTF_)Zdqa+}@h]]G)

代码很慢,但是给出正确的结果。

在线尝试!验证前十个案例

对代码进行少量修改即可生成序列图:

2:i:"`@ym1MTF_)Zdqa+}@h]]G:)XG

将其视为ASCII艺术作品,或在离线编译器中以图形输出形式查看:

在此处输入图片说明

在此处输入图片说明

说明

2:         % Push [1 2] to initiallize the sequence
i:         % Input n. Push [1 2 ... n]
"          % For loop: repeat n times
  `        %   Do while loop
    @      %     Push iteration index, starting at 1. This is the candidate number
           %     to extend the sequence
    y      %     Duplicate vector containing the sequence so far
    m      %     Is member? Gives true if the candidate is in the sequence
    1M     %     Push candidate and vector again
    TF_)   %     Get last two elements of the vector
    Zd     %     GCD between the candidate and those two elements. Produces a
           %     two-element vector
    qa     %     True if any of the two results exceeds 1, meaning
           %     the candidate is not coprime with the latest two sequence values
    +      %     Add. This corresponds to logical "or" of the two conditions, namely
           %     whether the candidate is member of the sequence so far, and
           %     whether it is not coprime with the latest two. In either case
           %     the do...while must continue with a next iteration, to try a new
           %     candidate. Else the loop is exited, and the current candidate
           %     is the new value of the sequence
  }        %   Finally (execute when the loop is exited)
    @h     %     Push current candidate and concatenate to the sequence vector
  ]        %   End do...while
]          % End for
G)         % Get n-th value of the sequence. Implicitly display

1

C,185个字节

G(a,b){return a%b?G(b,a%b):b;}
i,j,k;f(n){int a[n+2];for(i=0;i++<n;){a[i]=i<3?i:0;for(j=2;!a[i];++j){for(k=i;--k;){if(a[k]==j)++j,k=i;}a[G(a[i-1],j)*G(a[i-2],j)<2?i:0]=j;}}return a[n];}

1

实际上38 37 35 33 31 30个字节

这是函数定义的简单实现。欢迎打高尔夫球。在线尝试!

编辑: -3字节感谢泄漏尼姑。

2R#╗,;`1";2±╜tπg@╜í+Y"£╓╖`nD╜E

开球:

2R#╗    Push [1,2] and store it in register 0
,;      Take input and duplicate
`1      Start function, push 1
  "       Start string
  ;       Duplicate i
  2±╜t    Push (list in register 0)[-2:]
  πg      gcd(i, product of list[-2:])
  @╜í     Rotate the gcd and bring up i, check for i in list (0-based, -1 if not found)
  +Y      Add the gcd and the index, negate (1 if coprime and not found in list, else 0)
  "£      End string, turn into a function
╓       Push first (1) values where f(x) is truthy, starting with f(0)
╖`      Append result to the list in register 0, end function
n       Run function (input) times
D╜E     Return (final list)[n-1]

1
大量的堆栈操作
Leaky Nun

0

Haskell,81 73字节

c l@(m:n:_)=m:c([x|x<-[1..],gcd(m*n)x<2,all(/=x)l]!!0:l)
((0:1:c[2,1])!!)

用法示例:((0:1:c[2,1])!!) 12-> 17

构建所有列表a(n),首先0修复基于1的索引1,然后再修复c[2,1]c接受参数列表的l开头,然后进行递归调用,然后在前面添加下一个适合的数字(同素数,之前未见)l。选择n此列表的第th个元素。


0

R,141个字节

 f=Vectorize(function(n)ifelse(n>3,{c=3;a=f(n-1);b=f(n-2);d=f(4:n-3);while(!c%%which(!a%%1:a)[-1]||!c%%which(!b%%1:b)[-1]||c%in%d)c=c+1;c},n))

不打高尔夫球

f=Vectorize( function(n)     #build a recursive function. Vectorize allows
    if(n>3) {                #the function to be called on vectors.
        c=3                  #Tests size. Builds some frequent variables.
        a=f(n-1)
        b=f(n-2)
        d=f(4:n-3)           #Should really golf this out, but its horribly slow.
        while(!c%%which(!a%%1:a)[-1]||!c%%which(!b%%1:b)[-1]||c%in%d)
              c=c+1          #If we are coprime and not already seen. add.
        c
     } else n)               #First three are 1,2,3.

0

Mathematica,97个 90字节

a@1=1;a@2=2;a@n_:=SelectFirst[Range[2n],GCD[a[n-1]a[n-2],#]<2&&!MemberQ[a/@Range[n-1],#]&]

根据我的推测, a(n) < 2n所有人都可以n

为了获得更快的运行速度,请a@n=在原始文件之后添加,:=以便该函数无需重新计算先前的值

感谢Sherlock9(如果是,gcd(a,b)=1节省了7个字节gcd(ab,m) = gcd(a,m)*gcd(b,m)


这不是一个猜测,因为它写在OEIS页面上ABS(a(n)-n) < n
Leaky Nun

@LeakyNun谢谢。OEIS页面直到几分钟前才停下来,我担心对于large可能存在反例n

0

Pyth,23个字节

eu+Gf&-TGq1iT*F>2G1tQ]1

测试套件

一个相当简单的实现,但是有一些不错的高尔夫技巧。

eu+Gf&-TGq1iT*F>2G1tQ]1
 u                 tQ]1    Apply the following function input - 1 times,
                           where G is the current state (List of values so far)
  +G                       Add to G
    f             1        The first number, counting up from 1
      -TG                  That has not been seen so far
     &                     And where
               >2G         The most recent two numbers
             *F            Multiplied together
           iT              Gcd with the current number being checked
         q1                Equals 1
e                          Output the final element of the list.
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.