Số nguyên tố cộng với số nguyên tố trừ


35

Hầu hết chúng ta đều biết ...

rằng tất cả các số nguyên tố p>3đều có dạng nhập mô tả hình ảnh ở đây

Nhưng, có bao nhiêu số nguyên tố Plus ( 6n+1) và bao nhiêu là số nguyên tố trừ ( 6n-1) trong một phạm vi nhất định?

Các thách thức

Đưa ra một số nguyên k>5, đếm bao nhiêu primes<=kPlusPrimes và bao nhiêu là MinusPrimes .

Ví dụ

k=100chúng tôi có
[5, 11, 17, 23, 29, 41, 47, 53, 59, 71, 83, 89] 12 MinusPrimes

[7, 13, 19, 31, 37, 43, 61, 67, 73, 79, 97] 11 PlusPrimes

k=149chúng tôi có
[5, 11, 17, 23, 29, 41, 47, 53, 59, 71, 83, 89, 101, 107, 113, 131, 137, 149]
18 MinusPrimes

[7, 13, 19, 31, 37, 43, 61, 67, 73, 79, 97, 103, 109, 127, 139]
15 PlusPrimes

Quy tắc

Mã của bạn phải xuất ra 2 số nguyên : một cho MinusPrimes và một cho PlusPrimes theo bất kỳ thứ tự nào bạn muốn (vui lòng chỉ định đó là số nào).
Đây là : câu trả lời ngắn nhất trong byte thắng!

Các trường hợp thử nghiệm

Đầu vào -> Đầu ra [ MinusPrimes , PlusPrimes ]

6->[1,0]  
7->[1,1]   
86->[11,10]  
986->[86,78]  
5252->[351,344]  
100000->[4806,4784]   
4000000->[141696, 141448]

45
Tôi không biết! :(
Stewie Griffin

13
@StewieGriffin, thật dễ dàng để trực giác nếu bạn nhìn vào chuỗi mô đun: 0%6là bội số của 6, 1%6không thể xác định được, 2%6là bội số của 2, 3%6là bội số của 3, 4%6là bội số của 2 và 5%6không thể xác định được.
zzzzBov

3
@zzzzBov sẽ thực sự hữu ích nếu tôi biết tại sao mô-đun có một chuỗi và ý nghĩa của các số nguyên tố ... Tôi ước trường trung học dạy lý thuyết số ...
Socratic Phoenix

@SocPhoenix, modulus có nghĩa là "phần còn lại sau khi chia". 0, 6, 12, v.v ... tất cả tạo ra 0 sau khi chia cho 6; Tất cả 1, 7, 13 đều tạo ra 1. Vì chúng ta đang tìm kiếm các số không thể chia thành các yếu tố, nên biết rằng một số chia hết cho một số nguyên lớn hơn 1 cho chúng ta biết rằng số đó không phải là số nguyên tố.
zzzzBov

Câu trả lời:




6

Python 2 , 77 byte

-2 byte nhờ Neil

lambda x:[sum(all(n%j for j in range(2,n))for n in range(i,x,6))for i in 7,5]

Hãy thử trực tuyến!

Giải pháp trước đó, 83 81 79 byte

-1 byte nhờ ông Xcoder
-2 byte nhờ Halvard Hummel

lambda x:map([all(n%i for i in range(2,n))*n%6for n in range(4,x)].count,[5,1])

Hãy thử trực tuyến!
Cả hai đầu ra là [MinusPrimes, PlusPrimes]





Tôi đã thực hiện quá nhiều cách hiểu mảng JavaScript - Tôi đã quên rằng danh sách Python thường không cần []s.
Neil

Vì vậy, bạn chia n cho tất cả các số từ i đến n-1 để xem nó có phải là số nguyên tố hay không, sau đó tạo tất cả các số nguyên (5,11, ...) và (7,13, ...) và kiểm tra xem số trong câu hỏi là có, và đếm chúng. Có vẻ hiệu quả. ;)
Yakk

