如果您选择接受它,那么您面临的挑战是对一个数字满足以下条件的函数进行编码,该函数将返回true或false(或者是yes和no的某种类似有意义的表示形式):
- 整数本身是质数或
- 它的任何一个相邻整数都是素数
例如:
的输入7
将返回True。
输入8
也会返回True。
输入15
会返回False。(14、15或16都不是素数)
输入必须能够正确返回2 ^ 0到2 ^ 20之间的数字,因此无需担心符号问题或整数溢出。
如果您选择接受它,那么您面临的挑战是对一个数字满足以下条件的函数进行编码,该函数将返回true或false(或者是yes和no的某种类似有意义的表示形式):
例如:
的输入7
将返回True。
输入8
也会返回True。
输入15
会返回False。(14、15或16都不是素数)
输入必须能够正确返回2 ^ 0到2 ^ 20之间的数字,因此无需担心符号问题或整数溢出。
Answers:
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,所以我可能缺少一些技巧。
[]
。使用生成器表达式,所有人都会非常高兴。如果您不介意代码丑陋,还可以删除0
和for
,和)
和之间的空格or
。
f=lambda n:any(all(m%i for i in range(2,m))for m in[n,n-1,n+1])
按照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));}
main(n,m)int**m;
。
不知道为什么这个老帖子今天出现在我的列表中,但是我意识到Mathematica在这里很有竞争力。
Or@@PrimeQ/@{#-1,#,#+1}&
未命名函数采用整数参数并返回True
或False
。直接执行。
PrimeQ
线程遍历列表,因此Or@@PrimeQ@{#-1,#,#+1}&
(或Or@@PrimeQ[#+{-1,0,1}]&
)也适用于-1个字节。(尽管,我想我不知道PrimeQ
2012
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|=p
并p=1
进入外for
,以消除内括号。保存了7个字符。
编辑2:合并p=1
和j++<=n
以p=j++<=n
,节省2个字符(感谢@ugoren
)。
for(i=1;++i<j;)
而不是for(i=2;i<j;i++)
再保存1个字符。
!j%i
由于优先级而无法使用。可行的替代方法是j%i<1
。
p=j++<=n
样 如果Javascript在这里像C,它应该可以工作。
^x?x?(?!(x+)(x\1)+$)
上面的版本不能正确处理零,但是只占用1个额外的字节:
^x?x?(?!(x+)(x\1)+$)x
作为额外的奖励,以下是一个版本,该版本的返回匹配值1
比素数少一个,2
素数多一个,而素数3
多一个:
^x?x??(?!(x+)(x\1)+$)x
它返回-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<r
为i<r-1
。它会将您降低到
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.";
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#持绿色态度,但是我从语言的工作原理以及如何应对这些挑战中学到了很多东西。
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)
将导致-1
for n=0
和非素数,并且将导致n-1
for n=1
或素数。由于p(0)+p(1)+p(2)
will将变为-1+0+1 = 0
false并且将返回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)
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";
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);}
: 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)