我学校的计算机科学专业报(称为readme,它是挪威语,第19页)有一个有趣的竞赛,为下面的问题编写尽可能短的Java代码。
接受一个整数(作为字符串数组的第一个条目中的字符串,因为Java main方法只接受字符串数组)作为参数,并首先写出所有低于此数字的数字作为素数,然后所有不是素数的数字。最短的代码赢了!
作为答案,我将发布赢得竞争的最短Java代码。我想知道Stack Overflow社区是否可以制作更短的代码如果您了解挪威语,您会看到如果您已经完成它就可以赢得一瓶香槟,但不幸的是,比赛的最后提交日期已经结束。
你怎么解决这个问题?
答案 0 :(得分:6)
在将标题更改为“Java”之前,我已经在Haskell中执行此操作。由于这是一个社区维基,无论如何它都在这里。
primes n =
let sieve (p:xs) = p : sieve [x | x<-xs, x `mod` p /= 0] in
let primes = takeWhile (<n) $ sieve [2..] in
([0..n] \\ primes, primes)
*Main> primes 20
([0,1,4,6,8,9,10,12,14,15,16,18,20],[2,3,5,7,11,13,17,19])
(编辑:) 缩短名称并删除空格使其成为79个字符:
p n=let s(p:xs)=p:s[x|x<-xs,x`mod`p/=0];r=takeWhile(<n)$s[2..]in(r,[0..n-1]\\r)
这里也交换了结果对的顺序,并且根据规范使用了n-1
。
使用次优试验将其归结为 50个字符:
p n=partition(\k->all((>0).rem k)[2..k-1])[2..n-1]
答案 1 :(得分:4)
赢得竞争的Java代码(153个字节没有间距,此处包含的间距是为了便于阅读):
class F {
public static void main(String[] a) {
for (int i, j, k = 2; k-- > 0;)
for (i = 1; i++ < new Long(a[0]);) {
for (j = i; i % --j > 0;)
;
if (k > 0 ? j < 2 : j > 1)
System.out.println(i);
}
}
}
答案 2 :(得分:3)
只是为了好玩,这里是the previous Haskell answer.的Java版本。如果有足够的堆,这个程序将终止所有参数。
import fj.data.Natural;
import fj.data.Stream;
import static fj.data.Stream.*;
import static fj.pre.Ord.naturalOrd;
import fj.pre.Show;
import static fj.pre.Show.streamShow;
import static fj.pre.Show.naturalShow;
import static fj.data.Natural.ZERO;
import static fj.data.Natural.natural;
import fj.P1;
import fj.F;
import static fj.data.Enumerator.naturalEnumerator;
import java.math.BigInteger;
public class Primes2
{public static Stream<Natural> sieve(final Stream<Natural> xs)
{return cons(xs.head(), new P1<Stream<Natural>>()
{public Stream<Natural> _1()
{return sieve(xs.tail()._1().filter(new F<Natural, Boolean>()
{public Boolean f(final Natural x)
{return !naturalOrd.eq(x.mod(xs.head()), ZERO);}}));}});}
public static Stream<Natural> primes(final Natural n)
{return sieve(forever(naturalEnumerator, natural(2).some()))
.takeWhile(naturalOrd.isLessThan(n));}
public static void main(final String[] a)
{final Natural n = natural(new BigInteger(a[0])).some();
final Show<Stream<Natural>> s = streamShow(naturalShow);
s.println(primes(n));
s.println(range(naturalEnumerator, ZERO, n)
.minus(naturalOrd.equal(), primes(n)));}
}
答案 3 :(得分:1)
我在Ruby中的尝试。 93个字符。
def s n
(a=(2..n).to_a).each{|n|a.reject!{|k|k%n==0&&k/n!=1}}
p[[1]+a,(2..n).to_a-a]
end
答案 4 :(得分:1)
>>> a = DemoClass(3)
init() called
>>> isinstance("abc", str)
True
>>> isinstance(a, DemoClass)
True
>>> isinstance(a, int)
True
>>> issubclass(DemoClass, int)
False
用法:
print[i for i in range(2,input())if all(i%j for j in range(2,i))]
答案 5 :(得分:0)
如果你想要一个js代码:n是最大值(62个字符)
for(i=1; i<n;i++)
{
for(f = j= 2;j<i && f;)
f = i%j++
if(f) console.log(i)
}
答案 6 :(得分:0)
易于理解和智能的代码可能如下:
public class test3 {
public static void main(String[] args) {
for (int i = 2; i <= 100; i++) {
int count = 0;
for (int j = i / 2; j >= 2; j--) {
if (i % j == 0)
count = count + 1;
}
if (count == 0)
System.out.println(i);
}
}
}
答案 7 :(得分:0)
为了完整性,还有两个Haskell定义。原型
primes = map head . scanl (\\) [2..] . map (\p -> [p, p+p..]) $ primes
where
(\\) = Data.List.Ordered.minus
和简洁的绝对冠军,
nubBy (((>1).).gcd) [2..] -- (((>1).).gcd) meaning (\a b -> gcd a b > 1)
答案 8 :(得分:-2)
133个字符: - )
class F {
public static void main(String[] z) {
l:
for (int a=1,b; a < z; a += 2) {
for (b = 2; b < a; b++)
if (a % b == 0)
continue l;
System.out.println(a);
}
}
}