Menemukan Angka yang Tidak Cukup Prime

17

Tantangan Anda, jika Anda memilih untuk menerimanya, adalah untuk kode-golf fungsi yang mengembalikan benar atau salah (atau beberapa representasi yang berarti dari ya dan tidak) jika nomor memenuhi kriteria berikut:

  1. Bilangan bulat itu sendiri adalah bilangan prima ATAU
  2. Salah satu dari bilangan bulat tetangganya adalah prima

Sebagai contoh:
Sebuah input 7akan mengembalikan True.
Masukan 8juga akan mengembalikan True.
Input 15akan mengembalikan False. (Baik 14, 15, atau 16 adalah prima)

Input harus dapat kembali dengan benar untuk angka antara 2 ^ 0 dan 2 ^ 20 inklusif, jadi tidak perlu khawatir tentang masalah tanda atau bilangan bulat bilangan bulat.

Tuan Llama
sumber
Jumlah 32-bit melebihi, bukan buffer overflows, saya kira.
pengguna tidak diketahui
Aduh, berarti "integer overflow". Otak melanjutkan autopilot.
Tn. Llama

Jawaban:

11

J, 17

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

Mengembalikan booleans yang dikodekan sebagai kode pengembalian proses: nol untuk true, bukan nol untuk false. Penggunaan sampel:

   */<:$&q:(<:,],>:) 7
0
   */<:$&q:(<:,],>:) 8
0
   */<:$&q:(<:,],>:) 15
3
JB
sumber
*/0 p:<:,],>:lebih pendek dan fungsi (lambda) yang tepat adalah([:*/0 p:<:,],>:)
randomra
9

Haskell, 47 karakter

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

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

Pertama kali di Code Golf jadi mungkin ada beberapa trik yang saya lewatkan.

Kris Harper
sumber
Anda dapat menghapus []. semua akan senang bekerja dengan ekspresi generator. Jika Anda tidak keberatan kode Anda jelek, Anda juga bisa menghapus spasi di antara 0dan for, dan )dan or.
stranac
@stranac Luar Biasa. Terima kasih banyak.
Kris Harper
3
Membuat beberapa perubahan langsung, semoga tetap berhasil:f=lambda n:any(all(m%i for i in range(2,m))for m in[n,n-1,n+1])
Nabb
@ Nabb Sangat bagus. Sudah selesai dilakukan dengan baik.
Kris Harper
5

Bukan pesaing nyata dalam kekurangan kode dengan cara apa pun, tetapi tetap mengirimkan karena menentukan primeness dengan ekspresi reguler diputar dalam banyak cara!

Python (2.x), 85 karakter

import re
f=lambda n:any(not re.match(r"^1?$|^(11+?)\1+$","1"*x)for x in[n,n-1,n+1])
ChristopheD
sumber
Anda dapat menghapus for for dan membangunnya ke dalam regexp dengan menguji "1" * (n +1) tetapi mulai dengan ^ 1? 1? sebagai gantinya.
Howard
4

Ruby (55, atau 50 sebagai lambda)

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

atau sebagai lambda (biasa g[23]menyebutnya)

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

Setrip naskah (53)

p=(q)->[q-1..q+1].some (n)->[2..n-1].every (d)->n%d>0
jsvnm
sumber
<pedantic> Seharusnya "proc" bukan "lambda" </pedantic> ;-)
Gagang Pintu
3

The Mathematica yang membosankan , 35 solusinya!

PrimeQ[n-1]||PrimeQ[n]||PrimeQ[n+1]
Ry-
sumber
15
Setidaknya Anda bisa memasukkannya ke dalam golf Or@@PrimeQ/@{n-1,n,n+1}.
Howard
Ini bukan fungsi.
Martin Ender
@ MartinBüttner: Saya tidak tahu Mathematica, maaf.
Ry-
2
Menggunakan versi Howard, Or@@PrimeQ@{#-1,#,#+1}&(pemotongan dalam kodenya tidak diperlukan)
Martin Ender
3

C, 112 82 72 karakter

Mengikuti komentar Ilmari Karonen, menyelamatkan 30 karakter dengan menghapus main, sekarang Pmengembalikan true / false. Juga diganti loop dengan rekursi, dan beberapa penyesuaian lagi.

p(n,q){return++q==n||n%q&&p(n,q);}P(n){return p(-~n,1)|p(n,1)|p(~-n,1);}

Versi asli:

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));}
ugoren
sumber
Anda dapat menyimpan 2 karakter dengan main(n,m)int**m;.
Ilmari Karonen
... dan selain itu, tantangannya mengatakan " fungsi kode-golf ".
Ilmari Karonen
3

Mathematica, 24 byte

Tidak tahu mengapa pos lama ini muncul di daftar saya hari ini, tetapi saya menyadari bahwa Mathematica kompetitif di sini.

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

Fungsi yang tidak disebutkan namanya mengambil argumen integer dan mengembalikan Trueatau False. Implementasi langsung.

