查找非素数


17

如果您选择接受它,那么您面临的挑战是对一个数字满足以下条件的函数进行编码,该函数将返回true或false(或者是yes和no的某种类似有意义的表示形式):

  1. 整数本身是质数或
  2. 它的任何一个相邻整数都是素数

例如:
的输入7将返回True。
输入8也会返回True。
输入15会返回False。(14、15或16都不是素数)

输入必须能够正确返回2 ^ 0到2 ^ 20之间的数字,因此无需担心符号问题或整数溢出。


我猜是32位数字溢出,而不是缓冲区溢出。
用户未知

哎呀,意思是“整数溢出”。大脑进行自动驾驶。
拉玛先生先生2012年

Answers:


11

J,17

*/<:$&q:(<:,],>:)

返回编码为流程返回码的布尔值:零表示true,非零表示false。样品使用:

   */<:$&q:(<:,],>:) 7
0
   */<:$&q:(<:,],>:) 8
0
   */<:$&q:(<:,],>:) 15
3

*/0 p:<:,],>:较短且适当的(lambda)函数为([:*/0 p:<:,],>:)
randomra

9

Haskell,47个字符

f n=any(\k->all((>0).mod k)[2..k-1])[n-1..n+1]

6

蟒蛇85 80

def f(n):g=lambda n:all(n%i!=0for i in range(2,n));return g(n)or g(n-1)or g(n+1)

第一次参加Code Golf,所以我可能缺少一些技巧。


您可以删除[]。使用生成器表达式,所有人都会非常高兴。如果您不介意代码丑陋,还可以删除0for,和)和之间的空格or
stranac 2012年

@stranac太棒了。非常感谢你。
克里斯·哈珀

3
进行了一些简单的更改,希望它仍然有效:f=lambda n:any(all(m%i for i in range(2,m))for m in[n,n-1,n+1])
Nabb 2012年

@Nabb很好。做得好。
克里斯·哈珀

5

无论如何,这都不是代码短缺的真正竞争者,但仍然提交,因为通过正则表达式确定素数在许多方面都存在扭曲!

Python(2.x),85个字符

import re
f=lambda n:any(not re.match(r"^1?$|^(11+?)\1+$","1"*x)for x in[n,n-1,n+1])

您可以通过测试“ 1” *(n + 1)来删除for循环并将其构建到regexp中,但以^ 1?1开始?代替。
霍华德

4

红宝石(55,或50作为lambda)

def f q;(q-1..q+1).any?{|n|(2..n-1).all?{|d|n%d>0}};end

或作为lambda(用于g[23]调用它)

g=->q{(q-1..q+1).any?{|n|(2..n-1).all?{|d|n%d>0}}}

咖啡脚本(53)

p=(q)->[q-1..q+1].some (n)->[2..n-1].every (d)->n%d>0

<pedantic>应该是“ proc”而不是“ lambda” </ pedantic> ;-)
门把手

3

无聊的Mathematica 35解决方案!

PrimeQ[n-1]||PrimeQ[n]||PrimeQ[n+1]

15
至少你可以打高尔夫Or@@PrimeQ/@{n-1,n,n+1}
霍华德

这不是功能。
马丁·恩德

@MartinBüttner:我不认识Mathematica,对不起。
Ry-

