সুন্দরমের চালনী (প্রাথমিক সংখ্যা সন্ধানের জন্য)


13

চ্যালেঞ্জ

নীচের মৌলিক সংখ্যাগুলি সন্ধানের জন্য সুন্দরম চালনী প্রয়োগ করুনn । একটি ইনপুট পূর্ণসংখ্যা নিন nএবং নীচের মূল সংখ্যাগুলি আউটপুট দিন n। আপনি ধরে নিতে পারেন যে nসর্বদা এক মিলিয়নের চেয়ে কম বা সমান হবে।


চালনী

  1. থেকে পূর্ণসংখ্যার একটি তালিকা দিয়ে শুরু করুন 1থেকে n

  2. ফর্মের সমস্ত নম্বর সরিয়ে ফেলুন i + j + 2ijযেখানে:

    • iএবং jকম হয় njসর্বদা বৃহত্তর বা সমান i, যা এর চেয়ে বড় বা সমান 1

    • i + j + 2ij এর চেয়ে কম বা সমান n

  3. অবশিষ্ট সংখ্যাগুলি দ্বারা গুণিত করুন 2, এবং যুক্ত করুন 1

এটি সমস্ত মৌলিক সংখ্যা (কেবলমাত্র 2আপনার আউটপুটে অন্তর্ভুক্ত করা উচিত) এর চেয়ে কম ফল দেবে 2n + 2


নীচে প্রাইমগুলি সন্ধান করতে চালনী ব্যবহার করা হচ্ছে তার একটি অ্যানিমেশন এখানে রয়েছে 202


আউটপুট

আপনার আউটপুট প্রতিটি প্রধান পূর্ণসংখ্যার ≤ n(আরোহী ক্রমে) হওয়া উচিত যার পরে একটি নতুন লাইন থাকবে:

2
3
5

কোথায় nআছে 5


উদাহরণ

> 10
2
3
5
7

> 30
2
3
5
7
11
13
17
19
23
29

ইনপুট দ্বারা চিহ্নিত করা হয় >


আপনার উদাহরণটি n=30আউটপুটে 29 অনুপস্থিত।
isaacg

5
একটি নির্দিষ্ট পদ্ধতি ব্যবহার করতে বলার জন্য চ্যালেঞ্জগুলির মধ্যে একটি সমস্যা হ'ল কোনওটি কী পরিবর্তন করতে পারে তা পরিষ্কার নয়। উদাহরণস্বরূপ, আপনার বিবরণটি কেবলমাত্র এটির (i,j)সাথে চেক করে i<=j, তবে আমরা যদি এই প্রয়োজনীয়তা উপেক্ষা করি তবে ফলাফল পরিবর্তন হয় না। বাইটস বাঁচাতে আমরা কি তা করতে পারি?
xnor

আমি কখনও বলিনি যে আপনার চেক করা উচিত কিনা i <= j। এটি চালনী কীভাবে কাজ করে তার কেবলমাত্র একটি অংশ। সুতরাং হ্যাঁ, আপনি i <= jআপনার কোডটি ছেড়ে দিতে পারেন । @ এক্সনোর
জ্যাচ গেটস

2
আমাদের এখানে কতটা অবকাশ আছে? চালনী সব বিজোড় সংখ্যা নির্বাচন সমতূল্য (কারণ ফলাফল ফর্মের হয় 2n+1) যা ফর্ম নয় 2(i + j + 2ij)+1- আমরা সম্ভাব্য মৌলিক সরাসরি এই সম্পত্তি পরীক্ষা করতে পারেন অথবা আমাদের কোড আছে আছে কিছু সময়ে বার 2 প্লাস 1 করতে ?
মার্টিন এন্ডার

1
nপুরো বিষয়টি যা আছে তা নিয়ে আমি কিছুটা বিভ্রান্ত হয়ে পড়েছি । পদ্ধতির বিবরণে এটি বলে যে এটি সমস্ত প্রাইম তৈরি করে 2 * n + 2। তবে ইনপুট / আউটপুট বিবরণে এটি বলে যে ইনপুটটি হ'ল nএবং আউটপুট সমস্ত প্রাইম আপ n। সুতরাং আমরা কি সমস্ত প্রাইম আপ তৈরি করতে পদ্ধতিটি প্রয়োগ করব 2 * n + 2এবং তারপরে nআউটপুটটির চেয়ে বড়গুলি ফেলে দেব? অথবা nআমাদের ইনপুট থেকে পদ্ধতি বিবরণে গণনা করা উচিত n?
রেটো কোরাডি

