Menemukan Lonely Primes

21

Bilangan prima kesepian (seperti saya menyebutnya) adalah bilangan prima, di mana diberi nomor grid dengan lebar w ≥ 3, adalah bilangan prima yang tidak memiliki bilangan prima lain yang berdekatan dengan mereka secara ortogonal atau diagonal.

Misalnya, jika kita membawa kisi ini ke tempat w = 12(bilangan prima yang dicetak tebal):

1   2   3   4   5   6   7   8   9   10  11  12
13  14  15  16  17  18  19  20  21  22  23...
 ...86  87  88  89  90  91  92  93  94  95  96
97  98  99  100 101 102 103 104 105 106 107 108
109 110 111 112 113 114 115 116 117 118 119 120

Anda dapat melihat bahwa hanya dua bilangan prima 103 dan 107 yang tidak memiliki bilangan prima secara ortogonal atau diagonal apa pun. Saya telah melewatkan bagian karena tidak ada bilangan prima kesepian di sana. (kecuali 37, sebenarnya)

Tugas Anda adalah, diberi dua input w ≥ 3dan i ≥ 1, menentukan prime kesepian pertama dalam kisi-kisi angka dengan lebar w, di mana prime kesepian mengatakan harus lebih besar dari atau sama dengan i. Input dapat diambil dalam format apa pun yang wajar (termasuk menjadikannya sebagai string). Dijamin akan ada prime lonely untuk lebar w.

Grid tidak membungkus.

Contoh:

w  i   output
11 5   11
12 104 107
12 157 157
9  1   151
12 12  37

Karena ini adalah , kode terpendek menang!

Okx
sumber
Mengapa w=12tidak 37prima kesepian? Tidak ada angka di sekitarnya - {25, 26, 38, 49, 50}- yang prima.
Jonathan Frech
@ JonathanFrech Ya, test case menyertakan itu.
Okx

Jawaban:

8

C (gcc) , 159 158 149 byte

  • Menyimpan satu byte berkat xanoetux ; menghapus satu karakter baris baru.
  • Disimpan sembilan byte berkat ceilingcat ; golf kondisi istirahat.
P(n,d,b){for(d=b=1<n;n>++d;)b*=n%d>0;n=b;}F(w,i){w=P(i)&!(P(i-w)|P(i+w)|i%w>1&(P(~-i)|P(i+~w)|P(i+~-w))|i%w>0&(P(-~i)|P(-~i-w)|P(i-~w)))?i:F(w,++i);}

Cobalah online!

Jonathan Frech
sumber
Anda dapat menyimpan satu byte dengan melewatkan baris baru. Cobalah online!
xanoetux
@ceilingcat Saran yang bagus, terima kasih.
Jonathan Frech
5

JavaScript (ES6), 116 104 byte

Mengambil input dalam sintaks currying (w)(i).

w=>g=i=>!(C=(k,n=d=i+k)=>n>0?n%--d?C(k,n):d>1:1)(0)&[i,x=1,i-1].every(j=>C(x-w)&C(w+x--)|j%w<1)?i:g(i+1)

Uji kasus

Berkomentar

w =>                    // main function, taking w
  g = i =>              // g = recursive function, taking i
    !(                  //
      C = (             // define C:
        k,              //   a function taking an offset k
        n = d = i + k   //   and using n and d, initialized to i + k
      ) =>              //
        n > 0 ?         //   if n is strictly positive:
          n % --d ?     //     decrement d; if d does not divide n:
            C(k, n)     //       do a recursive call
          :             //     else:
            d > 1       //       return true if d > 1 (i.e. n is composite)
        :               //   else:
          1             //     return true (n is beyond the top of the grid)
    )(0) &              // !C(0) tests whether i is prime (or equal to 1, but this is safe)
    [                   // we now need to test the adjacent cells:
      i,                //   right side: i MOD w must not be equal to 0
      x = 1,            //   middle    : always tested (1 MOD w is never equal to 0)
      i - 1             //   left side : (i - 1) MOD w must not be equal to 0
    ]                   // for each value j defined above,
    .every(j =>         // and for x = 1, 0 and -1 respectively:
      C(x - w) &        //   test whether i - w + x is composite
      C(w + x--) |      //            and i + w + x is composite
      j % w < 1         //   or j MOD w equals 0, so that the above result is ignored
    ) ?                 // if all tests pass:
      i                 //   return i
    :                   // else:
      g(i + 1)          //   try again with i + 1
Arnauld
sumber
2

Python 2 , 144 byte

f=lambda w,i,p=lambda n:all(n%j for j in range(2,n))*(n>1):i*(any(map(p,~-i%w*(i+~w,i-1,i+w-1)+(i-w,i+w)+i%w*(i-w+1,i+1,i-~w)))<p(i))or f(w,i+1)

Cobalah online!

Urutan argumen: w , i.

Tidak ada modul eksternal yang digunakan di sini.

