计算主要差距


19

寻找素数是程序设计的一种仪式,而且经常是某人创建的第一个严肃程序(通常是审判部门)。

但是,素数已经破旧了。接下来更有趣的事情是获得质数差距:连续质数之间的迄今为止最长的差距。这些是非常稀有和“珍贵的”。前几对及其区别是:

2 3 1
3 5 2
7 11 4
23 29 6
89 97 8
113 127 14
...

我父亲过去常常手工计算出这些数据的趣味性,最高可达1万。让我们看看您能得到的代码有多短。

规则:

  • 没有内置功能可用于主要测试,主要生成或主要差距
  • 不能检索http://oeis.org/A002386或类似的东西(我可以闻到你很远的作弊者:))
  • 没有预先计算的数组
  • 继续打印,直到内部整数类型对您失败

最少的字符数获胜。+10个字符(如果仅打印不带撇号的空格)。

如果有趣的话,您也可以展示带有内置函数的版本。要有创造力。

澄清:您经历了素数,并且每次看到的差距都比以往任何时候都要大时,您都要进行报告。例如,在3到5之间,有2个单位宽的间隙。5与7之间的差距也为2,但这已经是个老新闻了,我们不再关心。只有看到新的最大差距时,才进行报告。这反映出,随着差距越来越大,素数的频率越来越低。


编辑:大多数答案都是出色的,应该得到更多的认可。但是,到目前为止,具有48个字符的GolfScript条目是最短的。


1
在您的示例中,3是一对的结束,是下一对的开始,而其他数字则不是这样。你想要什么?
mmumboss 2014年

没关系,我现在知道了。
mmumboss 2014年

您可能需要将规则重写为“没有内置函数可用于主要测试,主要计算或主要差距”。否则,显然的解决方案将使用返回第n个素数的函数,然后递增n,再次运行该函数并找出差值。
user12205 2014年

2
w 我喜欢OEIS
TheDoctor 2014年

我和@mmumboss有同样的疑问。你能请xplain吗?
克莱德·罗伯

Answers:


3

高尔夫脚本66 59 57 49 48

[2.0{:d{;\;.{).{(1$1$%}do(}do.2$-.d>!}do].p~.}do

虽然我在http://golfscript.apphb.com/上运行时遇到了麻烦(也许该网站不喜欢无限循环?),但是当我在计算机上使用golfscript.rb运行它时,它仍然可以正常工作。我对GolfScript很陌生,因此可以进一步深入研究。更新:我认为如果不以某种方式更改算法,就无法解决更多问题。

打印出的前几行(如果您不喜欢打印“”,则可以在脚本的开头添加;,但最多可以增加49个字符):

[2 3 1]
["" 3 5 2]
["" 7 11 4]
["" 23 29 6]
["" 89 97 8]
["" 113 127 14]
["" 523 541 18]
["" 887 907 20]
["" 1129 1151 22]
...

人们对它的工作方式有一个大致的了解(由于我在此版本中未使用堆栈,因此有些不同):

cur_prime = 2
next_prime = 2
gap = 0        

do {
    do {
        cur_prime = next_prime
        do {
            next_prime = next_prime + 1
            possible_factor = next_prime
            do {
                possible_factor = possible_factor - 1
            } while (next_prime % possible_factor > 0)
        } while (possible_factor != 1)
    } while (next_prime - cur_prime <= gap)

    gap = next_prime - cur_prime
    print [cur_prime next_prime gap]
} while (true)

11

Python中,121个 110 109 108 104 103字符

p,n,m=[2],3,0
while 1:
 if all(n%x for x in p):
  c=n-p[0]
  if m<c:m=c;print(p[0],n,c)
  p=[n]+p
 n+=1

第一次尝试在这里回答问题时,我希望我做对了...不确定我什至没有正确地计算出字符数。

嗯,我可以通过降级到Python 2.x来保存其他字符。


121个字符,以标题为标题#,您认真地不手工计算字符吗?javascriptkit.com/script/script2/charcount.shtml
user80551

不,我没有手工计算:)但是我已经看到其他Python的一些问题的答案以减少空格的方式展平到一行,坦率地说,我不确定换行符是1还是2个字符...
塔尔(Tal)2014年

