Đếm số nguyên tố +1


25

Xác định rằng số tự nhiên psố nguyên tố +1 của số tự nhiên n nếu p là số nguyên tố và biểu diễn nhị phân chuẩn (nghĩa là không có số 0 đứng đầu) của p có thể thu được bằng cách thêm (ví dụ: thêm trước, thêm hoặc thêm) một đơn 1 để biểu diễn nhị phân chuẩn n .

Ví dụ: biểu diễn nhị phân của 1710001 2 . Các số tự nhiên riêng biệt có thể được hình thành bằng cách thêm 1 đến 10001 2110001 2 hoặc 49 , 101001 2 hoặc 41 , 100101 2 hoặc 37100011 2 hoặc 35 .

Trong số này, 4137 là số nguyên tố, vì vậy 17 có hai số nguyên tố +1 .

Bài tập

Viết chương trình hoặc hàm chấp nhận số nguyên dương n nghiêm ngặt làm đầu vào và in hoặc trả về số lượng các số nguyên tố +1 riêng biệt của n .

Đầu vào và đầu ra phải là một số nguyên hoặc biểu diễn chuỗi thập phân hoặc đơn nguyên của nó.

Tiêu chuẩn quy tắc áp dụng.

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

Input:  4
Output: 0

Input:  1
Output: 1

Input:  17
Output: 2

Input:  33
Output: 3

Input:  553
Output: 4

Input:  3273
Output: 5

Input:  4145
Output: 6

Input:  4109
Output: 7

Input:  196869
Output: 8

1
Mát mẻ! Nếu tôi có thời gian tối nay tôi sẽ trả lời ngay bây giờ
anOKsquirrel 7/11/2015

Câu trả lời:


5

Bình thường, 20 byte

s/LPd{mij\1c.BQ]d2hQ

Phòng thử nghiệm

s/LPd{mij\1c.BQ]d2hQ
                        Q = eval(input())
      m           hQ    For insertion position in [0 ... Q]
            .BQ         Convert Q to binary string
           c   ]d       Chop at insertion position
        j\1             Join on '1'
       i         2      Convert to integer
     {                  Deduplicate
 /LPd                   Map each number to the number of times it occurs in its
                        prime factorization, e.g. whether or not it is prime.
s                       Sum and print.

1
Huh, "lặp lại" thực sự là một từ.
lirtosiast

8

JavaScript ES6, 141 byte 143 147 160

Lưu 13 byte, nhờ @Naouak

n=>[...t=n.toString(2)].map((l,i)=>t.slice(0,v=i+1)+1+t.slice(v)).filter((l,i,a)=>a.indexOf(l)==i&&(p=(n,c)=>n%c&&c>n-2||p(n,++c))('0b'+l,2))

Phương pháp tương tự với câu trả lời TeaScript của tôi, sử dụng RegExp (bạn đã nghe tôi nói đúng) để kiểm tra các số nguyên tố.

Bị đánh cắp

n=>
   [...t = n.toString(2)]                  // To binary
   .map((l,i)=>                            // Make cycles
               t.slice(0, v = i+1)
               + 1
               + t.slice(v)
   ).filter((l,i,a)=>  
                     a.indexOf(l) == i &&  // Remove Duplicates
                     (p=(n,c)=>            // Prime checking
                               n % c &&
                                 c > n - 2 ||
                                 p(n,++c)
                     )('0b'+l,2)
   ).length

Tôi nghĩ bạn có thể rút ngắn một chút kiểm tra số nguyên tố như thế này: (p=(n,c)=>n%c!=0?c>=n-1?1:p(n,++c):0)('0b'+l,2)thay vì!Array(+('0b'+l)+1).join(1).match(/^1?$|^(11+?)\1+$/)
Naouak

@Naouak Tuyệt vời mà tiết kiệm được 13 byte! :)
Hạ cấp

4

Chồn 0,11 , 54 52 byte