2
使用霍华德的版本,Or@@PrimeQ@{#-1,#,#+1}&(不需要在他的代码中使用斜线)
Martin Ender

3

C,112 82 72个字符

按照Ilmari Karonen的评论,通过删除节省了30个字符main,现在P返回true / false。还用递归和其他一些调整代替了循环。

p(n,q){return++q==n||n%q&&p(n,q);}P(n){return p(-~n,1)|p(n,1)|p(~-n,1);}

原始版本:

p(n,q,r){for(r=0,q=2;q<n;)r|=!(n%q++);return!r;}
main(int n,int**m){putchar(48|p(n=atoi(*++m))|p(n-1)|p(n+1));}

您可以用保存2个字符main(n,m)int**m;
Ilmari Karonen 2012年

...此外,挑战还说明了“代码高尔夫功能 ”。
Ilmari Karonen 2012年

3

Mathematica,24个字节

不知道为什么这个老帖子今天出现在我的列表中,但是我意识到Mathematica在这里很有竞争力。

Or@@PrimeQ/@{#-1,#,#+1}&

未命名函数采用整数参数并返回TrueFalse。直接执行。


PrimeQ线程遍历列表,因此Or@@PrimeQ@{#-1,#,#+1}&(或Or@@PrimeQ[#+{-1,0,1}]&)也适用于-1个字节。(尽管,我想我不知道PrimeQ2012
Misha Lavrov

3

Stax,6 个字节

Ç▀<╝ºΩ

运行并调试

说明(未包装):

;v:Pv<! Full program, implicit input  Example: 7
;v      Copy input and decrement               7 6
  :P    Next prime                             7 7
    v   Decrement                              7 6
     <! Check if input is >= result            1

2

JavaScript(71 73 80

n=prompt(r=0);for(j=n-2;p=j++<=n;r|=p)for(i=1;++i<j;)p=j%i?p:0;alert(r)

演示:http//jsfiddle.net/ydsxJ/3/

编辑1:更改for(i=2;i<j;i++)for(i=1;++i<j;)(谢谢@minitech)。将if语句转换为三元。移动r|=pp=1进入外for,以消除内括号。保存了7个字符。

编辑2:合并p=1j++<=np=j++<=n,节省2个字符(感谢@ugoren)。


您可以使用for(i=1;++i<j;)而不是for(i=2;i<j;i++)再保存1个字符。
2012年

1
@minitech:!j%i由于优先级而无法使用。可行的替代方法是j%i<1
Nabb 2012年

@Nabb:哇,你是对的。真傻
2012年

怎么p=j++<=n样 如果Javascript在这里像C,它应该可以工作。
ugoren 2012年

@ugoren:看起来很有效,谢谢!
mellamokb 2012年

2

正则表达式(ECMAScript),20字节

^x?x?(?!(x+)(x\1)+$)

在线尝试!

上面的版本不能正确处理零,但是只占用1个额外的字节:

^x?x?(?!(x+)(x\1)+$)x

作为额外的奖励,以下是一个版本,该版本的返回匹配值1比素数少一个,2素数多一个,而素数3多一个:

^x?x??(?!(x+)(x\1)+$)x

在线尝试!


问题所涉及的范围是“在2 ^ 0和2 ^ 20之间”,因此1..2 ^ 20所以0处没有...
RosLuP

@RosLuP这就是为什么我的主要答案是20个字节并且不能正确处理0的原因。我发现,超出问题的确切规范并给出更可靠的答案以及与问题的规范最低限度匹配的答案很有价值。
Deadcode '19

有时我也做同样的事情(写“不必要的”测试),但这似乎与代码高尔夫的思维方式背道而驰,编写它们的人不被认为是“认真的”……
RosLuP

1
@RosLuP但是,只要我给出最小的答案作为主要答案,会有什么害处?您能举一些实际想到这种方式的人的例子吗?如果我给出的唯一答案是可靠的答案,那么我可以理解,但是我没有这样做。
Deadcode '19

1

C#,96

它返回-1,0,1为true,否则为false。

任何使它更短的建议都很棒!

int p(int q){var r=q-1;for(var i=2;i<r&r<q+2;i++){if(i==r-1)break;if(r%i==0)r+=i=1;}return r-q;}

展开形式:

int p(int q){
    var r=q-1;
    for(var i=2;i<r&r<q+2;i++){
        if(i==r-1)break;
        if(r%i==0)r+=i=1;
    }
    return r-q;     
}

我不确定,但是我认为您可以删除if(i==r-1)break;并将for循环的中间部分从更改i<ri<r-1。它会将您降低到
82。– Ciaran_McCarthy

1

高尔夫脚本:26

)0\{.:i,{i\%!},,2=@|\(}3*;

说明:最里面的块{.:i,{i\%!},,2=@|\(}通过检查是否比栈顶小2个因数来确定栈顶是否为素数。然后,将其与堆栈上的第二个项目分离,该第二个项目保持是否已看到素数的状态。最后,它减少堆栈顶部的数字。

首先增加输入,初始化本色状态,然后重复该块3次。由于这将减少两次,但我们先从增加开始,这将覆盖n+1n-1



1

CJam,12个字节

CJam比这个挑战要年轻得多,因此此答案不符合绿色复选标记的要求(无论如何应将其更新为randomra的答案)。但是,打高尔夫球实际上很有趣-我从17个字节开始,然后完全改变了我的方法三遍,每次节省一两个字节。

{(3,f+:mp:|}

这是一个块,与CJam中的函数最接近,它期望输入在堆栈上,并在堆栈上保留1(真)或0(伪)。

在这里测试。

下面是它的工作原理:

(3,f+:mp:|
(          "Decrement the input N.";
 3,        "Push an array [0 1 2].";
   f+      "Add each of those to N-1, to get [N-1 N N+1].";
     :mp   "Test each each element for primality, yielding 0 or 1.";
        :| "Fold bitwise OR onto the list, which gives 1 if any of them was 1.";

1

F#,68个字节(无竞争)

let p n=Seq.forall(fun x->n%x>0){2..n-1}
let m n=p(n-1)||p n||p(n+1)

在线尝试!

这就是为什么我喜欢打高尔夫。我仍然对F#持绿色态度,但是我从语言的工作原理以及如何应对这些挑战中学到了很多东西。


为什么不竞争?
Nit

1
因为我不确定今天是否在F#中使用了2012年问这个问题时没有使用过的任何东西。我承认这很古怪-甚至偏执狂。但是我写制药软件为生。偏执狂是健康的。;)
Ciaran_McCarthy

1
查看Wikipedia中的F#版本表。根据您所需的版本,它可能早于问题。



1

Java 8,83字节

n->n==1|p(n-1)+p(n)+p(n+1)>0int p(int n){for(int i=2;i<n;n=n%i++<1?0:n);return--n;}

返回true/ false作为真实/错误值。

在线尝试。

说明:

n->                    // Method with integer parameter and boolean return-type
  n==1                 //  Return whether the input is 1 (edge-case)
  |p(n-1)+p(n)+p(n+1)>0//  Or if the sum of `n-1`, `n`, and `n+1` in method `p(n)` is not 0

int p(int n){          // Separated method with integer as both parameter and return-type
  for(int i=2;i<n;     //  Loop `i` in the range [2, `n`)
    n=n%i++<1?         //   If `n` is divisible by `i`
       0               //    Change `n` to 0
      :                //   Else:
       n);             //    Leave `n` as is
                       //  (After the loop `n` is either 0, 1, or unchanged,
                       //   if it's unchanged it's a prime, otherwise not)
  return--n;}          //  Return `n` minus 1

因此int p(int n)将导致-1for n=0和非素数,并且将导致n-1for n=1或素数。由于p(0)+p(1)+p(2)will将变为-1+0+1 = 0false并且将返回false(即使2是质数),因此n=1使用此方法是一种极端情况。


没有单独方法的单个循环将为85个字节

n->{int f=0,j=2,i,t;for(;j-->-1;f=t>1?1:f)for(t=n+j,i=2;i<t;t=t%i++<1?0:t);return f;}

返回1/ 0作为真实/错误值。

在线尝试。

说明:

n->{              // Method with integer as both parameter and return-type
  int f=0,        //  Result-integer, starting at 0 (false)
      j=2,i,      //  Index integers
      t;          //  Temp integer
  for(;j-->-1;    //  Loop `j` downwards in range (2, -1]
      f=          //    After every iteration: Change `f` to:
        t>1?      //     If `t` is larger than 1 (`t` is a prime):
         1        //      Change `f` to 1 (true)
        :         //     Else:
         f)       //      Leave `f` the same
    for(t=n+j,    //   Set `t` to `n+j`
        i=2;i<t;  //   Inner loop `i` in the range [2, t)
      t=t%i++<1?  //    If `t` is divisible by `i`:
         0        //     Change `t` to 0
        :         //    Else:
         t);      //     Leave `t` the same
                  //   (If `t` is still the same after this inner loop, it's a prime;
                  //   if it's 0 or 1 instead, it's not a prime)
  return f;}      //  Return the result-integer (either 1/0 for true/false respectively)


0

R,68个字符

f=function(n){library(gmp);i=isprime;ifelse(i(n-1)|i(n)|i(n+1),1,0)}

用法(TRUE为1,FALSE为0):

f(7)
[1] 1
f(8)
[1] 1
f(15)
[1] 0

1
我真的不知道R是如何工作的,但是您能i(n-1)|i(n)|i(n+1)代替ifelse(i(n-1)|i(n)|i(n+1),1,0)吗?
Ry-

您是对的:g = function(n){library(gmp); i = isprime; i(n-1)| i(n)| i(n + 1)}-最多56个字符!;-)
Paolo

0

C ++

k=3;cin>>i;i--;
while(k)
{l[k]=0;
  for(j=2;j<i;j++)
   if(!(i%j))
     l[k]++;
  k--;
  i++;
}
if(!l[1]|!l[2]|!l[3])
     cout<<"1";
else cout<<"0";

欢迎来到CodeGold.SE。如果您查看其他答案,您会注意到用于[code-golf]问题的答案的通用格式。您可能还希望将其应用于答案。
dmckee 2012年

0

Q,43个字符 36

{any min each a mod 2_'til each a:x+-1 0 1}
{any(min')a mod 2_'(til')a:x+-1 0 1}

0

J,16个字符

   (_2&<@-4 p:]-2:)

   (_2&<@-4 p:]-2:) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
1 1 1 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1

0

Python,69 67个字符

any(all(i%j for j in range(2,i))for i in range(input()-1,8**7)[:3])

8**7 > 2**20 同时稍短一些


0

Ruby,47个字符,但可读性强

require'Prime'
f=->x{[x-1,x,x+1].any? &:prime?}

0

C ++ 97

ugoren似乎击败了我一个聪明的解决方案。因此,他是循环三遍方法的短版:

P(int k){int j=1;for(int i=2;i<k;){j=k%i++&&j;}return j;}
a(int b){return P(b)|P(b+1)|P(b-1);}

0

第四(gforth),104字节

: p dup 1 > if 1 over 2 ?do over i mod 0> * loop else 0 then nip ;
: f dup 1- p over 1+ p rot p + + 0< ;

在线尝试!

说明

质检(p)

dup 1 > if          \ if number to check if greater than 1
   1 over 2 ?do     \ place a 1 on the stack to act as a boolean and loop from 2 to n
      over i  mod   \ take the modulo of n and i
      0> *          \ check if greater than 0 (not a divisor) and multiply result by boolean
   loop             \ end the loop, result will be -1 if no divisor was found (prime)
else                \ if n is less than 2
   0                \ put 0 on the stack (not prime)
then                \ end the loop
nip                 \ drop n from the stack

主要功能(f)

dup 1- p             \ get n-1 and check if prime
over 1+ p            \ get n+1 and check if prime
rot p                \ rotate stack to put n on top and check if prime
+ + 0<               \ add the three results and check if less than 0 (at least 1 was prime)


0

果冻,5个字节

‘r’ẒẸ

在线尝试!

怎么运行的

‘r’ẒẸ    Monadic main link. Input: integer n
‘r’      Generate range n-1..n+1
   ẒẸ    Is any of them a prime?
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.