5

Thạch , 7 byte

s6ÆPSm4

Cộng, trừ đi.

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

s6ÆPSm4  Main link. Argument: n

s6       Split [1, ..., n] into chunks of length 6.
  ÆP     Test all integers for primality.
    S    Sum across columns.
         This counts the primes of the form 6k + c for c = 1, ..., 6.
     m4  Take every 4th element, leaving the counts for 6k + 1 and 6k + 5.

5

Toán học, 51 byte

(s=#;Mod[Prime~Array~PrimePi@s,6]~Count~#&/@{5,1})&

Hãy thử trực tuyến!

@ngenisis đánh gôn xuống, tiết kiệm 4 byte

Toán học, 47 byte

sPrime~Array~PrimePi@s~Mod~6~Count~#&/@{5,1}

Modcũng có thể là infix và nếu bạn định đặt tên cho đối số đầu tiên s, chỉ cần sử dụng một đối số có tên:sPrime~Array~PrimePi@s~Mod~6~Count~#&/@{5,1}
ngenisis

5

Japt , 15 13 11 byte

Thứ tự đầu ra là [+,-].

õj ò6 yx ë4

Kiểm tra nó

  • Lấy một số cảm hứng từ giải pháp Dennis 'Jelly , nhưng sau khi chơi golf, nó gần như là một cổng.
  • 2 byte được lưu cảm ơn Oliver mang ëphương thức mà tôi chưa biết trước đây để các mảng chú ý đến tôi.

Giải trình

Đầu vào ngầm định của số nguyên U.

õj

Tạo một mảng các số nguyên ( õ) từ 1 đến Uvà kiểm tra xem mỗi số có phải là số nguyên tố ( j) không, đưa ra một mảng các giá trị booleans.

ò6

Phân vùng mảng thành các mảng con có độ dài 6.

yx

Transpose ( y) và tính tổng các cột.

ë4

Lấy mọi phần tử thứ 4 của mảng và ngầm xuất chúng.


Bản gốc, 19 17 16 15 byte

õ fj
5â £è_%6¥X

Kiểm tra nó

  • 1 byte nhờ một gợi ý được truyền cảm hứng từ Oliver để sử dụng các ước số của 5 sau khi tôi nghỉ ngơi trên vòng nguyệt quế của mình chia 15 thành một mảng.

3

J , 23 byte

1#.5 1=/6|_1 p:@i.@p:>:

Hãy thử trực tuyến!

1#.5 1=/6|_1 p:@i.@p:>:   input: y
          _1       p:     number of primes
                     >:   less than y + 1
             p:@i.        prime range from 0 to that number
        6|                get residues modulo 6
   5 1=/                  table of values equal to 5 or 1
1#.                       sum of each (antibase 1)

3

Võng mạc , 53 51 byte

.+
$*
1
$`1¶
G`1111
A`^(11+)\1+$
1{6}

*M`111
\b1\b

Hãy thử trực tuyến! Giải trình:

.+
$*

Chuyển đổi sang unary.

1
$`1¶

Đếm từ 1 đến n.

G`1111

Xóa các số nhỏ hơn 4.

A`^(11+)\1+$

Xóa số tổng hợp.

1{6}

Lấy phần modulo còn lại 6.

*M`111

In số lượng số còn lại từ 3 đến 5.

\b1\b

In số lượng số còn lại là 1.


3

Ruby, 61 60 byte

(52 byte + 8 cho -rprimescờ)

->n{[1,5].map{|x|(4..n).count{|i|i.prime?&&i%6==x}}}

Trả về một mảng có dạng [cộng các số nguyên tố, trừ các số nguyên tố].

Đã lưu 1 byte nhờ GB!

Hãy thử trực tuyến.


Tôi đã được truyền cảm hứng bởi câu trả lời của bạn và cập nhật của tôi (trong Haskell)!
jferard

@jferard Tôi rất vui khi nghe điều đó! :)
Cristian Lupascu

