অত্যন্ত-প্রাইম সংখ্যা খুঁজে পাওয়া যাচ্ছে না


17

আপনার চ্যালেঞ্জ, আপনি যদি এটি গ্রহণ করা পছন্দ করেন তবে কোড-গল্ফকে এমন কোনও ফাংশন যা সত্য বা মিথ্যা (বা হ্যাঁ এবং না এর কিছু অনুরূপ অর্থবহ উপস্থাপনা) ফেরত দেয় যদি কোনও নম্বর নিম্নলিখিত মানদণ্ডগুলি পূরণ করে:

  1. পূর্ণসংখ্যা নিজেই একটি প্রধান সংখ্যা OR
  2. এর প্রতিবেশী পূর্ণসংখ্যার মধ্যে উভয়ই প্রধান

উদাহরণস্বরূপ:
একটি ইনপুট 7সত্য ফিরে আসবে।
একটি ইনপুট 8এছাড়াও সত্য ফিরে আসবে।
একটি ইনপুট 15মিথ্যা প্রত্যাবর্তন করবে। (১৪, ১৫ বা ১ 16 উভয়ই প্রধান নয়)

ইনপুট অবশ্যই 2 ^ 0 থেকে 2 ^ 20 সমেতের সংখ্যার জন্য সঠিকভাবে ফিরে আসতে সক্ষম হবে, সুতরাং সাইন ইস্যু বা পূর্ণসংখ্যার ওভারফ্লো সম্পর্কে চিন্তা করার দরকার নেই।


আমার ধারণা 32-বিট সংখ্যা ওভারফ্লো, বাফার ওভারফ্লোগুলি নয়।
ব্যবহারকারী অজানা

উফ, মানে "পূর্ণসংখ্যার ওভারফ্লো"। মস্তিষ্ক অটোপাইলটে চলে গেল।
মিঃ ললামা

উত্তর:


11

জে, 17

*/<:$&q:(<:,],>:)

প্রক্রিয়া রিটার্ন কোড হিসাবে এনকোডযুক্ত বুলিয়ানগুলি প্রদান করে: সত্যের জন্য শূন্য, মিথ্যের জন্য ননজারো। নমুনা ব্যবহার:

   */<:$&q:(<:,],>:) 7
0
   */<:$&q:(<:,],>:) 8
0
   */<:$&q:(<:,],>:) 15
3

*/0 p:<:,],>:সংক্ষিপ্ত এবং একটি সঠিক ( ([:*/0 p:<:,],>:)
ল্যাম্বদা

9

হাস্কেল, 47 টি অক্ষর

f n=any(\k->all((>0).mod k)[2..k-1])[n-1..n+1]

6

পাইথন 85 80

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)

কোড গল্ফে প্রথমবার তাই সম্ভবত কিছু কৌশল আমি মিস করছি।


আপনি মুছে ফেলতে পারেন []। জেনারেটর এক্সপ্রেশন নিয়ে কাজ করে সমস্তই খুশি হবে। আপনি আপনার কোড কুশ্রী হচ্ছে কিছু মনে না করেন, তাহলে আপনি মধ্যে শূণ্যস্থান অপসারণ করতে পারেন 0এবং for, এবং )এবং or
stranac

টুইটারে আপনাকে অনেক ধন্যবাদ.
ক্রিস হার্পার

3
কয়েকটি সোজাসাপ্ট পরিবর্তন হয়েছে, আশা করি এটি এখনও কার্যকর হয়:f=lambda n:any(all(m%i for i in range(2,m))for m in[n,n-1,n+1])
ন্যাব

@ নাব খুব সুন্দর সাবাশ.
ক্রিস হার্পার

5

কোনওভাবেই কোডের সংক্ষিপ্ততার প্রকৃত প্রতিযোগী নয়, তবে এখনও নিয়মিত অভিব্যক্তির মাধ্যমে আধ্যাত্মিকতা নির্ধারণের কারণে জমা দেওয়া অনেক উপায়ে মোচড় দেওয়া হয়েছে!

পাইথন (2.x), 85 টি অক্ষর

import re
f=lambda n:any(not re.match(r"^1?$|^(11+?)\1+$","1"*x)for x in[n,n-1,n+1])

আপনি "1" * (n + 1) পরীক্ষা করে কিন্তু ^ 1? 1 দিয়ে শুরু করে লুপটি অপসারণ করতে এবং এটিকে পুনরায় তৈরি করতে পারবেন? পরিবর্তে.
হাওয়ার্ড

4

রুবি (55 বা লাম্বা হিসাবে 50)

def f q;(q-1..q+1).any?{|n|(2..n-1).all?{|d|n%d>0}};end