Python 2 + sympy, 127 byte

import sympy
f=lambda w,i,p=sympy.isprime:i*(any(map(p,~-i%w*(i+~w,i-1,i+w-1)+(i-w,i+w)+i%w*(i-w+1,i+1,i-~w)))<p(i))or f(w,i+1)

Cobalah online!

Tidak layak mendapat posting yang berbeda, karena satu-satunya perbedaan di sini adalah bahwa ia menggunakan sympy.isprimealih-alih fungsi pemeriksaan prima yang diimplementasikan secara manual.

Erik the Outgolfer
sumber
2

MATL , 38 byte

xx`@1G*:5MeZpt3Y6Z+>3LZ)ft2G<~)X<a~}2M

Cobalah online! Atau verifikasi semua kasus uji .

Penjelasan

Kode dasarnya terdiri dari satu loop yang terus memperbesar grid seperti yang dijelaskan dalam tantangan dengan satu baris di setiap iterasi.

Setelah membuat kisi-kisi di setiap iterasi, baris terakhir dihapus (kita tidak bisa tahu apakah bilangan prima itu kesepian atau tidak) dan angka yang tersisa diuji untuk melihat apakah setidaknya ada satu prime lonely ada. Ini dilakukan melalui konvolusi 2D.

Jika ada prime kesepian, kita keluar dari loop dan output perdana pertama. Atau kita lanjutkan dengan iterasi berikutnya, yang akan mencoba kotak yang lebih besar.

(Kode sebenarnya menggunakan versi kotak yang dialihkan, yang diperbesar oleh kolom, bukan oleh baris.)

xx        % Take two inputs (implicit): w, i. Delete them. They get copied
          % into clipboard G
`         % Do...while
  @       %   Push iteration index (1-based)
  1G      %   Push w
  *       %   Multiply
  :       %   Range from 1 to that
  5M      %   Push w again (from automatic clipboard M)
  e       %   Reshape into a matrix with w rows in column-major order
  Zp      %   Is prime? Element-wise
  t       %   Duplicate
  3Y6     %   Push neighbour mask: [1 1 1; 1 0 1; 1 1 1]
  Z+      %   2D convolution, maintaining size
  >       %   Greater than? Element-wise. Gives true for lonely primes
  3LZ)    %   Remove the last column
  f       %   Find linear indices of nonzeros
  t       %   Duplicate
  2G      %   Push i
  <~      %   Not less than?
  )       %   Use as logical index: this removes lonle primes less than i
  X<      %   Minimum. This gives either empty or a nonzero value
  a~      %   True if empty, false if nonzero. This is the loop condition.
          %   Thus the loop proceeds if no lonely prime was found
}         % Finally (execute on loop exit)
  2M      %   Push the first found lonely prime again
          % End (implicit). Display (implicit)
Luis Mendo
sumber
1

Julia 0,6, 135 byte

using Primes
f(w,i,p=isprime)=findfirst(j->(a=max(j-1,0);b=min(j+1,w);c=a:b;!any(p,v for v=[c;c+w;c-w]if v>0&&v!=j)&&p(j)&&j>=i),1:w*w)

TIO tidak memiliki Primespaket. Ini 5 byte lebih pendek jika saya diizinkan untuk mengembalikan semua bilangan prima kesepian ( findfirstmenjadi find). Upaya Julia untuk memindahkan fungsionalitas Baseadalah melukai golf (bukan tujuan Julia),Primes dimasukkan dalam 0,4.

Tidak digabungkan (kebanyakan)

function g(w,i)
    for j=i:w*w
        a,b=max(j-1,0),min(j+1,w)
        c=a:b
        !any(isprime,v for v=[c;c+w;c-w]if v>0&&v!=j)&&isprime(j)&&return j
    end
end
gggg
sumber
1

Jelly , 20 byte

+‘ÆRœ^ḷ,ḷ’dạ/Ṁ€ṂḊð1#

Cobalah online!

Bagaimana itu bekerja

+‘ÆRœ^ḷ,ḷ’dạ/Ṁ€ṂḊð1#  Main link. Left argument: i. Right argument: w.

                 ð    Combine the links to the left into a chain and begin a new,
                      dyadic chain with arguments i and w.
                  1#  Call the chain to the left with left argument n = i, i+1, ...
                      and right argument w until 1 of them returns a truthy value.
                      Return the match.
+                       Yield n+w.
 ‘                      Increment, yielding n+w+1.
  ÆR                    Yield all primes in [1, ..., n+w+1].
      ḷ                 Left; yield n.
    œ^                  Multiset OR; if n belongs to the prime range, remove it; if
                        it does not, append it.
       ,ḷ               Wrap the resulting array and n into a pair.
         ’              Decrement all involved integers.
          d             Divmod; map each integer k to [k/w, k%w].
           ạ/           Reduce by absolute difference, subtracting [n/w, n%w] from
                        each [k/w, k%w] and taking absolute values.
             Ṁ€         Take the maximum of each resulting pair.
                        A maximum of 0 means that n is not prime.
                        A maximum of 1 means that n has a prime neighbor.
               Ṃ        Take the minimum of the maxima.
                Ḋ       Dequeue; map the minimum m to [2, ..., m].
                        This array is non-empty/truthy iff m > 1.