Greg Martin
sumber
PrimeQutas di atas daftar, jadi Or@@PrimeQ@{#-1,#,#+1}&(atau Or@@PrimeQ[#+{-1,0,1}]&) juga berfungsi, untuk -1 byte. (Meskipun, kurasa aku tidak tahu apakah PrimeQmemasang daftar di tahun 2012.)
Misha Lavrov
3

Stax , 6 byte

Ç▀<╝ºΩ

Jalankan dan debug itu

Penjelasan (tidak dikemas):

;v:Pv<! Full program, implicit input  Example: 7
;v      Copy input and decrement               7 6
  :P    Next prime                             7 7
    v   Decrement                              7 6
     <! Check if input is >= result            1
wastl
sumber
2

JavaScript (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)

Demo: http://jsfiddle.net/ydsxJ/3/

Sunting 1: Ubah for(i=2;i<j;i++)ke for(i=1;++i<j;)(terima kasih @minitech). Ubah ifpernyataan menjadi terner. Dipindahkan r|=pdan p=1ke luar foruntuk menghilangkan kawat gigi bagian dalam. 7 karakter disimpan.

Sunting 2: Gabungkan p=1dan j++<=nuntuk p=j++<=n, menyimpan 2 karakter (terima kasih @ugoren).

mellamokb
sumber
Anda dapat menggunakan for(i=1;++i<j;)alih-alih for(i=2;i<j;i++)menyimpan 1 karakter lagi.
Ry-
1
@minitech: !j%itidak akan berfungsi karena diutamakan. Alternatif bekerja adalah j%i<1.
Nabb
@Nabb: Wow, Anda benar. Itu konyol.
Ry-
Bagaimana dengan p=j++<=n? Jika Javascript seperti C di sini, itu harus berfungsi.
ugoren
@ugoren: Sepertinya berhasil, terima kasih!
mellamokb
2

Regex (ECMAScript), 20 byte

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

Cobalah online!

Versi di atas tidak menangani dengan benar nol, tetapi itu hanya membutuhkan 1 byte tambahan:

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

Sebagai bonus tambahan, inilah versi yang memberikan kecocokan pengembalian 1untuk yang kurang dari perdana, 2untuk perdana, dan 3untuk yang lebih dari perdana:

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

Cobalah online!

Kode mati
sumber
Kisaran yang dibicarakan oleh pertanyaan itu adalah "antara 2 ^ 0 dan 2 ^ 20" jadi 1..2 ^ 20 sehingga 0 tidak ada ...
RosLuP
@ RosLuP. Itulah mengapa jawaban utama saya adalah 20 byte dan tidak menangani 0 dengan benar. Saya menemukan nilai untuk melampaui spesifikasi pertanyaan yang tepat dan memberikan jawaban yang lebih kuat, bersama dengan jawaban yang minimal cocok dengan spesifikasi pertanyaan.
Deadcode
Kadang-kadang saya melakukan hal yang sama (menulis tes 'tidak perlu') tetapi ini tampaknya bertentangan dengan cara berpikir codegolf, dan orang-orang yang menulisnya tidak dianggap "serius" ...
RosLuP
1
@RosLuP Tapi apa salahnya, selama saya memberikan jawaban minimal sebagai jawaban utama saya? Dan bisakah Anda memberikan contoh orang yang benar-benar berpikir seperti itu? Saya bisa memahaminya jika saya memberikan jawaban saya sebagai satu - satunya jawaban yang kuat, tetapi saya tidak melakukannya.
Deadcode
1

C #, 96

Mengembalikan -1,0,1 untuk true, yang lainnya salah.

Setiap saran untuk membuatnya lebih singkat akan sangat menyenangkan!

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

Formulir diperluas:

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;     
}
Sereal
sumber
Saya tidak sepenuhnya yakin, tapi saya pikir Anda bisa menghapus if(i==r-1)break;dan mengubah bagian tengah forloop dari i<rmenjadi i<r-1. Ini akan membuat Anda turun ke 82.
Ciaran_McCarthy
1

GolfScript: 26

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