বা ল্যাম্বদা হিসাবে ( g[23]এটি কল করতে ব্যবহার করুন )

g=->q{(q-1..q+1).any?{|n|(2..n-1).all?{|d|n%d>0}}}

কফিসক্রিপ্ট (53)

p=(q)->[q-1..q+1].some (n)->[2..n-1].every (d)->n%d>0

<pedantic> এটি "লাম্বডা" না "প্রোক" হওয়া উচিত </ pantantic> ;-)
ডোরকনব

3

বিরক্তিকর গণিত, 35 সমাধান!

PrimeQ[n-1]||PrimeQ[n]||PrimeQ[n+1]

15
অন্তত আপনি এটি গল্ফ করতে পারেন Or@@PrimeQ/@{n-1,n,n+1}
হাওয়ার্ড

এটি কোনও ফাংশন নয়।
মার্টিন এন্ডার

@ মার্টিনবাটনার: আমি ম্যাথামেটিকাকে জানি না, দুঃখিত।
রাই-

2
হাওয়ার্ডের সংস্করণ ব্যবহার করে, Or@@PrimeQ@{#-1,#,#+1}&(তার কোডে স্ল্যাশ দরকার নেই)
মার্টিন এন্ডার

3

সি, 112 82 72 টি অক্ষর

ইলমারি করোনেনের মন্তব্যের পরে, 30 টি অক্ষর মুছে ফেলে সংরক্ষণ করা হয়েছে main, এখন Pসত্য / মিথ্যা ফিরে আসে। পুনরাবৃত্তি এবং আরও কয়েকটি টুইটের সাহায্যে লুপটি প্রতিস্থাপন করা হয়েছে।

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

আপনি এর সাথে 2 টি অক্ষর সংরক্ষণ করতে পারেন main(n,m)int**m;
ইলমারি করোনেন

... এবং তদতিরিক্ত, চ্যালেঞ্জটি "কোড-গল্ফ একটি ফাংশন " বলে।
ইলমারি করোনেন

3

গণিত, 24 বাইট

জানেন না কেন এই পুরাতন পোস্টটি আজ আমার তালিকায় প্রদর্শিত হয়েছে, তবে আমি বুঝতে পেরেছিলাম যে ম্যাথামেটিকা ​​এখানে প্রতিযোগিতামূলক।

Or@@PrimeQ/@{#-1,#,#+1}&

অজানা ফাংশন একটি পূর্ণসংখ্যার যুক্তি গ্রহণ এবং ফিরে True বা False। প্রত্যক্ষ বাস্তবায়ন।


PrimeQতালিকার উপরে থ্রেড, সুতরাং Or@@PrimeQ@{#-1,#,#+1}&(বা Or@@PrimeQ[#+{-1,0,1}]&) এছাড়াও কাজ করে, -1 বাইটের জন্য। (যদিও, আমি অনুমান করি যে PrimeQ2012 সালে তালিকার উপরে থ্রেড করা হয়েছে কিনা তা আমি জানি না ))
মিশা লাভরভ


2

জাভাস্ক্রিপ্ট (71 73 80 )

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)।


আপনি আরও 1 টি অক্ষর সংরক্ষণ করার for(i=1;++i<j;)পরিবর্তে ব্যবহার করতে পারেন for(i=2;i<j;i++)
রাই-

1
@ এমনিটেক: !j%iঅগ্রাধিকারের কারণে কাজ করবে না। একটি কাজের বিকল্প হয় j%i<1
Nabb

@ নাব্ব: বাহ, আপনি ঠিক বলেছেন এটি বোকামি.
রাই-

কীভাবে p=j++<=n? জাভাস্ক্রিপ্ট যদি এখানে সি এর মতো হয় তবে এটি কাজ করা উচিত।
ugoren

@ ইউগোরেন: দেখে মনে হচ্ছে এটি কার্যকর হয়েছে, ধন্যবাদ!
মেল্লামোকব

2

রেজেক্স (ইসিএমএসক্রিপ্ট), 20 বাইট

^x?x?(?!(x+)(x\1)+$)

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

উপরের সংস্করণটি সঠিকভাবে শূন্যটি পরিচালনা করে না, তবে এটিতে কেবল 1 টি অতিরিক্ত বাইট লাগে:

^x?x?(?!(x+)(x\1)+$)x

একটি যুক্ত বোনাস হিসাবে, এখানে এমন একটি সংস্করণ যা একটি 1প্রাইমের চেয়ে কম, 2প্রাইম এবং 3একটি প্রাইমের চেয়ে আরও একটির জন্য একটি রিটার্ন ম্যাচ দেয় :

^x?x??(?!(x+)(x\1)+$)x

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


প্রশ্নটি সম্পর্কে যে পরিসীমাটি কথা বলছে তা "2 ^ 0 থেকে 2 ^ 20 এর মধ্যে" তাই 1..2 ^ 20 সুতরাং 0 নেই ...
রোজলুপ

@ রোসলুপি ঠিক এই কারণেই আমার প্রাথমিক উত্তরটি 20 বাইট এবং সঠিকভাবে 0 টি পরিচালনা করে না। আমি প্রশ্নের সুনির্দিষ্ট স্পেসিফিকেশনের বাইরে গিয়ে আরও দৃ answers় উত্তর দেওয়ার সাথে সাথে উত্তরটির সাথে মিলিয়েছি যে প্রশ্নের উত্তরটি ন্যূনতমভাবে মিলেছে।
3:39

কখনও কখনও আমিও একই কাজ করি ('অপ্রয়োজনীয়' পরীক্ষা লিখুন) তবে এটি কোডগল্ফের চিন্তার পদ্ধতির বিপরীতে যায় এবং এগুলি লেখার লোকদের "গুরুতর" বলে মনে করা হয় না ...
রোজলুপি

1
@ রোসলুপি তবে যতক্ষণ আমি আমার প্রাথমিক উত্তর হিসাবে ন্যূনতম উত্তর দেব ততক্ষণ ক্ষতি কি? এবং আপনি কি এমন কোনও উদাহরণ দিতে পারেন যাঁরা প্রকৃতপক্ষে এমনটি ভাবেন? আমি যদি শক্তিশালী হিসাবে আমার একমাত্র উত্তরটি দিতে পারি তবে আমি এটি বুঝতে পারি , তবে আমি এটি করছি না।
ডেডকোড

1

সি #, 96

এটি সত্যের জন্য -1,0,1 ফেরায়, অন্য কিছু মিথ্যা।

এটিকে সংক্ষিপ্ত করার জন্য কোনও পরামর্শ দুর্দান্ত লাগবে!

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। এটি আপনাকে 82 এ নামিয়ে আনবে
Ciaran_McCarthy

1

গল্ফস্ক্রিপ্ট: 26

)0\{.:i,{i\%!},,2=@|\(}3*;

ব্যাখ্যা: অন্তঃপুরের ব্লক {.:i,{i\%!},,2=@|\(} স্ট্যাকের শীর্ষের চেয়ে ঠিক 2 কারণ কম আছে কিনা তা পরীক্ষা করে স্ট্যাকের শীর্ষটি প্রধান কিনা তা নির্ধারণ করে। এরপরে এটি স্ট্যাকের দ্বিতীয় আইটেমটির সাথে এটি বিচ্ছিন্ন করে দেয়, যা কোনও প্রাইমকে এখনও দেখা গেছে কিনা তা স্থিত করে। অবশেষে, এটি স্ট্যাকের শীর্ষে সংখ্যা হ্রাস করে।

ইনপুট বৃদ্ধি করে, প্রাথমিক-দেখা রাষ্ট্রের সূচনা করে এবং ব্লকটি 3 বার পুনরাবৃত্তি করুন। যেহেতু এটি দু'বার হ্রাস পাবে, তবে আমরা ইনক্রিমেন্ট দিয়ে শুরু করেছি, এটি কভার করবে n+1এবং n-1


1

সি #, 87 97 টি চর

bool p(int q){return new[]{q-1,q,q+1}.Any(x=>Enumerable.Range(2,Math.Abs(x-2)).All(y=>x%y!=0));}

আমি মনে করি না যে এটি 1 বা 2 দিয়ে ইনপুট হিসাবে কাজ করবে
বেন রেখ

পছন্দ করেছেন এটি ঠিক করার জন্য আমাকে দশটি অক্ষর যোগ করতে হয়েছিল :(
স্টিভ ক্লান্টন

1

সিজেম, 12 বাইট

সিজেএম এই চ্যালেঞ্জের তুলনায় অনেক কম বয়সী, সুতরাং এই উত্তরটি সবুজ চেকমার্কের জন্য উপযুক্ত নয় (যা যাইহোক র্যান্ডমরের উত্তরে আপডেট হওয়া উচিত)। যাইহোক, এটি গল্ফ করা আসলে বেশ মজাদার ছিল - আমি 17 বাইট থেকে শুরু করেছিলাম এবং তারপরে প্রতিবার এক বা দুটি বাইট সংরক্ষণ করে পুরোপুরি তিনবার আমার দৃষ্টিভঙ্গি পরিবর্তন করেছি।

{(3,f+:mp:|}

এটি একটি ব্লক, সিজেমের কোনও ফাংশনের নিকটতম সমতুল্য, যা স্ট্যাকের ইনপুটটি প্রত্যাশা করে এবং স্ট্যাকের উপর একটি 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.";

1

এফ #, 68 বাইট (প্রতিযোগী নয়)

let p n=Seq.forall(fun x->n%x>0){2..n-1}
let m n=p(n-1)||p n||p(n+1)

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

এই কারণেই আমি কোড গল্ফকে ভালবাসি। আমি এখনও এফ # দিয়ে খুব সবুজ, তবে ভাষা কীভাবে কাজ করে এবং এই ধরণের চ্যালেঞ্জগুলি থেকে এটি কী করতে পারে তা সম্পর্কে আমি অনেক কিছু শিখেছি।


কেন এটি প্রতিযোগিতা করছে?
নিট

1
কারণ আমি নিশ্চিত নই যে আমি আজ এফ # তে এমন কিছু ব্যবহার করছি কিনা যা 2012 সালে প্রশ্ন জিজ্ঞাসা করার সময় আশেপাশের ছিল না I তবে আমি জীবিকার জন্য ফার্মাসিউটিক্যাল সফটওয়্যারটি লিখি। পরানোয়া স্বাস্থ্যকর। ;)
Ciaran_McCarthy

1
এ লুক এফ # 'গুলি উইকিপিডিয়া সংস্করণ টেবিল । আপনার প্রয়োজনীয় সংস্করণটির উপর নির্ভর করে এটি প্রশ্নের চেয়ে পুরানো হতে পারে।


1

রেটিনা , 22 বাইট

$
1
^1?1?(?!(11+)\1+$)

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

ইনপুট হিসাবে অবিচ্ছিন্ন লাগে


একটি খাঁটি রেইজেক্স রেটিনা সমাধান এটি 2 বাইট দ্বারা প্রহার করে
ডেডকোড

দেখে মনে হচ্ছে হাওয়ার্ডের মনে এটি ছিল ।
নীল

1

জাভা 8, 83 বাইট

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/ falsetruthy / falsey মান হিসাবে।

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

ব্যাখ্যা: "

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জন্য n=0এবং অ মৌলিক এবং পরিণাম ডেকে আনবে n-1জন্য n=1বা মৌলিক। যেহেতু p(0)+p(1)+p(2)পরিণত হবে -1+0+1 = 0এবং মিথ্যা ফিরে আসবে (যদিও 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/ 0truthy / falsey মান হিসাবে।

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

ব্যাখ্যা:

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)


0

আর, 68 অক্ষর

f=function(n){library(gmp);i=isprime;ifelse(i(n-1)|i(n)|i(n+1),1,0)}

ব্যবহার (সত্যের জন্য 1, মিথ্যা জন্য 0):

f(7)
[1] 1
f(8)
[1] 1
f(15)
[1] 0

1
আমি কীভাবে সত্যিই জানি না যে আর কীভাবে কাজ করে তবে আপনি কি কেবল এর i(n-1)|i(n)|i(n+1)পরিবর্তে করতে পারেন ifelse(i(n-1)|i(n)|i(n+1),1,0)?
রাই-

আপনি ঠিক বলেছেন: g = ফাংশন (n) {লাইব্রেরি (gmp); i = isprime; i (n-1) | i (n) | i (n + 1)} - নিচে 56 টি অক্ষর! ;-)
পাওলো

0

সি ++

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";

কোডগোল্ড.এসই তে আপনাকে স্বাগতম। আপনি যদি অন্য উত্তরগুলি লক্ষ্য করেন তবে আপনি [কোড-গল্ফ] প্রশ্নের উত্তরগুলির জন্য ব্যবহৃত একটি সাধারণ ফর্ম্যাটটি লক্ষ্য করবেন। আপনি আপনার উত্তরগুলিতেও এটি প্রয়োগ করতে চাইতে পারেন।
ডিএমকেেকে

0

প্রশ্ন, 43 অক্ষর 36

{any min each a mod 2_'til each a:x+-1 0 1}
{any(min')a mod 2_'(til')a:x+-1 0 1}

0

জে, 16 অক্ষর

   (_2&<@-4 p:]-2:)

   (_2&<@-4 p:]-2:) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
1 1 1 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1



0

সি ++ 97

চতুর সমাধানটি ইউগোরেন আমাকে মারধর করেছে বলে মনে হচ্ছে। সুতরাং তিনি তিনবার লুপটিতে একটি সংক্ষিপ্ত সংস্করণ:

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

0

ফোর্থ (গফোর) , 104 বাইট

: 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< ;

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

ব্যাখ্যা

প্রধান চেক (পি)

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

প্রধান কাজ (চ)

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)


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