1
除非问题的规则明确指出,否则我们将换行符视为1个字符。欢迎来到PPCG!
乔纳森·范·马特雷

3
欢迎!好的答案,它也有一些改进的空间。例如,if all(n%x>0for x in p):短一些。您还可以通过将语句移到同一行(例如a=1;b=2;f())来保存一些字符。
grc 2014年

1
最近的更改未按规定将[n]推到前面,从而破坏了代码。
Orion 2014年

4

JavaScript,90 85 78 74个字符

短代码 (Google Closure编译器-高级优化;一些手动编辑;@ MT0进行的更多编辑)

for(a=b=2,c=0;b++;)for(d=b;b%--d;)d<3&&(c<b-a&&console.log(a,b,c=b-a),a=b)

长码

var lastPrime = 2,
    curNumber = lastPrime,
    maxDistance = 0,
    i;

// check all numbers
while( curNumber++ ) {

  // check for primes
  i = curNumber;
  while( curNumber % --i != 0 ) {}

  // if prime, then i should be equal to one here
  if( i == 1 ) {

    // calc distance
    i=curNumber-lastPrime;

    // new hit
    if( maxDistance < i ) {
      maxDistance = i;
      console.log( lastPrime, curNumber, maxDistance );
    }

    // remember prime
    lastPrime = curNumber;
  }
}

输出量

2 3 1
3 5 2
7 11 4
23 29 6
89 97 8
113 127 14
523 541 18
887 907 20
1129 1151 22
1327 1361 34
9551 9587 36
15683 15727 44
19609 19661 52
31397 31469 72
...

对素数的测试效率很低,但是这样可以减少字符的使用。

首先在这里发布,所以请原谅任何错误。


78个字符-– for(a=b=2,c=0;b++;){for(d=b;b%--d;);1==d&&(c<b-a&&console.log(a,b,c=b-a),a=b)}
MT0

@ MT0谢谢。没有发现那些。编辑。
锡尔科2014年

效率更低,但只有74个字符for(a=b=2,c=0;b++;)for(d=b;b%--d;)d<3&&(c<b-a&&console.log(a,b,c=b-a),a=b)
MT0 2014年

3

数学,114 108

允许无限输出,尽管在序列中的某个点之后,风扇旋转起来,并且您开始怀疑您的CPU在玩Freecell,而它却尽力看上去很忙。