Penjelasan: Blok terdalam {.:i,{i\%!},,2=@|\(}menentukan apakah bagian atas tumpukan adalah prima dengan memeriksa apakah ada tepat 2 faktor yang kurang dari bagian atas tumpukan. Kemudian dipisah-pisahkan dengan item kedua di stack, yang menyimpan status apakah prime sudah terlihat. Akhirnya, itu mengurangi angka di bagian atas tumpukan.

Mulailah dengan menambah input, menginisialisasi keadaan yang terlihat prima, dan ulangi blok 3 kali. Karena ini akan menurun dua kali, tetapi kami mulai dengan menambahkan, ini akan mencakup n+1dan n-1.

Ben Reich
sumber
1

C #, 87 97 karakter

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));}
Steve Clanton
sumber
Saya tidak berpikir ini bekerja dengan 1 atau 2 sebagai masukan
Ben Reich
@ Ben Reich Tidak. Saya harus menambahkan sepuluh karakter untuk memperbaikinya :(
Steve Clanton
1

CJam, 12 byte

CJam jauh lebih muda dari tantangan ini, jadi jawaban ini tidak memenuhi syarat untuk tanda centang hijau (yang tetap harus diperbarui ke jawaban randomra). Namun, bermain golf ini sebenarnya cukup menyenangkan - saya mulai dengan 17 byte dan kemudian mengubah pendekatan saya sepenuhnya tiga kali, menghemat satu atau dua byte setiap kali.

{(3,f+:mp:|}

Ini adalah blok, ekuivalen terdekat dengan fungsi dalam CJam, yang mengharapkan input pada stack, dan menyisakan 1 (benar) atau 0 (salah) pada stack.

Uji di sini.

Inilah cara kerjanya:

(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.";
Martin Ender
sumber
1

F #, 68 byte (tidak bersaing)

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

Cobalah online!

Inilah sebabnya saya suka golf kode. Saya masih sangat hijau dengan F # tetapi saya belajar banyak tentang bagaimana bahasa bekerja dan apa yang bisa dilakukan dari tantangan semacam ini.

Ciaran_McCarthy
sumber
Mengapa ini tidak bersaing?
Nit
1
Karena saya tidak yakin apakah saya menggunakan sesuatu di F # hari ini yang tidak ada ketika pertanyaan diajukan pada tahun 2012. Saya akui itu sangat bagus - bahkan paranoid. Tetapi saya menulis perangkat lunak farmasi untuk mencari nafkah. Paranoia sehat. ;)
Ciaran_McCarthy
1
Lihatlah tabel versi F # di Wikipedia . Tergantung pada versi yang Anda butuhkan, mungkin lebih tua dari pertanyaan.
1

Java 8, 83 byte

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

Mengembalikan true/ falsesebagai nilai truey / falsey.

Cobalah online.

Penjelasan: "

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

Jadi int p(int n)akan menghasilkan -1untuk n=0dan bukan-bilangan prima, dan akan menghasilkan n-1untuk n=1atau bilangan prima. Karena p(0)+p(1)+p(2)akan menjadi -1+0+1 = 0dan akan mengembalikan false (meskipun 2prima), n=1ini adalah kasus tepi menggunakan pendekatan ini.


Satu loop tanpa metode yang terpisah akan menjadi 85 byte :

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

Mengembalikan 1/ 0sebagai nilai truey / falsey.

Cobalah online.

Penjelasan:

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)
Kevin Cruijssen
sumber
1

Japt , 7 byte

´Uô2 dj
´Uô2    // Given the range [U-1..U+1],
     dj // sing "Daddy DJ", uh, I mean, check if any are a prime.

Cobalah online!

Nit
sumber
0

R, 68 karakter

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

Penggunaan (1 untuk BENAR, 0 untuk SALAH):

f(7)
[1] 1
f(8)
[1] 1
f(15)
[1] 0
Paolo
sumber
1
Aku tidak benar-benar tahu bagaimana R bekerja, tapi bisa Anda lakukan i(n-1)|i(n)|i(n+1)bukan ifelse(i(n-1)|i(n)|i(n+1),1,0)?
Ry-
Anda benar: g = fungsi (n) {library (gmp); i = isprime; i (n-1) | i (n) | i (n + 1)} - hingga 56 karakter! ;-)
Paolo
0

C ++

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";
ajobdesh
sumber
Selamat datang di CodeGold.SE. Jika Anda melihat jawaban lain, Anda akan melihat format umum yang digunakan untuk jawaban atas pertanyaan [golf kode]. Anda mungkin ingin menerapkannya pada jawaban Anda juga.
dmckee
0

Q, 43 karakter 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}
tmartin
sumber
0

J, 16 karakter

   (_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
randomra
sumber
0

Python, 69 67 karakter

any(all(i%j for j in range(2,i))for i in range(input()-1,8**7)[:3])

8**7 > 2**20 sementara menjadi sedikit lebih pendek untuk menulis

Valentin CLEMENT
sumber
0

Ruby, 47 karakter tetapi sangat mudah dibaca

require'Prime'
f=->x{[x-1,x,x+1].any? &:prime?}
Gagang pintu
sumber
0

C ++ 97

ugoren tampaknya telah mengalahkan saya dengan solusi yang cerdas. Jadi dia versi singkat pada pendekatan tiga kali loop:

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);}
Nathan Cooper
sumber
0

Keempat (gforth) , 104 byte

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

Cobalah online!

Penjelasan

Pemeriksaan prima (p)

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

Fungsi Utama (f)

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)
reffu
sumber
0

Jelly , 5 byte

‘r’ẒẸ

Cobalah online!

Bagaimana itu bekerja

‘r’ẒẸ    Monadic main link. Input: integer n
‘r’      Generate range n-1..n+1
   ẒẸ    Is any of them a prime?
Bubbler
sumber