Dennis
sumber
1

Perl 6 , 113 104 byte

->\w,\i{first {is-prime $_&none $_ «+«flat -w,w,(-w-1,-1,w-1)xx!($_%w==1),(1-w,1,w+1)xx!($_%%w)},i..*}

Cobalah online!

Sean
sumber
0

Bersih , 181 ... 145 byte

import StdEnv
@w i=hd[x+y\\y<-[0,w..],x<-[1..w]|x+y>=i&&[x+y]==[a+b\\a<-[y-w,y,y+w]|a>=0,b<-[x-1..x+1]|0<b&&b<w&&all((<)0o(rem)(a+b))[2..a+b-1]]]

Cobalah online!

Tidak Disatukan:

@ w i
    = hd [
        x+y
        \\ y <- [0, w..]
        ,  x <- [1..w]
        | x+y >= i && [x+y] == [
            a+b
            \\ a <- [y-w, y, y+w]
            | a >= 0
            ,  b <- [x-1..x+1]
            | 0 < b && b < w && all ((<) 0 o (rem) (a+b)) [2..a+b-1]
            ]
        ]
Suram
sumber
0

Jelly ,  30  29 byte

Dugaan saya adalah ini mungkin bisa dikalahkan oleh margin yang adil

ÆPŒR+€×¥+©⁸’:⁹Ġ®ṁLÞṪFÆPS’¬ð1#

Link diadik mengambil idi kiri dan wdi kanan yang mengembalikan prime kesepian.

Cobalah online!

Bagaimana?

ÆPŒR+€×¥+©⁸’:⁹Ġ®ṁLÞṪFÆPS’¬ð1# - Link: i, w                     e.g. 37, 12
                           1# - find the 1st match starting at i and counting up of...
                          ð   - ...everything to the left as a dyadic link
                              - (n = i+0; i+1; ... on the left and w on the right):
ÆP                            -   is i prime: 1 if so, 0 if not     1
  ŒR                          -   absolute range: [-1,0,1] or [0]   [-1,0,1]
       ¥                      -   last two links as a dyad (w on the right):
      ×                       -     multiply (vectorises)           [-12,0,12]
    +€                        -     add for €ach       [[-13,-1,11],[-12,0,12],[-11,1,13]]
                              -     - i.e. the offsets if including wrapping
          ⁸                   -   chain's left argument, i
        +                     -   add                  [[24,36,48],[25,37,49],[26,38,50]]
                              -     - i.e. the adjacents if including wrapping
         ©                    -   copy to the register
           ’                  -   decrement            [[23,35,47],[24,36,48],[25,37,49]]
             ⁹                -   chain's right argument, w
            :                 -   integer division               [[1,2,3],[2,3,4],[2,3,4]]
              Ġ               -   group indices by value         [[1],[2,3]]
                              -     - for a prime at the right this would  be [[1,2],[3]]
                              -     - for a prime not at an edge it would be [[1,2,3]]
               ®              -   recall from register [[24,36,48],[25,37,49],[26,38,50]]
                ṁ             -   mould like           [[24,36,48],[[25,37,49],[26,38,50]]]
                  Þ           -   sort by:
                 L            -     length             [[24,36,48],[[25,37,49],[26,38,50]]]
                   Ṫ          -   tail                             [[25,37,49],[26,38,50]]
                              -     - i.e the adjacents now excluding wrapping
                    F         -   flatten                          [25,37,49,26,38,50]
                     ÆP       -   is prime? (vectorises)           [0,1,0,0,0,0]
                       S      -   sum                              1
                        ’     -   decrement                        0
                         ¬    -   not                              1            
Jonathan Allan
sumber
Dugaan saya apakah ini mungkin dapat dikalahkan oleh margin yang adil , Anda yakin? Ini bukan hal yang mudah untuk bahasa golf.
Erik the Outgolfer
Tidak, tapi saya duga (bahkan) di Jelly (jika tidak sekam !!) bahwa mungkin ada beberapa cara untuk menghemat metode saya, atau bahkan pendekatan yang lebih baik.
Jonathan Allan
0

Java 8, 176 byte

w->i->{for(;;i++)if(p(i)&!(p(i-w)|p(i+w)|i%w>1&(p(i-1)|p(i+~w)|p(i+w-1))|i%w>0&(p(i+1)|p(i+1-w)|p(i-~w))))return i;}boolean p(int n){for(int i=2;i<n;n=n%i++<1?0:n);return n>1;}

Port of Jonathan Frech 'C menjawab .

Cobalah online.

Kevin Cruijssen
sumber