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
Dennis
la source
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.
isaacg
la source
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
Downgoat
la source
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.
El'endia Starman
la source
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.
Downgoat
la source
Glen O
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.

Glen O
la source
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.

Martin Ender
la source
3

Mathematica, 87 octets

Union[#~FromDigits~2&/@StringReplaceList[#~IntegerString~2,a_:>a<>"1"]]~Count~_?PrimeQ&
LegionMammal978
la source
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!

Alex A.
la source
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.

anOKsquirrel
la source
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
Hirsute
la source
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;}
Trou noir
la source
1

CJam, 34 octets

li2b_,),\f{_2$<@@>1\++}_&2fb{mp},,

Essayez-le en ligne

La première version sera mise à jour si je trouve quelque chose de mieux.

Reto Koradi
la source
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⍟⍵}
user46915
la source
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 ...
Abr001am
la source
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.
Chaîne indépendante
la source