p@x_:=NestWhile[#+1&,x+1,Divisors@#≠{1,#}&];m=0;q=1;While[1<2,If[p@q-q>m,Print@{q,p@q,p@q-q};m=p@q-q];q=p@q]

输出样本(以下是它们在头30秒钟内获得的样本):

{1,2,1}
{3,5,2}
{7,11,4}
{23,29,6}
{89,97,8}
{113,127,14}
{523,541,18}
{887,907,20}
{1129,1151,22}
{1327,1361,34}
{9551,9587,36}
{15683,15727,44}
{19609,19661,52}
{31397,31469,72}
{155921,156007,86}
{360653,360749,96}
{370261,370373,112}
{492113,492227,114}
{1349533,1349651,118}
{1357201,1357333,132}
{2010733,2010881,148}

取消程式码:

p@x_ := NestWhile[
   # + 1 &,
   x + 1,
   Divisors@# ≠ {1, #} &];
m = 0;
q = 1;
While[
 1 < 2,
 If[
  p@q - q > m,
  Print@{q, p@q, p@q - q}; m = p@q - q];
 q = p@q]

能识别吗?
2014年

是的,它不会以这种方式导出,但是当您将代码粘贴到笔记本中时,它将进行解析。我已经对此进行了评分,但我将进行修改以简化操作。
Jonathan Van Matre 2014年

多少个字符,如果你使用Mathematica的内置功能首相?
2014年

76.由于整个p @ x_定义只是NextPrime的重新实现,因此可以将其替换为p = NextPrime;
Jonathan Van Matre 2014年

3

的Haskell - 122 116 114 112 110

q=[n|n<-[3..],all((>0).rem n)[2..n-1]]
d m((p,q):b)|q-p>m=print(p,q,q-p)>>d(q-p)b|q>p=d m b
main=d 0$zip(2:q)q

Will Ness窃取的(无效的)素数列表表达式。

-编辑-我不知道x|y=z|w=q会不会有效。


2

MATLAB 104 89

只需通过检查每个可能的除法来实现基本方法。

a=2;g=0;for n=3:inf;b=n*(sum(mod(n,1:n)<1)<3);h=b-a;if(h>g)g=h;[a,b,h]
end;a=max(a,b);end

输出:

  2     3     1
  3     5     2
  7    11     4
 23    29     6
 89    97     8
113   127    14
523   541    18
887   907    20

我正在进行操作octave,但此inf操作不起作用(打印被推迟到循环结束为止)。Matlab是否有惰性范围评估?
Orion

Matlab实时打印循环的每次迭代。当我启动程序时,我得到最大索引为2147483647的警告,然后它开始。另外,我可以用intmax替换inf,但这又是三个字符。
mmumboss 2014年

2

多格朗 76个字符

从我的Python版本转换而来:

g=0
i=l=2
while i+=1=>all$map(i%)(2..i)=>(i-l>g=>(g=i-l),print(l,i,g)),(l=i)

输出:

(2, 3, 1)
(3, 5, 2)
(7, 11, 4)
(23, 29, 6)
(89, 97, 8)
(113, 127, 14)
(523, 541, 18)
(887, 907, 20)
(1129, 1151, 22)
...

应该被选为优胜者!
Sarge Borsch 2014年

2

Golfscript,59 51 50字符

男人每个角色都很难失去:

0[2.{).,2>{\.@%!},{.2$-.4$>{].p~\[}{;\;}if..}or}do

输出

[2 3 1]
[3 5 2]
[7 11 4]
[23 29 6]
[89 97 8]
[113 127 14]
...

说明

设置了堆栈,因此每次迭代都从这样的堆栈开始,顶部在右侧。在[表示当前的阵列标记,当解释器遇到意],从标记到顶部的堆栈上的所有内容被放入一个数组。

g [ last | cur

g是迄今为止的最大差距。从上到下:

 command         | explanation
-----------------+----------------------------------------
 0[2.            | initialize vars g=0, last=2, cur=2
 {...}do         | loop forever...

循环内:

 )               | cur += 1
 .,2>{\.@%!},    | put all divisors of cur into a list
 {...}or         | if the list is empty, cur is prime, so
                 | the block is executed. otherwise,
                 | 'do' consumes the stack, sees it is truthy,
                 | and loops again

如何将所有除数放入列表中?让我们一步一步地做

 Command         | explanation                                  | stack
-----------------+----------------------------------------------+----------------
                 | initial stack                                | n
 .,              | make list of 0..n-1                          | n [0,1,...,n-1]
 2>              | take elements at index 2 and greater         | n [2,3,...,n-1]
 {...},          | take list off stack, then iterate through    |
                 | the list. on each iteration, put the current |
                 | element on the stack, execute the block, and |
                 | pop the top of the stack. if the top is      |
                 | true then keep the element, else drop it.    |
                 | when done, push list of all true elements    |
                 | So, for each element...                      | n x
   \.            |   Swap & dup                                 | x n n 
   @             |   Bring x around                             | n n x
   %             |   Modulo                                     | n (n%x)
   !             |   Boolean not. 0->1, else->0. Thus this is 1 |
                 |   if x divides n.                            | n (x divides n)
                 | So only the divisors of n are kept           | n [divisors of n]

如果除数为空,该怎么办?

 Command         | explanation                                  | stack
-----------------+----------------------------------------------+----------------
                 | initial stack                                | g [ last | cur
  .              | dup                                          | g [ l | c | c
  2$             | copy 3rd down                                | g [ l | c | c | l
  -              | sub. This is the current gap, cur-last       | g [ l | c | c-l
  .              | dup                                          | g [ l | c | c-l | c-l
  4$             | copy 4th down                                | g [ l | c | c-l | c-l | g
  >              | is cur gap > max gap so far?                 | g [ l | c | c-l | c-l>g
  {#1}{#2}if..   | #1 if c-l > g, #2 otherwise, and do ".." in  | ... | g [ c | c | c
                 | either situation                             | 

两条路径:是和否。如果是(请注意if消耗栈顶值):

 Command         | explanation                                  | stack
-----------------+----------------------------------------------+----------------
                 | initial stack. note that now the old `g` is  | XX [ l | c | g
                 | garbage and `c-l` is the new `g`.            |
 ]               | close the array                              | XX [l, c, g]
 .p              | duplicate it and print it, consuming the dup | XX [l, c, g]
 ~               | pump array back onto the stack. Note now the | XX | l | c | j
                 | array marker [ is gone.                      | 
 \               | swap.                                        | XX | l | g | c                         
 [               | mark the array                               | XX | l | g | c [
 .               | this is the part after the if. dups the top, | XX | l | g [ c | c
                 | but it does this in two steps, first popping | 
                 | c then putting two copies on top, so the     | 
                 | array marker moves                           | 
 .               | dup again                                    | XX | l | g [ c | c | c

如果不:

 Command         | explanation                                  | stack
-----------------+----------------------------------------------+----------------
                 | initial stack. In this case g is still the   | g [ l | c | c-l
                 | max gap so far                               | 
 ;\;             | dump top of stack, swap, and dump again      | g [ c
 ..              | the part after the if. dup twice             | g [ c | c | c

注意,无论哪种情况,我们的堆栈现在都在form中... | g [ c | c | c

现在,do总是从栈顶弹出最高值c-如果它为正数则循环。由于c总是在增加,所以总是如此,所以我们永远循环。

弹出后,堆栈的顶部是g [ c | c,这意味着最后一个已更新为c,数组标记位于同一位置,并且g仍在我们期望的位置。

这些是GolfScript复杂的操作。希望您喜欢以下内容!


1
极好的说明!
Jonathan Van Matre 2014年

1

露比110

由于以下lazy方法,仅适用于Ruby 2.0 :

(2..1.0/0).lazy.select{|n|!(2...n).any?{|m|n%m==0}}.reduce([2,0]){|(l,t),c|d=c-l;p [l,c,d]if d>t;[c,d>t ?d:t]}

输出:

[2, 3, 1]
[3, 5, 2]
[7, 11, 4]
[23, 29, 6]
[89, 97, 8]
[113, 127, 14]
[523, 541, 18]
[887, 907, 20]
[1129, 1151, 22]
[1327, 1361, 34]
[9551, 9587, 36]
[15683, 15727, 44]
[19609, 19661, 52]
[31397, 31469, 72]
[155921, 156007, 86]
[360653, 360749, 96]
[370261, 370373, 112]
[492113, 492227, 114]
...

1

Perl,105个字节

$p=2;$d=0;L:for($i=2;++$i>2;){!($i%$_)&&next L for 2..$i-1;if($i-$p>$d){$d=$i-$p;print"$p $i $d\n"}$p=$i}

取消高尔夫:

$p = 2;
$d = 0;
L: for ($i = 2; ++$i > 2; ){
    !($i % $_) && next L for 2..$i-1;
    if ($i - $p > $d) {
        $d = $i - $p;
        print "$p $i $d\n"
    }
    $p = $i
}  

该算法很简单,$p记住以前的质数。然后$i从上到下3,当类型$ i“对我失败”或由于溢出而变为负数时。$i通过检查从2到的所有除数来测试粗略的方法$i-1。如果当前差异大于先前的印刷差异,则会打印一行$d

使用更多的字节可以改善运行时间:

$p = 2;
$d = 0;
L: for ($i=3; $i > 2; $i += 2){
    for ($j=3; $j <= sqrt($i); $j += 2){
        next L if !($i%$j)
    }
    if ($i - $p > $d) {
        $d = $i - $p;
        print "$p $i $d\n"
    }
    $p = $i
}

结果的开头为:

2 3 1
3 5 2
7 11 4
23 29 6
89 97 8
113 127 14
523 541 18
887 907 20
1129 1151 22
1327 1361 34
9551 9587 36
15683 15727 44
19609 19661 52
31397 31469 72
155921 156007 86
360653 360749 96
370261 370373 112
492113 492227 114
1349533 1349651 118
1357201 1357333 132
2010733 2010881 148
4652353 4652507 154
17051707 17051887 180
20831323 20831533 210
47326693 47326913 220
...

1
这是不正确的,您需要找到一系列不断增加的差距。有关预期的输出,请参见例如Ruby或Matlab的答案。
mmumboss 2014年

1
@mmumboss:哦,我忽略了这一点。立即修复。
Heiko Oberdiek

适用于所有变量至少需要2个字符的语言。
Orion 2014年

1

Python,93 91个字符

天真的素数检查(检查是否可以被2整除n(小于到的字符n/2):

g=0;i=l=2
while 1:
 i+=1
 if all(i%x for x in range(2,i)):
    if i-l>g:g=i-l;print l,i,g
    l=i

缩进的第二级是一个制表符。

输出:

2 3 1
5 7 2
7 11 4
23 29 6
89 97 8
113 127 14
523 541 18
...

很好,我忘记了最多n只能检查的范围n-1
Claudiu 2014年

1

Bash和一些Perl用于主要正则表达式(167157143112字节)

n=2
c=2
while p=$c
do perl -e\(1x$[++n]')=~/^(11+?)\1+$/&&exit 1'&&c=$n
((c-p>g))&&g=$[c-p]&&echo $p $c $g
done

一些输出:

$./golfd.sh
2 3 1
3 5 2
7 11 4
23 29 6
89 97 8
113 127 14
523 541 18
887 907 20
1129 1151 22

使用正则表达式的NP回溯来完全规避任何循环和控制结构是完美的。但是,test抗议很多,这对我不起作用。您也可以使用let n++let f=c-p并替换test[。或者可以在(())不需要的地方$或空间进行测试。
Orion

test -n $d对于空字符串返回true。test -n "$d"很好,但是更长。但是,手册页说-n是可选的,事实证明test $d还可以。因此[ $d ]也是。g = 0必须初始化。
Orion 2014年

@orion,对不起,由于某种原因,它似乎工作,一旦现在我的机器上爆发过,我把它恢复到167,我会尝试添加您的其他一些建议
Newbrict

您的环境可能具有预定义的变量。
Orion

@orion由于某种原因您的编辑被拒绝,可以重新编辑吗?
Newbrict 2014年

1

Perl 95 90字节

for($n=$c=2;$p=$c;$c-$p>$g&&printf"$p $c %d\n",$g=$c-$p){$c=$n if(1x++$n)!~/^(11+?)\1+$/}

旧的非高尔夫版本:

$n=$c=2;
while($p=$c){
    $c=$n if (1x++$n)!~/^(11+?)\1+$/;
    if ($c-$p>$g) {$g=$c-$p;print "$p $c $g\n"}
}

这与我的其他意见类似,没有bash。


我并不烦,我只想看看这能走多远。在这里:for($n=$c=2;$p=$c;$c-$p>$g&&printf"$p $c %d\n",$g=$c-$p){$c=$n if(1x++$n)!~/^(11+?)\1+$/}
Orion

@orion对于循环滥用有些严重哈哈!
Newbrict 2014年

1

C(100)

我自己的贡献,没有特殊的算法,只是高尔夫:

i,g,r,p=2;main(){for(;r=p;p-r>g?printf("%d %d %d\n",r,p,g=p-r):0)for(i=0;i-p;)for(i=1,++p;p%++i;);}

“ +10个字符,如果您只打印不带撇号的空格。” -如果您删除的打印rp你将有更少的字符成绩奖金:)
CompuChip

完成度很漂亮:)
Orion

1

哈斯克尔(134)

打高尔夫球:

c n=null[x|x<-[2..n-1],n`mod`x==0]&&n>1
p=filter c[1..]
g l(m:n:o)
 |(n-m)>l=do print(m,n,n-m);g(n-m)(n:o)
 |True=g l(n:o)
main=g 0 p

取消高尔夫:

-- c function checks if n is a prime number
c n=null[x|x<-[2..n-1],n`mod`x==0]&&n>1

-- p is an infinite list of primes
p=filter c[1..]

-- g function prints a list of primes and differences.
--   l is the maximum difference seen so far
--   (m:n:o) is the list of unprocessed primes
g l(m:n:o)
 |(n-m)>l=do print(m,n,n-m);g(n-m)(n:o)
 |True=g l(n:o)

-- main starts the ball rolling with a default max-seen value of 0
main=g 0 p

爱那懒惰的评价!
Jonathan Van Matre 2014年

1

C:493 302 272 246

int e(int j){for(int i=2;i<j;i++)if(j%i<1)return 0;return 1;}void f(int a,int b,int c){if(e(a)&e(b))if(c<b-a){printf("%d %d %d\n",a,b,b-a);f(a+1,b+1,b-a);}else f(a+1,b+1,c);if(e(b))f(a+1,b,c);if(e(a))f(a,b+1,c);f(a+1,b+1,c);}int main(){f(2,3,0);}

我使用的是递归,而不是foror 的通常循环while

int isPrime(int num){
    for( int i=2; i<num; i++ )
        if(num%i < 0) return 0;
    return 1;
}
void fun(int n1, int n2, int gap){
   if( isPrime(n1) & isPrime(n2) ){
        if( gap < n2-n1 ){
           printf("%d %d %d\n", n1, n2, n2-n1);
           fun(n1+1, n2+1, n2-n1);
        }else{
           fun(n1+1, n2+1, gap);
        }
   }
   if( isPrime(n2) ){
       fun(n1+1, n2, gap);
   }
   if( isPrime(n1) ){
       fun(n1, n2+1, gap);
   }
   fun(n1+1, n2+1, gap);
}

int main(){
   fun(2,3,0);
}

输出:

2 3 1
3 5 2
7 11 4
23 29 6
89 97 8
113 127 14
523 541 18
887 907 20
1129 1151 22
1327 1361 34
9551 9587 36
15683 15727 44
19609 19661 52

这行不通。没有定义true / false,但是即使我们解决了,它也会报告错误的差距。例如,在25219和43237之间有很多素数。您的递归leaking位于顶部,因为您没有测试isPrime(n2),而是让质数介于n1和n2之间。这实际上无法解决,因为在不满足素数的情况下无法增加n2。
Orion

你是对的!这是错误的!从一开始我的想法是错误的。
路卡斯(Loukas)2014年

1
现在更好了.. :)
Loukas 2014年

+1现在已经解决了,我喜欢它-非常好(虽然效率不高)。你可以打很多球。跳过return主要内容。跳过最后一个else。替换&&- > &num%i==0num%i<1。而且根据古老的c标准(会有警告),您不需要为void和int函数指定返回值(它们的参数也默认为int)。
Orion 2014年

我玩了一点,用一个无条件的递归调用将其缩减为151个字符,仅使用一个类型说明符(int),并减少了主要测试功能: e(j,i){while(j%++i);return i==j;}f(a,b,c){int A=e(a,1),B=e(b,1);if(A&B&&c<b-a)printf("%d %d %d\n",a,b,c=b-a);f(a+(B|!A),b+(A|!B),c);}main(){f(2,3,0);}
Orion 2014年

1

的Oracle SQL,216 202 196 172 + 10 = 182

刚刚在问题中注意到了这一点:

最少的字符数获胜。+10个字符(如果仅打印不带撇号的空格)。

由于这是SQL,而且关键字很长,因此最好接受惩罚,并给出以下内容。与最初的想法相同。

with c as(select level+1n from dual connect by level<1e124)select lead(n)over(order by n) from(select*from c a where not exists(select*from c where n<a.n and mod(a.n,n)=0))

美化为:

with c as ( 
 select level + 1 n 
   from dual 
connect by level < 1e124
        )
select lead(n) over ( order by n ) 
  from ( select *
           from c a 
          where not exists( select * 
                              from c 
                             where n < a.n 
                               and mod(a.n, n) = 0
                                   )
                )

旧答案(196)

with c as(select level+1n from dual connect by level<1e124)select n,p,p-n from(select n,lead(n)over(order by n)p from(select*from c a where not exists(select*from c where n<a.n and mod(a.n,n)=0)))

并采用可读格式:

with c as ( 
 select level + 1 n 
   from dual 
connect by level < 1e124
        )
select n, p, p-n 
  from ( select n, lead(n) over ( order by n ) p 
           from ( select * 
                    from c a 
                   where not exists (
                                select * 
                                  from c
                                 where n < a.n 
                                   and mod(a.n, n) = 0
                                       )
                         )
                )

这将在中创建一个数字生成器c,最里面的子选择使用Eratosthenes筛子创建质数,外层计算出前一个质数,最后一个最后一个相减。

这将不会返回任何内容,因为它正在执行1 x 10 124递归查询...因此,如果您希望它将这个数字降低到合理的水平。


当谈到这样的挑战时,我认为SQL并不是图灵完备的,而是图灵固执的。
乔纳森·范·马特雷

但这 Turning-complete @Jonathan,尽管有时有时会“有趣” :-)?
2014年

知道这是图灵完备的,我的目的是开玩笑。显然错过了商标。:)无论如何,我的个人资料中有几个T-SQL答案...带上您的Oracle,让我们决斗!
乔纳森·范·马特雷2014年

0

D-153 + 10 = 163

我愿意在这里接受+10的罚款,因为字符数仍然比如果我也打印素数还要低。

Golfed

import std.stdio;bool p(int l){int n;foreach(i;1..l+1)n+=l%i==0?1:0;return n==2;}void main(){int g;foreach(l;0..int.max)if(l.p){if(g>0)(l-g).write;g=l;}}

可读版本

import std.stdio;

bool prime( int number )
{
    int divisors;

    foreach( i; 1 .. number + 1 )
        divisors += number % i == 0 ? 1 : 0;

    return divisors == 2;
}

void main()
{
    int lastPrime;

    foreach( number; 0 .. int.max )
        if( number.prime )
        {
            if( lastPrime > 0 )
                ( number - lastPrime ).write;

            lastPrime = number;
        }
}

0

JAVASCRIPT 174个字符

var p=[2],l=2,g=0;
for(var n=3;n>0;n+=2){
  var o=0;
  for(var t=0;t<p.length;++t){
    if(n/p[t] == parseInt(n/p[t])){
      o=1;
    }
  }
  if(o==0){
    p.push(n);
    if(n-l>g){
      g=n-l;
      console.log(l,n,g);
    }
    l=n;
  }
}

精简版:

var p=[2],l=2,g=0;for(var n=3;n>0;n+=2){var o=0;for(var t=0;t<p.length;++t){if(n/p[t] == parseInt(n/p[t])){o=1;}}if(o==0){p.push(n);if(n-l>g){g=n-l;console.log(l,n,g);}l=n;}}

0

Javascript 138

for(var a=2,b=0,c=0;a++;){var d;a:{for(var e=a,f=2;f<e;f++)if(0==e%f){d=!1;break a}d=!0}d&&(0!=b&&a-b>c&&(c=a-b,console.log(b,a,c)),b=a)}

将此代码复制到您的浏览器控制台。因为最大的数目会永远这样1.79*10^308

取消高尔夫:

var number = 2;
var lastPrime = 0;
var gap = 0;

while(number++)
{
    if (isPrime(number)) {
        if (lastPrime != 0) {            
            if (number - lastPrime > gap)
            {
                gap = number - lastPrime;
                console.log(lastPrime, number, gap);
            }
        }

        lastPrime = number;
    }
}

function isPrime(n){
    for (var i = 2; i < n; i++) {
        if (n % i == 0)
            return false;
    }
    return true;
}

0

C#162161个字符

151个字符+ 10个罚款字符= 161个字符

精简版:

using System;class P{static void Main(){int p=2,g=0;for(int i=3;;i++){for(int j=2;j<i;j++)if(i%j==0)goto e;if(i-p>g)Console.WriteLine(g=i-p);p=i;e:;}}}

长版:

using System;

class PrimeGaps
{
    private static void Main()
    {
        int lastPrime = 2;
        int largestGap = 0;

        for (int i = 3; true; i++)
        {
            // Prime test
            for (int j = 2; j < i; j++)
                if (i%j == 0)
                    goto nextI; // Skip to next iteration of i

            // Largest gap check
            if (i - lastPrime > largestGap)
            {
                largestGap = i - lastPrime;
                Console.WriteLine(largestGap);
            }

            // Remember last prime
            lastPrime = i;

            nextI:
                ; // Do nothing
        }
    }
}

实际上,最好接受10个字符的罚款,因为它的写作g(11个字符的罚款)比p+" "+i+" "+g(13个字符的罚款)要短。


0

Ruby 90 86 84 83个字符

r,i,g=2,2,0;while i+=1 do(2...i).all?{|j|i%j>0}&&((i-r<=g||p([r,i,g=i-r]))&&r=i)end

一些布尔短路,滥用表达评估等。


0

C 248

代码比较连续的素数a,b,然后检查空位是否大于g,然后找到下一对素数。

#include <cstdio>
void f(int* a, int* b){*a =*b;int t=1;while (*b += 2){t=1;for(int i=3;i<*b;i+=2){if(*b%i==0){t=0; break;}}if(t)break;}}
int main(){int a=2,b=3,g=0;do{(b-a>g)?printf("%d %d %d\n",a,b,(g=b-a)): f(&a,&b);} while(b>=0);return 0;}

这是C ++,不是吗?
扎卡里

0

Haskell,154 144 137 123

质数p是使用橡皮擦筛子生成的#,然后使用进行过滤和打印%

p=2:3#1
n#m|all((>0).mod n)$take m p=n:(n+1)#(m+1)|1<2=(n+1)#m
(l:u@(o:_))%k|o-l>k=print(l,o,o-l)>>u%(o-l)|1<2=u%k
main=p%0

输出看起来像

(2,3,1)
(3,5,2)
(7,11,4)
(23,29,6)
(89,97,8)

我希望可以。


0

游戏制作者语言,85

假定所有未初始化的变量为0(这是某些版本的Game Maker的默认设置)。

a=2b=2for(d=2;b++;1)for(c<b-a;b mod --d;1)d<3&&(c=b-a&&show_message_ext("",a,b,c)a=b)

0

游戏制作者语言,74 + 55 = 129

假定所有未初始化的变量为0(这是某些版本的Game Maker的默认设置)。

n=2while(n++){if p(n){if l{if n-l>g{g=n-l;show_message_ext("",l,n,g)}}l=n}

脚本p如下:

r=1a=argument0for(i=2i<a;i++){if a mod i=0r=0}return r}

0

Perl,87个字节(使用模块

use Math::Prime::Util":all";$l=2;forprimes{if($_-$l>$m){say"$l $_ ",$m=$_-$l}$l=$_}1e14

我写了模块,但是我们必须在统计中增加565,000个字符。主要是出于娱乐目的,但也提供了性能方面的选择,因为到目前为止,我还没有发现使用内建函数。到1e9的间隔为4.6s,到1e10的间隔为36s,1e11的间隔为6.5min。

Pari / GP 2.8可以基本上以相同的方式完成,尽管速度要慢2倍:

l=2;m=0;forprime(p=2,1e14,if(p-l>m,print(l," ",p," ",m=p-l));l=p)

-1

Perl 153

短代码:

$i=$a=2;while($a=$i++){if(p($i)){if($m<$m2=$i-$a){$m=$m2;print"$a $i $m$/"}}}sub p{$d=2;$s=sqrt$_[0];while(){return 0if!($_[0]%$d);return 1if$d>$s;$d++}}

易于阅读:

$i=$a=2;
while($a=$i++){
  if(p($i)){
    if($m<$m2=$i-$a){
      $m=$m2;
      print"$a $i $m$/"
    }
  }
}
sub p {
  $d=2;
  $s=sqrt$_[0];
  while(){
    return 0if!($_[0]%$d);
    return 1if$d>$s;
    $d++;
  }
}

这会输出所有差距,而不仅仅是目前为止最大的差距。
Orion 2014年
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.