Bạn có thể sử dụng counttrên phạm vi mà không cần toán tử splat (lưu 1 byte).
GB

3

Perl 6 , 42 byte

Đã lưu 1 byte bằng cách xóa một không gian vô dụng ...

Đã lưu 2 byte bằng cách sắp xếp lại map cuộc gọi - cảm ơn @Joshua.

Đã lưu 3 byte vì .round bằng .round: 1 .

Trên thực tế, số mũ phức tạp là mát mẻ nhưng rất đắt tiền đặc trưng. Đã lưu 10 byte chỉ bằng cách bỏ nó ...

{[+] map {.is-prime*($_%6-1??i!!1)},5..$_}

Hãy thử trực tuyến!

Đây là phiên bản với cấp số nhân phức tạp. (Tôi thích nó quá nhiều để xóa nó.) Phiên bản mới hoạt động chính xác theo cùng một cách, chỉ là số mũ phức tạp được thay thế bằng toán tử ternary ngắn hơn nhiều.

{[+] map {.is-prime*exp(π*($_%6-1)i/8).round},5..$_}

Hãy thử trực tuyến!

Đầu ra là một số phức (PlusPrimes) + (MinusPrimes)i. Tôi hy vọng nó không quá nhiều so với các quy tắc.


Giải thích: Đây là một hàm có một đối số nguyên. Chúng tôi lặp lại tất cả các số nguyên từ 5 đến đối số ( (5..$_)). Đối với mỗi trường hợp này, chúng tôi đánh giá .is-prime(điều này được gọi là $_, đối số của khối được ánh xạ), nhân nó (nếu được số hóa True == 1, False == 0) với một số mũ phức tạp được tạo thành exp(0) = 1(cho $_%6 = 1) hoặcexp(iπ/2) = i (for $_%6 = 5), và cuối cùng làm tròn nó thành số nguyên gần nhất. Tổng kết chúng với [+]kết quả.

Cuối cùng: nó thực sự hiệu quả, vì vậy tôi không chắc TIO sẽ không hết thời gian trước khi bạn nhận được đầu ra cho số cao hơn (trong 1e5, mất 26 giây trên máy của tôi và TIO có xu hướng chậm hơn một chút).


đó là tốt. làm tốt lắm!

Tôi nghĩ rằng bạn có ý nghĩa trong hiệu quả? Phương pháp tốt đẹp mặc dù!
Jonathan Allan

Đó là một nỗ lực thô thiển ở trớ trêu:.
Ramillies

Khi chơi golf, sử dụng các hình thức phương pháp maphoặc grepđôi khi có thể khiến bạn mất một vài ký tự. Điều này giúp tiết kiệm 2 ký tự:{[+] map {.is-prime*exp(π*($_%6-1)i/8).round: 1},5..$_}
Joshua

Quên làm điều đó ở đây, cảm ơn vì đã mang nó đến sự chú ý của tôi!
Ramillies

2

Trên thực tế , 21 byte

u5x`p░⌠6@%1=;`╖*ƒ⌡Ml╜

Hãy thử trực tuyến!

Đầu ra PlusPrimes trước, tiếp theo là MinusPrimes

Giải trình:

u5x`p░⌠6@%1=;`╖*ƒ⌡Ml╜
u5x                    range(5, n+1)
   `p░                 primes in range
      ⌠6@%1=;`╖*ƒ⌡M    for each prime:
       6@%               mod 6
          1=             equal to 1
            ;`╖*ƒ        execute ╖ if p%6==1 (add 1 to register 0, consuming p)
                   l   length of resulting list (MinusPrimes)
                    ╜  push value in register 0 (PlusPrimes)


2

MATLAB 2017a, 29 byte

sum(mod(primes(k),6)'==[5,1])

Giải thích: primes(k)được tất cả các số nguyên tố lên đến và bao gồm k. mod(primes(k),6)'lấy mô-đun 6 của tất cả các số nguyên tố và hoán vị nó để tổng chạy dọc theo chiều chính xác. ==[5,1]đặt tất cả các fives (minusPrimes) thành 1 trong cột đầu tiên và tất cả các fives (plusPrimes) thành 1 trong cột thứ hai.sum()tổng hợp từng cột.

Đầu ra này [minusPrime, plusPrime]


2

Japt , 18 16 byte

-2 byte nhờ @Oliver

õ_j ©Z%6
5â £è¥X

Hãy thử trực tuyến!

Đầu ra ở định dạng [PlusPrimes, MinusPrimes].


Hmm ... Tôi vừa trở lại bàn làm việc, đánh golf xuống 17 byte và sau đó thấy bạn đã đăng bài này ... không biết liệu tôi có nên đăng nó hay không vì mấu chốt của cả hai giải pháp của chúng tôi là ánh xạ [5,1]để có được số lượng và bạn đã đến đó đầu tiên.
Xù xì

@Shaggy IMO giải pháp của bạn có đủ sự khác biệt để duy trì một bài đăng riêng biệt. Bạn đã sử dụng filter và một chuỗi; Tôi đã sử dụng chức năng ánh xạ õvà một mảng. Bên cạnh đó, tôi có [5,1]ý tưởng từ một câu trả lời khác.
Justin Mariner

Tôi sẽ suy nghĩ về nó một chút; các giải pháp trong các ngôn ngữ khác nhau sử dụng các phương pháp tương tự (ngay cả khi một "mượn" nó từ các ngôn ngữ khác) vẫn ổn nhưng 2 giải pháp trong cùng một ngôn ngữ làm như vậy không hoàn toàn phù hợp với tôi. Bây giờ tôi đã chỉnh sửa bài viết của mình như một cách thay thế.
Xù xì

Tôi quyết định chạy với nó và sau đó cạo một byte khác.
Xù xì

Bạn có thể sử dụng để có được[1,5]
Oliver

2

C #, 202 179 174 byte

-23 Byte nhờ ông Xcoder

-5 byte nhờ Cyoce

Hàm trả về một mảng có độ dài 2, [MinusPrimes, PlusPrimes] Thực thi bằng cách gọi a(n).

int[]a(int n){int[]r={0,0};for(int i=5;i<=n;i++)if(i%2*b(i)>0)if(i%6<5)r[1]++;else++r[0];return r;}int b(int n){for(int i=3;i-2<Math.Sqrt(n);i+=2)if(n%i<1)return 0;return 1;}

Mã được định dạng chính xác trên Dùng thử trực tuyến: Tại đây


Bạn có thể thêm một liên kết tio?
Ông Xcoder

Xin lỗi vì chơi golf byte-to-byte, 194 byte:public int[]a(int n){int[]r=new int[2];for(int i=5;i<=n;i++)if(i%2*b(i)>0)if(i%6<5)r[1]++;else++r[0];return r;}public int b(int n){for(int i=3;i<=Math.Sqrt(n)+1;i+=2)if(n%i<1)return 0;return 1;}
Ông Xcoder

193 byte:public int[]a(int n){int[]r=new int[2];for(int i=5;i<=n;i++)if(i%2*b(i)>0)if(i%6<5)r[1]++;else++r[0];return r;}public int b(int n){for(int i=3;i-2<Math.Sqrt(n);i+=2)if(n%i<1)return 0;return 1;}
Ông Xcoder

lmao youre
love

1
cảm ơn vì tất cả sự giúp đỡ, vì youve đã đăng một câu trả lời riêng biệt và tuyên bố đó là một sân golf của tôi, tôi sẽ rời khỏi tôi và tham gia các bài học cho thử thách tiếp theo: P
MysticVagabond

2

Haskell , 81 69 byte

f n=(\r->sum[1|i<-[2..n],all((>0).rem i)[2..i-1],rem i 6==r])<$>[5,1]

Hãy thử trực tuyến!

Giải pháp đầu tiên là:

r!l=sum[1|i<-l,rem i 6==r]
f n|l<-[i|i<-[2..n],all((>0).rem i)[2..i-1]]=(5!l,1!l)

Nhưng tôi đã đọc câu trả lời của w0lf trong Ruby ...


1

Bình thường , 15 byte

/K%R6fP_TSQ5/K1

Phòng thử nghiệm.

Bình thường , 16 byte

m/%R6fP_TSQd,1 5

Phòng thử nghiệm.


Làm sao?

Giải thích số 1

/ K% R6fP_TSQ5 / K1 - Chương trình đầy đủ.

     fP_TSQ - Lọc các số nguyên tố trong phạm vi [1 ... đầu vào].
  % R6 - Mod 6 trên mỗi.
 K - Gán chúng cho một biến K.
/ 5 - Đếm số lần xuất hiện của 5 trong K.
            / K1 - Đếm số lần xuất hiện của 1 trong K.
                - Hoàn toàn xuất kết quả.

Giải thích số 2

m /% R6fP_TSQd, 1 5 - Chương trình đầy đủ.

     fP_TSQ - Lọc các số nguyên tố trong phạm vi [1 ... đầu vào]
  % R6 - Mod 6 trên mỗi.
            , 1 5 - Đẩy danh sách [1, 5]
m / d - Đếm xem có bao nhiêu trong số đó.  
                 - Hoàn toàn xuất kết quả. 

Lựa chọn thay thế:

/ K% R6fP_TSQ5 / KhZ (16 byte)
K% R6fP_TSQ / K5 / K1 (16 byte)
m /% R6fP_TSQdj15T (16 byte)
m /% R6fP_TSQd [1 5 (16 byte)   
m /% R6fP_TSQdsM`15 (17 byte)
m /% R6.MP_ZSQd, 1 5 (17 byte)
m /% R6.MP_ZSQdj15T (17 byte)
m /% R6.MP_ZSQd [1 5 (17 byte)

2
Chúc mừng 10k !!
Luis Mendo

@LuisMendo Cảm ơn rất nhiều :-)
Ông Xcoder