n1(2*d0c`,)(0c1c$%$r2*1c*1c++1g2:d1G)rxSI1-[0g2M+]N.

Giải trình

n             Get integer from input (let's call it n)
1(       )    Get the smallest power of 2 (say, k) greater than input (starting with 1)
  2*d         Multiply by 2 and duplicate
     0c`,     Copy n and see if it's greater (while loop breaks on 0)

(0c1c$%                       Copy n, copy k, and divmod (pushes n//k, n%k)
       $r                     Swap top two elements
         2*                   Multiply by 2
           1c*                Copy k and multiply
              1c+             Copy k and add
                 +            Add
                  1g2:        Get k and divide by 2
                      d1G)    Duplicate and put one copy back in its former place

rx            Reverse and dump (dumps n and top of stack is now 0)
S             Remove duplicates
I1-[     ]    Check each element for primality
    0g        Get potential prime from bottom of stack
      2M      1 if prime, 0 otherwise
        +     Add (this is why I didn't dump the left-over 0 earlier)
N.            Output as integer and stop.

Tôi luôn hào hứng nói một phiên bản khác của Minkolang.
Conor O'Brien

4

TeaScript , 22 byte

x÷¿®x÷E(i¬,1)¤©d¡F(¥)n

TeaScript bắt đầu trông giống APL ... Các ký tự đặc biệt được chuyển đổi thành các chuỗi dài hơn, thường được lặp lại

Thông dịch viên trực tuyến hãy chắc chắn kiểm tra "Đầu vào là số."

Giải thích && Ungolfed

xT(2)s``m(#P(xT(2)E(i+1,1),2))d()F($P)n

xT(2)      // Take input, convert to binary
s``m(#     // Loop over input

  P(         // Convert to decimal...
     xT(2)     // Input to binary
     E(i+1,1)  // Inset 1 into (above) at current index in loop
  ,2)    

)d()       // Remove duplicates
F($P)      // Filter items that aren't prime
n          // Grab length.

Nhân tiện, nó là 31 byte, sử dụng gedit trên Xubfox
Glen O

1
Đó là 31 byte với mã hóa UTF-8, nhưng 22 byte với ISO-8859-1.
Dennis

4

Julia, 55 52 byte

n->sum(isprime,∪(2n+(k=2.^(0:endof(bin(n))))-n%k))

k=2.^(0:endof(bin(n)))tạo ra một mảng chứa các lũy thừa từ 2 đến 1 với công suất cao nhất nhỏ hơn n. 2n+k-n%ksau đó sử dụng các phép toán mảng để xác định tất cả các "số +1" có thể. (tương đương với union, điều tương tự như uniquetrong tình huống này) sẽ loại bỏ các giá trị lặp lại. Sau đó sum(isprime,)đếm số lượng các số nguyên tố trong danh sách.


4

CJam, 26 byte

Không phải là người chiến thắng, nhưng nó đánh bại các câu trả lời của CJam hiện tại khá chắc chắn và đây là lần đầu tiên tôi sử dụng lệnh 0.6.5 e\.

1ri2b+_,{_)e\_}%_&{2bmp},,

Kiểm tra nó ở đây.

Giải trình

1       e# Push a 1 (this is the 1 we'll be inserting everywhere).
ri      e# Read input and convert to integer.
2b      e# Convert to base 2.
+       e# Prepend the 1.
_,      e# Duplicate and get the number of bits N.
{       e# Map this block over i from 0 to N-1...
  _)    e#   Create a copy and increment to i+1.
  e\    e#   Swap the bits at positions i and i+1, moving the 1 one step through the array.
  _     e#   Duplicate so we keep this version on the stack.
}%
_&      e# Remove duplicates via set intersection with itself.
{       e# Filter the remaining digit lists based on this block...
  2b    e#   Convert bits back to an integer.
  mp    e#   Test for primality.
},
,       e# Get the length of the remaining list.

Một điều đáng chú ý là chúng tôi trao đổi các bit tại 01trước khi tạo bản sao đầu tiên, vì vậy chúng tôi mất mảng ban đầu với phần được đặt 1trước ở phía trước. Tuy nhiên, đầu vào luôn luôn dương, vì vậy chữ số hàng đầu sẽ luôn là một. Điều đó có nghĩa là sau khi chuẩn bị một số khác, danh sách chữ số sẽ luôn bắt đầu bằng [1 1 ...]vì vậy lần hoán đổi đầu tiên sẽ là không có trong mọi trường hợp.


3

Toán học, 87 byte

Union[#~FromDigits~2&/@StringReplaceList[#~IntegerString~2,a_:>a<>"1"]]~Count~_?PrimeQ&

3

Julia, 110 108 104 87 byte

n->sum(i->isprime(parse(Int,i,2)),(b=bin(n);∪([b[[1:i;1;i+1:end]]for i=1:endof(b)])))

Điều này tạo ra một hàm không tên chấp nhận và số nguyên và trả về một số nguyên. Để gọi nó, đặt tên cho nó, vd f=n->....

Ung dung:

function f(n::Integer)
    # Get the binary representation of n as a string
    b = bin(n)

    # Construct an array consisting of binary strings with
    # a one prepended, appended, and each insertion
    x = [b[[1:i; 1; i+1:end]] for i = 1:endof(b)]

    # Count the number of primes
    c = sum(i -> isprime(parse(Int, i, 2)), unique(x))

    return c
end

Đã lưu 17 byte nhờ Glen O!


binphải bắt đầu bằng 1, vì vậy bạn không cần phải xử lý riêng "1"b. Và khi nào i=length(b), bạn sẽ có b[i+1:end]tương đương "", vì vậy không cần mục đó (chỉ cần xử lý b=bin(n)tại một số điểm). Và sumsẽ làm điều tương tự như countđối với hai byte ít hơn.
Glen O

Ngoài ra, vì dù sao bạn cũng sẽ sử dụng một phạm vi trong suốt chiều dài b, nên cũng có thể lấy nó với một chút mẹo - b=bin(n)[s=1:end]và sau đó là for i=sđể hiểu.
Glen O

Bạn cũng có thể lưu một byte khác bằng cách sử dụng thực tế là bit đầu tiên binphải là 1 và bạn sẽ nhận được điều này: n->sum(i->isprime(parse(Int,i,2)),(b=bin(n);unique([b[[1:i;1;i+1:end]]for i=1:endof(b)])))- điều này làm cho số đếm giảm xuống 90 byte.
Glen O

Trong thực tế, tắt thêm một byte, bằng cách thay thế uniquebằng union- nó sẽ làm điều tương tự, nếu chỉ được cung cấp một mảng làm đầu vào. Hoặc tốt hơn, thay vì union.
Glen O

@GlenO Bạn là chủ. Cảm ơn bạn, 先生!
Alex A.

2

CJam, 58 byte

L{:TQ\=A+Q\+TWe\-2<s:~2b}q~2b0+:Q,(%{:BLe=!{B+:L}&}%~:mp:+

Điều này khiến tôi mất một ngày và đây là lần lặp thứ 4 của tôi.



1

PHP, 145 byte

Tôi đã thêm một dòng mới để dễ đọc:

function($n){for($b=base_convert;++$i<=strlen($s=$b($n,10,2));$r+=!$s[$i]&$k<=$j)
for($j=1;($k=$b(substr_replace($s,1,$i,0),2,10))%++$j;);echo$r;}


1

APL, 55

{+/{2=+/0=⍵|⍨⍳⍵}¨∪⍵{2⊥(⍵↑X),1,⍵↓X←⍺⊤⍨N⍴2}¨-1-⍳N←1+⌊2⍟⍵}

Phiên bản dành riêng cho Dyalog ngắn hơn 2 byte:

{+/2=+/¨0=|⍨∘⍳⍨¨∪⍵{2⊥⍵(↑,(1∘,↓))⍺⊤⍨N⍴2}¨-1-⍳N←1+⌊2⍟⍵}

1

Matlab (120)

n=input('');a=dec2bin(n);g=arrayfun(@(x)bin2dec(cat(2,a(1:x),49,a(x+1:end))),1:log2(n));nnz(unique(g(find(isprime(g)))))

  • Chơi gôn nhiều hơn trong tiến trình ...

1

Brachylog , 17 byte

{ḃ~c₂{,1}ʰc~ḃṗ}ᶜ¹

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

Đầu vào thông qua biến đầu vào và đầu ra thông qua biến đầu ra.

{             }ᶜ¹    Count every unique
             ṗ       prime number
           ~ḃ        the binary representation of which is
 ḃ                   the binary representation of the input
  ~c₂                partitioned into two (possibly empty) lists
     {  }ʰ           with the first list
      ,1             having a 1 appended
          c          and the two lists then being concatenated back into one.


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.