计算+1个素数


25

定义的自然数p是一个1素的自然数的Ñ如果p是素数和标准二进制表示(即,无前导零)的p可以通过添加(即,在前面加上,附加或插入)来获得n的标准二进制表示形式的单个1

例如,17的二进制表示为10001 2。可以通过添加来形成不同的自然数110001 2110001 249101001 241100101 237,和100011 235

其中4137是质数,因此17具有两个+1质数

任务

编写一个接受严格正整数n作为输入并打印或返回n的不同+1素数的程序或函数。

输入和输出必须是整数或其十进制或一进制字符串表示形式。

适用标准规则。

测试用例

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
凉!如果我今晚有时间,我现在就回答
ansquisrel 2015年

Answers:


5

Pyth,20个字节

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

测试套件

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
呵呵,“重复数据删除”实际上是一个词。
lirtosiast,2015年

8

的JavaScript ES6,141字节143 147 160

由于@Naouak,节省了13个字节

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

与TeaScript答案类似的方法,使用RegExp(您没听错)检查素数。

不打高尔夫球

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

我认为您可以像这样缩短一些质数检查,(p=(n,c)=>n%c!=0?c>=n-1?1:p(n,++c):0)('0b'+l,2)而不是!Array(+('0b'+l)+1).join(1).match(/^1?$|^(11+?)\1+$/)
Naouak

@Naouak很棒,可以节省13个字节!:)
Downgoat

4

Minkolang 0.1154 52个字节

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

说明

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.

我总是很高兴地说另一个Minkolang版本。
Conor O'Brien

4

TeaScript,22 个字节

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

TeaScript开始看起来像APL ...特殊字符被转换为更长的,通常重复的序列

在线口译员一定要选中“输入就是数字”。

说明&&取消高尔夫

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.

顺便说一下,它是31字节,在Xubuntu上使用gedit
Glen O

1
UTF-8编码为31个字节,ISO-8859-1为22个字节。
丹尼斯

4

朱莉娅,55 52字节

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

k=2.^(0:endof(bin(n)))生成一个数组,该数组包含从1到小于的最高幂的2的幂n2n+k-n%k然后使用数组运算来确定所有可能的“ +1数字”。(等效于unionunique在这种情况下的作用相同)删除重复值。然后sum(isprime,)计算列表上的素数。


4

CJam,26个字节

不是赢家,但是它确实击败了现有的CJam答案,这是我第一次使用0.6.5命令e\

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

在这里测试。

说明

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.

值得注意的是,我们在制作第一个副本之前01之后交换位,因此我们丢失了带有1前置字符的原始数组。但是,输入始终为正,因此前导数字始终为1。这意味着在添加另一个数字之后,数字列表将始终以该数字开头,[1 1 ...]因此在任何情况下第一次交换都将是空操作。


3

Mathematica,87个字节

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

3

利亚,110个 108 104 87字节

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

这将创建一个未命名的函数,该函数接受和整数并返回一个整数。要给它起个名字,例如f=n->...

取消高尔夫:

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

感谢Glen O,节省了17个字节!


bin必须以1开头,因此您无需单独处理"1"b。而当时i=length(b),您将具有b[i+1:end]等同于"",因此无需该条目(只需要b=bin(n)在某个时候处理)。并且sum将执行与count减少两个字节相同的操作。
Glen O

另外,由于您将要在整个长度范围内使用范围b,因此不妨花点技巧来获得它- b=bin(n)[s=1:end]然后for i=s进行理解。
Glen O

您还可以通过使用第一个位bin应为1 的事实来保存另一个字节,您将得到以下信息:n->sum(i->isprime(parse(Int,i,2)),(b=bin(n);unique([b[[1:i;1;i+1:end]]for i=1:endof(b)])))-这将使计数减少到90个字节。
Glen O

实际上,如果替换unique为另一个字节,union则将其替换为-如果只给定一个数组作为输入,它将执行相同的操作。还是更好,而不是union
Glen O

@GlenO你是主人。谢谢先生!
Alex A.

2

CJam,58个字节

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

这花了我一天的时间,这是我的第四次迭代。


2

Japt -x14 11字节

ƤiX1Ãâ ®Íj

尝试运行所有测试用例

ƤiX1Ãâ ®Íj     :Implicit input of integer U
Æ               :Map each X in the range [0,U)
 ¤              :  Convert U to binary string
  iX1           :  Insert "1" at 0-based index X
     Ã          :End map
      â         :Deduplicate
        ®       :Map
         Í      :  Convert to decimal
          j     :  Is prime?
                :Implicit output of array sum

1

PHP,145字节

我添加了换行符以提高可读性:

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⍟⍵}

Dyalog特定版本短2个字节:

{+/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)))))

  • 更多高尔夫运动正在进行中...

1

Brachylog,17个字节

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

在线尝试!

通过输入变量输入,通过输出变量输出。

{             }ᶜ¹    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.


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.