1

Thạch ,  12 11  10 byte

Cảm ơn @cairdcoinheringaahing về một số mẹo trong trò chuyện. Cảm ơn @Dennis vì đã lưu một byte trong trò chuyện.

ÆR%6ċЀ1,5

Hãy thử trực tuyến!

Thạch , 11 byte

ÆR%6µ1,5=þS

Hãy thử trực tuyến!

Thạch , 11 byte

ÆR%6µċ5,ċ1$

Hãy thử trực tuyến!


Cái này hoạt động ra sao?

Giải thích số 1

ÆR%6ċЀ1,5   As usual, full program.

ÆR           Get all the primes in the range [2...input].
  %6         Modulo each by 6.
       1,5   The two-element list [1, 5].
    ċЀ      Count the occurrences of each of ^ in the prime range.

Giải thích số 2

ÆR%6µ1,5=þS   As usual, full program.

ÆR            Get all the primes in the range [2...input].
  %6          Modulo each by 6.
    µ         Chain separator.
     1,5      The two-element list [1, 5].
        =     Equals?   
         þ    Outer product.     
          S   Sum.

Giải thích số 3

ÆR%6µċ5,ċ1$   As usual, full program.

ÆR            All the primes in the range [2...input].
  %6          Modulo each by 6.
    µ     $   Some helpers for the chains.
       ,      Two element list.
     ċ5       The number of 5s.
        ċ1    The number of 1s.

1

Java 8, 141 140 138 106 101 100 96 94 81 byte

n->{int r[]={0,0},c;for(;n-->4;r[n%6/4]+=c)for(c=n;c>1;c=c-1&~n%c>>-1);return r;}

Trả về một mảng số nguyên có hai giá trị, theo thứ tự đảo ngược so với mô tả thách thức :
[plusPrime, minusPrime].

