Compter +1 nombres premiers


25

Définissez que le nombre naturel p est un nombre premier +1 du nombre naturel n si p est un nombre premier et que la représentation binaire standard (c'est-à-dire sans zéros non significatifs) de p peut être obtenue en ajoutant (c'est-à-dire en ajoutant, en ajoutant ou en ajoutant) un seul 1 à la représentation binaire standard de n .

Par exemple, la représentation binaire de 17 est 10001 2 . Les nombres naturels distincts qui peuvent être formés en ajoutant 1 à 10001 2 sont 110001 2 ou 49 , 101001 2 ou 41 , 100101 2 ou 37 et 100011 2 ou 35 .

Parmi ceux-ci, 41 et 37 sont des nombres premiers, donc 17 a deux nombres premiers +1 .

Tâche

Écrivez un programme ou une fonction qui accepte en entrée un entier strictement positif n et imprime ou renvoie le nombre de nombres premiers +1 distincts de n .

L'entrée et la sortie doivent être soit un entier, soit sa représentation sous forme de chaîne décimale ou unaire.

Les règles de standard s'appliquent.

Cas de test

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
Cool! Si j'avais le temps ce soir, je répondrais tout de suite
anOKsquirrel

Réponses:


5

Pyth, 20 octets

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

Suite de tests

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, "dédupliquer" est en fait un mot.
lirtosiast

8

JavaScript ES6, 141 octets 143 147 160

Économise 13 octets, grâce à @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))

Méthode similaire à ma réponse TeaScript, utilise RegExp (vous m'avez bien entendu) pour vérifier les nombres premiers.

Non golfé

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

Je pense que vous pouvez raccourcir un peu la vérification de prime comme ceci: (p=(n,c)=>n%c!=0?c>=n-1?1:p(n,++c):0)('0b'+l,2)au lieu de!Array(+('0b'+l)+1).join(1).match(/^1?$|^(11+?)\1+$/)
Naouak

@Naouak Awesome qui économise 13 octets! :)
Downgoat

4

Minkolang 0,11 , 54 52 octets

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

Explication

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.

J'ai toujours hâte de dire une autre version de Minkolang.
Conor O'Brien

4

TeaScript , 22 octets

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

TeaScript commence à ressembler à APL ... Les caractères spéciaux sont convertis en séquences plus longues et souvent répétées

L'interprète en ligne doit vérifier "les entrées sont des nombres".

Explication && 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.


1
C'est 31 octets avec le codage UTF-8, mais 22 octets avec ISO-8859-1.
Dennis

4

Julia, 55 52 octets

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

k=2.^(0:endof(bin(n)))génère un tableau contenant les puissances de 2 de 1 à la puissance la plus élevée inférieure à n. 2n+k-n%kutilise ensuite les opérations de tableau pour déterminer tous les "numéros +1" possibles. (équivalent à union, qui fait la même chose que uniquedans cette situation) supprime les valeurs de répétition. sum(isprime,)Compte ensuite le nombre de nombres premiers sur la liste.


4

CJam, 26 octets

Pas un gagnant, mais il bat les réponses CJam existantes assez solidement et c'est la première fois que j'utilise la commande 0.6.5 e\.

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

Testez-le ici.

Explication

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.

Une chose à noter est que nous échangeons les bits au 0et 1avant de faire la première copie, nous perdons donc le tableau d'origine avec le 1préfixé à l'avant. Cependant, l'entrée est toujours positive, donc le premier chiffre sera toujours un. Cela signifie qu'après en avoir ajouté un autre, la liste des chiffres commencera toujours par, [1 1 ...]donc le premier échange sera un no-op dans tous les cas.


3

Mathematica, 87 octets

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

3

Julia, 110 108 104 87 octets

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

Cela crée une fonction sans nom qui accepte et entier et renvoie un entier. Pour l'appeler, donnez-lui un nom, par exemple f=n->....

Non golfé:

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

17 octets enregistrés grâce à Glen O!


bindoit commencer par un 1, vous n'avez donc pas besoin de gérer séparément "1"b. Et quand i=length(b), vous aurez l' b[i+1:end]équivalent de "", donc pas besoin de cette entrée (juste besoin de gérer b=bin(n)à un moment donné). Et sumfera la même chose que countpour deux octets de moins.
Glen O

De plus, puisque vous allez utiliser une plage sur la longueur de btoute façon, il pourrait aussi bien l'obtenir avec un peu d'astuce - b=bin(n)[s=1:end]et ensuite for i=spour la compréhension.
Glen O

Vous pouvez également enregistrer un autre octet en utilisant le fait que le premier bit bindoit être 1, et vous obtiendrez ceci: n->sum(i->isprime(parse(Int,i,2)),(b=bin(n);unique([b[[1:i;1;i+1:end]]for i=1:endof(b)])))- cela ramène le décompte à 90 octets.
Glen O

En fait, enlevez un octet de plus, en le remplaçant uniquepar union- il fera la même chose, s'il ne reçoit qu'un seul tableau en entrée. Ou mieux encore, au lieu de union.
Glen O

@GlenO Vous êtes le maître. Merci, 先生!
Alex A.

2

CJam, 58 octets

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

Cela m'a pris un jour et c'était ma 4ème itération.


2

Japt -x , 14 11 octets

ƤiX1Ãâ ®Íj

Essayez-le ou exécutez tous les cas de test

Ƥ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 octets

J'ai ajouté une nouvelle ligne pour la lisibilité:

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

Version spécifique Dyalog 2 octets plus courte:

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

  • Plus de golf en cours ...

1

Brachylog , 17 octets

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

Essayez-le en ligne!

Entrée via la variable d'entrée et sortie via la variable de sortie.

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


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.