+1 Primzahlen zählen

25

Definieren Sie, dass die natürliche Zahl p eine +1 Primzahl der natürlichen Zahl n ist, wenn p eine Primzahl ist und die Standardbinärdarstellung (dh ohne führende Nullen) von p durch Addieren (dh Voranstellen, Anhängen oder Einfügen) erhalten werden kann. eine einzelne 1 zur binären Standarddarstellung von n .

Zum Beispiel kann die Binärdarstellung von 17 ist 10001 2 . Die verschiedenen natürlichen Zahlen, die durch Addition einer 1 zu 10001 2 gebildet werden können, sind 110001 2 oder 49 , 101001 2 oder 41 , 100101 2 oder 37 und 100011 2 oder 35 .

Unter diesen sind 41 und 37 Primzahlen, also hat 17 zwei +1 Primzahlen .

Aufgabe

Schreiben Sie ein Programm oder eine Funktion, die eine streng positive Ganzzahl n als Eingabe akzeptiert und die Anzahl der eindeutigen + 1-Primzahlen von n ausgibt oder zurückgibt .

Eingabe und Ausgabe müssen entweder eine Ganzzahl oder eine dezimale oder eine unäre Zeichenfolgendarstellung sein.

Es gelten die Standardregeln für .

Testfälle

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
quelle
1
Cool! Wenn ich heute Abend Zeit hätte, würde ich sofort antworten
anOKsquirrel

Antworten:

5

Pyth, 20 Bytes

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

Test Suite

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
quelle
1
Huh, "deduplizieren" ist eigentlich ein Wort.
Lirtosiast
8

JavaScript ES6, 141 Bytes 143 147 160

Spart dank @Naouak 13 Bytes

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

Ähnlich wie bei meiner TeaScript-Antwort wird RegExp (Sie haben mich richtig gehört) verwendet, um nach Primzahlen zu suchen.

Ungolfed

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
quelle
Ich denke, Sie können ein bisschen verkürzen, indem Sie die Primzahl wie (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+$/)
folgt
@ Naouak Super, das spart 13 Bytes! :)
Downgoat
4

Minkolang 0.11 , 54 52 Bytes

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

Erläuterung

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
quelle
Ich bin immer gespannt auf eine andere Minkolang-Version.
Conor O'Brien
4

TeaScript , 22 Bytes

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

TeaScript fängt an, wie APL auszusehen ... Die Sonderzeichen werden in längere, häufig wiederholte Sequenzen konvertiert

Stellen Sie sicher, dass der Online-Dolmetscher "Eingaben sind Zahlen" aktiviert hat.

Erklärung && 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
quelle
Es ist übrigens 31 Bytes, mit gedit auf Xubuntu
Glen O
1
Es sind 31 Bytes mit UTF-8-Codierung, aber 22 Bytes mit ISO-8859-1.
Dennis
4

Julia, 55 52 Bytes

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

k=2.^(0:endof(bin(n)))erzeugt ein Array mit Potenzen von 2 von 1 bis zur höchsten Potenz kleiner als n. 2n+k-n%kverwendet dann Array-Operationen, um alle möglichen "+1-Zahlen" zu bestimmen. (entspricht union, was dasselbe wie uniquein dieser Situation tut ) entfernt die Wiederholungswerte. Dann sum(isprime,)zählt die Anzahl der Primzahlen auf der Liste.

Glen O
quelle
4

CJam, 26 Bytes

Kein Gewinner, aber es schlägt die vorhandenen CJam-Antworten ziemlich solide und es ist das erste Mal, dass ich den Befehl 0.6.5 verwende e\.

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

Teste es hier.

Erläuterung

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.

Bemerkenswert ist, dass wir die Bits bei 0und vertauschen1 vor dem Erstellen der ersten Kopie austauschen, sodass wir das ursprüngliche Array mit dem 1vorangestellten nach vorne verlieren . Die Eingabe ist jedoch immer positiv, sodass die führende Ziffer immer eine ist. Das heißt, nach dem Voranstellen eines anderen beginnt die Ziffernliste immer mit, [1 1 ...]so dass der erste Swap in jedem Fall ein No-Op ist.

Martin Ender
quelle
3

Mathematica, 87 Bytes

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

Julia, 110 108 104 87 Bytes

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

Dadurch wird eine unbenannte Funktion erstellt, die eine Ganzzahl akzeptiert und eine Ganzzahl zurückgibt. Um es zu nennen, geben Sie ihm einen Namen, zf=n->... .

Ungolfed:

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 Bytes gespart dank Glen O!

Alex A.
quelle
binmuss mit einer 1 beginnen, damit Sie nicht separat behandeln müssen "1"b. Und wenn i=length(b), haben Sie b[i+1:end]Äquivalent zu "", so dass Sie diesen Eintrag nicht benötigen (müssen ihn nur b=bin(n)irgendwann bearbeiten ). Und summacht dasselbe wie countfür zwei Bytes weniger.
Glen O
Da Sie einen Bereich über die Länge von bohnehin verwenden, können Sie ihn auch mit einem Trick abrufen - b=bin(n)[s=1:end]und dann for i=szum Verständnis.
Glen O
Sie können auch ein weiteres Byte speichern, indem Sie die Tatsache verwenden, dass das erste Bit in bin1 sein sollte, und Sie erhalten Folgendes: n->sum(i->isprime(parse(Int,i,2)),(b=bin(n);unique([b[[1:i;1;i+1:end]]for i=1:endof(b)])))- Dadurch wird die Anzahl auf 90 Bytes gesenkt.
Glen O
In der Tat, nehmen Sie ein weiteres Byte, durch den Austausch uniquemit union- es wird das gleiche tun, gegeben , wenn nur ein Array als Eingabe. Oder noch besser, anstatt union.
Glen O
@ GlenO Du bist der Meister. Danke, 先生!
Alex A.
2

CJam, 58 Bytes

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

Ich habe einen Tag gebraucht und dies war meine vierte Iteration.

anOKsquirrel
quelle
2

Japt -x , 14 11 Bytes

ƤiX1Ãâ ®Íj

Probieren Sie es aus oder führen Sie alle Testfälle aus

Ƥ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
Zottelig
quelle
1

PHP, 145 Bytes

Ich habe eine neue Zeile für die Lesbarkeit hinzugefügt:

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;}
Schwarzes Loch
quelle
1

CJam, 34 Bytes

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

Probieren Sie es online aus

Erste Version, wird aktualisiert, wenn ich etwas besseres finde.

Reto Koradi
quelle
1

APL, 55

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

2 Bytes kürzere Dyalog-spezifische Version:

{+/2=+/¨0=|⍨∘⍳⍨¨∪⍵{2⊥⍵(↑,(1∘,↓))⍺⊤⍨N⍴2}¨-1-⍳N←1+⌊2⍟⍵}
user46915
quelle
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)))))

  • Mehr Golfen im Gange ...
Abr001am
quelle
1

Brachylog , 17 Bytes

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

Probieren Sie es online!

Eingabe über die Eingabevariable und Ausgabe über die Ausgabevariable.

{             }ᶜ¹    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.
Nicht verwandte Zeichenfolge
quelle