Câu trả lời C # của @Xynos , sau khi tôi đánh gôn 39 40 42 byte.
Trợ giúp rất lớn từ @Nevay cho một con số khổng lồ -55 byte.

Giải trình:

Hãy thử nó ở đây. (Trường hợp thử nghiệm cuối cùng 4000000vượt quá giới hạn thời gian 60 giây một chút.)

n->{                   // Method with integer parameter and integer-array return-type
  int r[]={0,0},       //  Return integer-array, starting at [0,0]
      c;               //  Temp integer
  for(;n-->4;          //  Loop (1) as long as the input is larger than 4
                       //  and decrease `n` by 1 before every iteration
      r[n%6/4]+=c)     //    After every iteration, increase the plus or minus prime by `c`
                       //    (where `c` is either 0 or 1)
    for(c=n;           //   Reset `c` to `n`
        c>1;           //   And inner loop (2) as long as `c` is larger than 1
      c=               //    Change `c` to:
        c-1&~n%c>>-1;  //     inverting the bits of `n`,                    [~n]
                       //     modulo-`c` that result,                       [%c]
                       //     then bit-shift right that by -1,              [>>-1]
                       //     and then bitwise-AND that result with `c-1`   [c-1&]
    );                 //   End of inner loop (2)
                       //  End of loop (1) (implicit / single-line body)
  return r;            //  Return result integer-array
}                      // End of method

1
106 byte:n->{int r[]={0,0},i=4,j,c;for(;i++<n;){for(j=c=1;j*j<i;)c=i%(j+=2)<1?0:c;if(i%2*c>0)r[i%6%5]++;}return r;}
Nevay

1
101 byte:n->{int r[]={0,0},i=4,j,c;for(;i++<n;r[i%6%5%2]-=-i%2*c>>-1)for(j=c=1;j*j<i;)c|=i%(j+=2)-1;return r;}
Nevay

1
96 byte: n->{int r[]={0,0},i=4,j,c;for(;i++<n;r[i%6%5%2]+=i&c)for(j=c=1;j*j++<i;)c&=-i%++j>>-1;return r;}(-1 nhờ vào của bạn j++,++j)
Nevay

1
94 byte: n->{int r[]={0,0},i=4,j,c;for(;i++<n;r[i%6/4]+=i&c)for(j=c=1;j*j++<i;)c&=-i%++j>>-1;return r;}( [plusPrime, minusPrime]).
Nevay

1
81 byte:n->{int r[]={0,0},c;for(;n-->4;r[n%6/4]+=c)for(c=n;c>1;)c=c-1&~n%c>>-1;return r;}
Nevay

1

JavaScript (ES6), 83 82 80 68 66 byte

Hóa ra một giải pháp hoàn toàn đệ quy là nhiều ngắn hơn so với việc lập bản đồ một mảng!

Thứ tự đầu ra là [-,+]. Craps out với một lỗi tràn ở đâu đó khoảng 3490.

f=(n,a=[0,0])=>n>4?f(n-1,a,(g=y=>n%--y?g(y):y<2)(n)&&++a[n%6%5]):a

Thử nó

o.innerText=(

f=(n,a=[0,0])=>n>4?f(n-1,a,(g=y=>n%--y?g(y):y<2)(n)&&++a[n%6%5]):a

)(i.value=6);oninput=_=>o.innerText=i.value>5?f(+i.value):[0,0]
<input id=i min=6 type=number><pre id=o>


0

CJam , 19 byte

ri){mp},6f%_5e=p1e=

Chương trình lấy đầu vào từ STDIN và xuất hai số được phân tách bằng dòng mới thông qua STDOUT.

Hãy thử trực tuyến!

Giải trình

ri){mp},6f%_5e=p1e=