উত্তর:



3

হাস্কেল, 93 90 বাইট

import Data.List
g n=unlines[show$2*x+1|r<-[[1..n]],x<-2:(r\\[i+j+2*i*j|j<-r,i<-r]),2*x<n]

এটা কিভাবে কাজ করে: [i+j+2*i*j|j<-r,i<-r]সব i+j+2ij(যা সরিয়ে ফেলা হয় \\) থেকে [1..n]। স্কেল করুন 2x+1এবং এটিকে একটি স্ট্রিং ( show) এ পরিণত করুন । এনএল ( unlines) এর সাথে যোগদান করুন ।


1

স্কালা, 115 124 122 115 114 বাইট

n=>{println(2);for{m<-1 to n;if !(for{j<-1 to n;i<-1 to j}yield i+j+2*i*j).contains(m);o=2*m+1;if o<=n}println(o)}

একটি বেনামী ফাংশন; এনটিকে একটি আর্গুমেন্ট হিসাবে গ্রহণ করে এবং ফলাফলটি stdout এ মুদ্রণ করে।


1

জাভাস্ক্রিপ্ট (ES7), 107 105 বাইট

অ্যারে বোঝাপড়া দুর্দান্ত! তবে আমি অবাক হয়েছি কেন জেএসের কোনও রেঞ্জ সিনট্যাক্স নেই (যেমন [1..n]) ...

n=>{for(a=[i=1];i<n;a[i++]=i);for(i=0;i++<n;)for(j=0;j<n;a[i+j+++2*i*j]=0);return[for(i of a)if(i)i*2+1]}

এটি ফায়ারফক্স 40 এ সফলভাবে পরীক্ষা করা হয়েছিল Break

n=>{
  for(a=[i=1];i<n;a[i++]=i); // fill a list with 1..n
  for(i=0;i++<n;)            // for each integer i in 0..n
    for(j=0;j<n;)            //   for each integer j in 0..n
      a[i+j+++2*i*j-1]=0;    //     set the corresponding item of the list to 0
  return[for(i of a)         // filter the list by:
          if(i)              //   item != 0 AND item != undefined
           i*2+1]            // and return each result * 2 + 1
}

বিকল্প, ES6- বান্ধব সমাধান (111 বাইট):

n=>{for(a=[i=1];i<n;a[i++]=i);for(i=0;i++<n;)for(j=0;j<n;a[i+j+++2*i*j]=0);return a.filter(x=>x).map(x=>x*2+1)}

পরামর্শ স্বাগত!


0

ম্যাটল্যাব, 98

