3

私の学校のコンピューター サイエンス関連の新聞 ( readmeと呼ばれる、ノルウェー語で、19 ページ) では、次の問題に対して可能な限り短い Java コードを作成するための楽しいコンテストが行​​われました。

引数として整数 (文字列配列の最初のエントリの文字列として。Java のメイン メソッドは文字列配列のみを受け取るため) を引数として取り、最初にこの数値より下の素数であるすべての数値を書き出し、次にすべての数値を書き出します。は素数ではありません。最短のコードが勝ちます!

答えとして、競争に勝った最短の Java コードを投稿します。スタック オーバーフロー コミュニティはもっと短いコードを作成できるのではないでしょうか ノルウェー語を知っていれば、それを行っていればシャンパン 1 本を獲得できたはずですが、残念ながらコンテストの最終提出日は終了しています。

この問題をどのように解決したでしょうか。

4

9 に答える 9

6

タイトルを「Java」に変更する前に、Haskellですでにそれを行っていました。これはコミュニティ wiki なので、とにかくここにあります。

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]
于 2009-05-08T03:12:00.060 に答える
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);
         }
      }
   }
于 2009-05-08T02:40:12.883 に答える
3

念のため、以前の Haskell の回答の 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)));}
}

fj パッケージはこちらから。

于 2009-05-09T15:49:32.380 に答える
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
于 2009-06-10T09:04:51.843 に答える
1

Python、65 文字

print[i for i in range(2,input())if all(i%j for j in range(2,i))]

使用法:

>>> print[i for i in range(2,input())if all(i%j for j in range(2,i))]
70
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67]
>>> 
于 2015-12-10T10:34:44.797 に答える
0

完全を期すために、Haskell 定義を 2 つ追加します。原型

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)
于 2018-02-18T19:38:51.367 に答える
-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);
        }
    }
}
于 2012-03-24T22:33:43.653 に答える