ri                        Read integer k
  )                       Add 1
       ,                  Filter the (implicit) array [0 1 ... k] ...
   {mp}                   ... on the function "is prime"
         f                Map over the resulting array...
          %               ... the function "modulus" ...
        6                 ... with extra parameter 6
           _              Duplicate the resulting array
             e=           Count occurrences ...
            5             ... of number 5
               p          Print with newline
                 e=       Count occurrences ...
                1         ... of number 1. Implicitly display

0

R + số , 66 60 58 40 byte

-16 byte nhờ Jarko Dubbeldam! Sau đó tôi đã đánh gôn thêm hai byte.

cat(table(numbers::Primes(4,scan())%%6))

In PlusPrimes MinusPrimesra thiết bị xuất chuẩn; đọc từ stdin.

tablelập bảng đếm số lần xuất hiện của các giá trị trong vectơ đầu vào của nó, theo thứ tự tăng dần của giá trị. Do đó, vì chỉ có hai giá trị, cụ thể là 15(mod 6), đây chính là chức năng chúng ta cần, cùng với numbers::Primes, mà trả về tất cả các số nguyên tố giữa 4và đầu vào.

Hãy thử trực tuyến!

Cơ sở R , 97 91 89 86 65 byte

một bó byte được lưu bởi Jarko ở đây, quá

function(n)table((5:n)[sapply(5:n,function(x)all(x%%2:x^.5))]%%6)

Điều này gần giống với ở trên, ngoại trừ nó tính toán tất cả các số nguyên tố trong cơ sở R thay vì sử dụng một gói và nó trả về theo đầu ra của hàm thay vì in ra. Bạn có thể thấy trong đầu ra nó trả về một bảng có tên 15, với số đếm bên dưới.

Hãy thử trực tuyến!



(Dennis đã thêm số vào TIO, để nó hoạt động ngay bây giờ :))
JAD


all(x%%2:x^.5>0), bất cứ điều gì khác đều là sự thật, vì vậy all(x%%2:x^.5)cũng hoạt động
JAD

@JarkoDubbeldam rất hay! Hóa ra vì tất cả các giá trị đều lớn hơn mức 4chúng ta có thể loại bỏ >4vì chúng ta sẽ không còn 2ở đó như một nguyên tố nữa, vì vậy, golf này thay vào đó là 40 byte.
Giuseppe


0

JavaScript (SpiderMonkey) , 151 , 140 , 131 byte

n=>[...Array(n+1).keys()].splice(5).filter(a=>!/^1?$|^(11+?)\1+$/.test("1".repeat(a))).reduce((r,a)=>(a%6<2?r[1]++:r[0]++,r),[0,0])

Hãy thử trực tuyến!

Cảm ơn shaggy đã giúp sửa lỗi và chơi gôn.

Giải trình:

n=>                                                   // Create a lambda, taking n
    [...Array(n+1).keys()]                            // Create a list from 0 to n+1
        .splice(5)                                    // remove first five elements
        .filter(a=>                                   // filter the list to get primes
             !/^1?$|^(11+?)\1+$/.test("1".repeat(a))) // using the famous regex here: https://stackoverflow.com/questions/2795065/how-to-determine-if-a-number-is-a-prime-with-regex 
        .reduce((r,a)=>                               // reduce the list
           (a%6<2?r[1]++:r[0]++,r),                   // by counting plus primes
           [0,0])                                     // and minus primes

1
Retturns 17,15cho 149 (Nên 18,15). Bạn cần tăng kích thước của mảng lên 1: TIO . Ngẫu nhiên, đây chỉ là "vanilla" ES6, không có gì cụ thể đối với SpiderMonkey trong đó. Ngoài ra, bạn có thể sử dụng Stack Snippets cho JS, thay vì TIO. Và, bạn có rất nhiều không gian bạn có thể loại bỏ.
Xù xì

1
Một vài khoản tiết kiệm nhanh khác dành cho bạn, để giúp bạn giảm xuống còn 131 byte .
Xù xì

@Shaggy Tôi không nhận ra bạn có thể sử dụng giảm như thế.
Pureferret
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.