n=1:input('');m=n;for p=m for i=1:p j=i:p;for k=i+j+2*i*j n(n==k)=[];end;end;end;disp(2*n'+1);

এবং একটি পঠনযোগ্য আকারে

n=1:input(''); %Ask for the input number (e.g. 100) and form a range
m=n; %Back up the range as we will be editing 'n', but need 'm' as a loop list
for p=m %For each number between 1 and n inclusive
    for i=1:p %'i' is all numbers greater than or equal to 1 up to p
        j=i:p; %'j' is all numbers greater than or equal to i up to p
        for k=i+j+2*i*j %Calculate the numbers to remove, and loop through them
            n(n==k)=[]; %Remove that value from the 'n' array
        end
    end
end
disp([2;2*n'+1]); %An display the list including the number 2 seperated by a new line.

0

জাভা 8: 168 165 বাইট

N->{int[]A=new int[N*N];int i=1,j;N=N/2;for(;i<N;i++)for(j=i;j<N;)A[i+j+2*i*j++]=1;System.out.println(N>1?2:\"\");for(i=1;i<N;i++)if(A[i]<1)System.out.println(2*i+1);}

আরও বড় সংখ্যার জন্য প্রশস্ত পরিসরের সাথে ডেটা টাইপ ব্যবহার করা যেতে পারে। পুরো Nসূচিপত্রের জন্য আমাদের পুনরাবৃত্তি করার দরকার N/2নেই।

সঠিকভাবে অনুসরণ করা সমতুল্য পদ্ধতি।

static void findPrimeSundar(int N){
    int[] A = new int[N*N];
    int i=1,j;
    N=N/2;
    for(;i<N;i++)
      for(j=i;j<N;)
        A[i+j+2*i*j++]=1;
    System.out.println(N>1?2:"");
    for(i=1;i<N;i++)
        if(A[i]<1)System.out.println(2*i+ 1);
}

1
N>=2-> N>1? A[i]==0-> A[i]<1?
lirtosiast

@ থমাসকওয়া হ্যাঁ আপনি ঠিক বলেছেন। ধন্যবাদ।
কোডারক্রোক

0

সিজেম, 35 বাইট

2li:V,:)__2m*{_:+\:*2*+}%m2f*:)&+N*

এটি অনলাইনে চেষ্টা করুন

এটি ইস্যাকের পাইথ সলিউশনের তুলনায় কিছুটা দীর্ঘ বলে মনে হচ্ছে, তবে এটি আমার কাছে রয়েছে।

ব্যাখ্যা:

2       Push a 2, will be part of final output.
li      Get input and convert to integer n.
:V      Save in variable V for later use.
,       Generate list [0 ... n-1].
:)      Increment list elements to get list [1 ... n].
__      Create two copies, one for sieve, and for clamping results.
2m*     Cartesian power, generating all i,k pairs.
{       Loop over all i,j pairs.
  _     Copy pair.
  :+    Calculate sum i + j.
  \     Swap copy of pair to top.
  :*    Calculate product i * j.
  2*    Multiply by 2, to get 2 * i * j.
  +     Add both values, to get i + j + 2 * i * j.
}%      End loop over all i,j pairs.
m       Sieve operation, remove the calculated values from the list of all values.
2f*     Multiply the remaining values by 2...
:)      ... and add 1 to the. We now have the list of all primes up to 2 * n + 2.
&       Intersect with [1 ... n] list, because output is only values <= n.
+       Concatenate with the 2 we pushed at the start.
N*      Join with newlines.

0

পার্ল 6 , 96 বাইট

আমি যদি বিবরণটি কঠোরভাবে মেনে চলি তবে আমি 96 বাইটগুলি পরিচালনা করতে পারি 96

->\n {$_=@=1..n;for 1..n {for $^i..n {.[$i+$^j+2*$i*$j-1]=0}};2,|.[0..n].map(* *2+1).grep(3..n)}
->\n {
  $_=@=1..n; # initialize array
  for 1..n { # $i
    for $^i..n { # $j
      .[$i+$^j+2*$i*$j-1]=0 # remove value
    }
  };
  2,|.[0..n].map(* *2+1).grep(3..n)
}

যদি আমি 2n + 1অ্যারের শুরুটি করতে পারি , প্রাক-সন্নিবেশ করছিলাম 2এবং কেবলমাত্র এর চেয়ে কম বা সমান মানগুলিতে সীমাবদ্ধ রেখেছি n; এটি 84 বাইটে হ্রাস করা যেতে পারে।

->\n {$_=@=2,{++$*2+1}...^*>n;for 1..n {for $^i..n {.[$i+$^j+2*$i*$j]=$}};.grep(?*)}

যদি আমি এটিকেও jকমপক্ষে বলে মনে হয় তা এড়িয়ে চলি তবে আমি iএটিকে 82 বাইটে হ্রাস করতে পারি।

->\n {$_=@=2,{++$*2+1}...^*>n;for 1..n X 1..n ->(\i,\j){.[i+j+2*i*j]=$};.grep(?*)}

ব্যবহারের উদাহরণ:

my $code = ->\n {...} # insert one of the lambdas from above

say $code(30).join(',');
# 2,3,5,7,11,13,17,19,23,29

my &code = $code;
say code 11;
# (2 3 5 7 11)


0

জুলিয়া 0.6 , 65 বাইট

n->[2;(p=setdiff(1:n,[i+j+2i*j for i=1:n for j=i:n])*2+1)[p.<=n]]

এটি অনলাইন চেষ্টা করুন!

গল্ফিংয়ের ক্ষেত্রে কোনও বড় চ্যালেঞ্জ নয়, তবে নামটির জন্য আমাকে এটি করতে হয়েছিল। :)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.