Підрахунок +1 простих


25

Визначте, що натуральне число p є +1 простим числом натурального числа n, якщо p є простим числом, а стандартне двійкове подання (тобто без провідних нулів) p може бути отримане шляхом додавання (тобто попереднього додавання, додавання чи вставки) одинарне 1 до стандартного двійкового подання n .

Наприклад, двійкове представлення 17 дорівнює 10001 2 . Виразні натуральні числа, які можна утворити додаванням 1 до 10001 2, - це 110001 2 або 49 , 101001 2 або 41 , 100101 2 або 37 , і 100011 2 або 35 .

Серед них 41 і 37 - прості числа, тож у 17 є два +1 простих числа .

Завдання

Написати програму або функцію , яка приймає строго натуральне число п в якості вхідних даних і виводить або повертає число різних +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
Класно! Якби я встиг сьогодні ввечері, я відповів би прямо зараз
anOKsquirrel

Відповіді:


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

8

JavaScript ES6, 141 байт 143 147 160

Заощаджує 13 байт, завдяки @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))

Подібний метод до моєї відповіді 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 Awesome, що економить 13 байт! :)
Downgoat

4

Мінколанг 0,11 , 54 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 ... Спеціальні символи перетворюються на більш довгі, часто повторювані послідовності

Онлайн-перекладач обов'язково перевірте "Введення - це цифри".

Пояснення && 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.

Це, до речі, 31 байт, використовуючи gedit на Xubuntu
Glen O

1
Це 31 байт з кодуванням UTF-8, але 22 байти з ISO-8859-1.
Денніс

4

Джулія, 55 52 байти

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

k=2.^(0:endof(bin(n)))генерує масив, що містить потужність 2 від 1 до найвищої потужності менше, ніж n. 2n+k-n%kпотім використовує операції з масивом для визначення всіх можливих "+1 номерів". (еквівалентно тому union, що робить те саме, що і uniqueв цій ситуації) видаляє значення повтору. Потім 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.

Варто зазначити одне, що ми поміняємо місцями на біти 0 і 1перед тим, як зробити першу копію, тому ми втрачаємо оригінальний масив 1заздалегідь наперед. Однак введення завжди позитивне, тому провідною цифрою завжди буде одна. Це означає, що після попереднього вибору іншого, список цифр завжди починатиметься, [1 1 ...]тому перший своп буде необов’язковим у будь-якому випадку.


3

Математика, 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

Збережено 17 байт завдяки Glen O!


binповинен починатися з 1, тому вам не потрібно окремо обробляти "1"b. І коли i=length(b), у вас буде b[i+1:end]рівнозначно "", тому немає необхідності в цьому записі (просто потрібно обробити b=bin(n)в якийсь момент). І sumзробить те саме, що і countдля двох менших байтів.
Глен О

Крім того, оскільки ви все bодно будете використовувати діапазон по всій довжині , ви можете отримати його ще трохи хитрості - b=bin(n)[s=1:end]і тоді for i=sдля розуміння.
Глен О

Ви також можете зберегти інший байт, скориставшись тим, що перший біт у bin1 повинен бути 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 байт.
Глен О

Насправді зніміть ще один байт, замінивши uniqueна union- це зробить те саме, якщо буде вказано лише один масив як вхідний. Або ще краще замість цього union.
Глен О

@GlenO Ти господар. Дякую, 先生!
Олексій А.

2

CJam, 58 байт

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

Це займало у мене день, і це була моя четверта ітерація.



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

2 байти коротша версія для Dyalog:

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

1

Матлаб (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

Брахілог , 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.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.