سؤال

صحيفة علوم الكمبيوتر في مدرستي (يسمى التمهيدي, إنه النرويجية, صفحة 19) كان متعة المنافسة لكتابة ممكن جافا البرمجية التالي المشكلة.

تأخذ في عدد صحيح (كسلسلة في أول دخول صفيف سلسلة منذ جافا الطريقة الرئيسية فقط يأخذ صفيف سلسلة) كحجة و كتابة أول كل الأرقام أقل من هذا الرقم الذي يتم يعبي ثم جميع الأرقام التي لا يعبي.أقصر رمز يفوز!

كما جوابا ، أنا سيتم نشر أقصر جافا البرمجية التي فازت في المسابقة.أنا أتساءل عما إذا كان تجاوز سعة مكدس المجتمع يمكن أن تجعل الرمز الذي هو أقصر إذا كنت تعلم النرويجية, سوف ترى أن كنت قد فاز زجاجة من الشمبانيا إذا كنت قد فعلت ذلك, ولكن للأسف آخر تقديم موعد المسابقة قد انتهت.

كيف تحل هذه المشكلة ؟

هل كانت مفيدة؟

المحلول

كنت تفعل ذلك بالفعل في هاسكل قبل تغيير العنوان إلى "جافا".لأن هذا هو ويكي المجتمع ، ومن هنا على أي حال.

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]

نصائح أخرى

وجافا رمز التي فازت في المسابقة (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);
         }
      }
   }

وللمتعة فقط، وهنا نسخة جافا من الجواب هاسكل السابقة . إنهاء هذا البرنامج لجميع الحجج، نظرا كومة كافية.

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 هي من هنا.

ومحاولة مني في روبي. 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

بيثون، 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]
>>> 

وإذا كنت ترغب في الحصول على كود شبيبة: ن هو الحد الأقصى (62 حرف)

  for(i=1; i<n;i++)
    {
        for(f = j= 2;j<i && f;)
            f = i%j++
        if(f) console.log(i)
    }

وسيلة سهلة لفهم ورمز الذكية قد تكون مثل:

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);
        }
    }
}

لاكتمال، وهما أكثر التعاريف هاسكل. والتوراتية

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)

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);
        }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top