Скільки унікальних праймес?


14

Один із способів представити натуральне число - це множення показників простих чисел. Наприклад, 6 може бути представлено 2 ^ 1 * 3 ^ 1, а 50 може бути представлено 2 ^ 1 * 5 ^ 2 (де ^ вказує на експоненцію). Кількість простих розмірів у цьому поданні може допомогти визначити, чи коротше використовувати цей метод подання, порівняно з іншими методами. Але оскільки я не хочу обчислювати їх вручну, мені потрібна програма, щоб це зробити для мене. Однак, оскільки мені доведеться запам'ятати програму, поки я не повернуся додому, вона повинна бути якомога коротшою.

Ваше завдання:

Напишіть програму або функцію, щоб визначити, скільки існує чітких простих простих чисел у цьому поданні числа.

Вхід:

Ціле число n таке, що 1 <n <10 ^ 12, взято будь-яким нормальним методом.

Вихід:

Кількість виразних простих ліній, необхідних для представлення вхідних даних, як зазначено у вступі.

Випробування:

24      -> 2 (2^3*3^1)
126     -> 3 (2^1*3^2*7^1)
1538493 -> 4 (3^1*11^1*23^1*2027^1)
123456  -> 3 (2^6*3^1*643^1)

Це OEIS A001221 .

Оцінка:

Це , найнижчий бал у виграші байтів!


3
Стільки головних питань останнім часом! Я це люблю.
— Джузеппе


3
Причиною, що стоїть перед головою, може бути його тривіальність. Наскільки я міг бачити, є 3 ситуації, що стосуються мов гольфу: 1. вбудований 2. ланцюжок з двох вбудованих 3. ланцюжок з 3 вбудованих (у мене особисто три відповіді на 2 байти); Я не знаю, чи це є вагомою причиною пориву, але це можлива причина
— Містер Xcoder

1
Це могло б бути, але я вдячний, якби хтось із трьох поточників прокоментував мені це. Незважаючи на те , що в мовах гольфу це банально, є кілька цікавих рішень на мовах, що не належать до гольфу, які я хотів побачити, коли опублікував це завдання. Зрештою, на сайті є багато проблем, які є тривіальними для гольфлангів, але створюють цікаві рішення, що не стосуються гольфу.
— Грифон

1
Було б вигідно включити прем'єр в тестові випадки. Також деякі мови / підходи важко перевірити для великої кількості. Кілька менших тестових випадків було б непогано.
— Денніс

Відповіді:


6

MATL , 4 3 байти

-1 байт завдяки Луїсу Мендо

YFz

Спробуйте в Інтернеті!

YF         Exponents of prime factors
  z        Number of nonzeros

Оригінальна відповідь:

Yfun

Спробуйте в Інтернеті!

Верна Yfunвідповідь.

          (Implicit input)
Yf         Prime factorization
  u        Unique
   n       Numel
           (Implicit output)

1
Чому весело? - ;-)
— Адам

1
Закреслено 4 все ще регулярно 4
— Грифон


5

Математика, 7 байт

PrimeNu

Так, є вбудований.

Математика, 21 байт

Length@*FactorInteger

Довгий шлях навколо.


У чому причина зірочки? Чи не Length@FactorIntegerте саме?
— числовий маніяк

1
Length@*FactorIntegerвиробляє чисту функцію: склад Lengthі FactorInteger. Я можу визначитись, fun=Length@*FactorIntegerа потім зателефонувати fun[1001]. З іншого боку, Length@FactorIntegerозначало б Length[FactorInteger]і оцінити 0.
— Міша Лавров


4

Python 2, 56 байт

f=lambda n,p=2,k=1:n/p and[f(n,p+1),k+f(n/p,p,0)][n%p<1]

Це посилання відповіді Денніса тут досяжна?
— Джонатан Аллан

1
@JonathanAllan Так, модифіковано, щоб замість цього рахувати унікальні прості фактори.
— orlp

4

Сітківка , 31 30 байт

&`(?!(11+)\1+$)(11+)$(?<=^\2+)

Введення не одинакове.

Дякуємо @MartinEnder за гольф на 1 байт!

Спробуйте в Інтернеті!(включає перетворювач від десяткового до одинарного)

Як це працює

Оскільки програма складається з одного регулярного вираження з &модифікатором, Retina просто підраховує кількість збігів, що перекриваються . Вхід передбачається, що складається з n повторень з 1 і нічого іншого.

Негативний показник

(?!(11+)\1+$)

збіги в місцях між 1 -ю, за якими не слідують два або більше 1 -х ( 11+), з подальшим одним або декількома повторами з такою ж кількістю 1 's ( \1+), з подальшим закінченням введення ( $).

Будь-яке складене число аб з а, Ь> 1 можна записати в вигляді б повторень через повторення 1 , так що випередження відповідають тільки розташування з подальшим р повтореннями 1 , де р = 1 або р є простим числом.

Регекс

(11+)$

гарантує p> 1 , вимагаючи принаймні двох 1 's ( 11+) і зберігає хвіст 1 ' s у другій групі захоплення (\2 ).

Нарешті, позитивний погляд позаду

(?<=^\2+)

перевіряє, що весь вхід складається з випадків kp ( k ≥ 1 ) з 1 , перевіряючи це p ділить вхід.

Таким чином, кожній відповідності відповідає унікальний простий дільник p .


4

Утиліти Bash + GNU, 33

  • 1 байт збережено завдяки @Dennis
factor|grep -Po ' \d+'|uniq|wc -l

Спробуйте в Інтернеті .

Пояснення

factor|                            # Split input into prime factors
       grep -Po ' \d+'|            # group factors onto lines
                       uniq|       # remove duplicates
                            wc -l  # count the lines

1
grep -Po ' \d+'економить байт tr \ \\n|sed 1d.
— Денніс

На жаль, grep -Po '( \d+)\1*'не вдається ввести 46 .
— Денніс

@ Денніс спасибі - я виправив це за допомогою вашої оригінальної пропозиції
— Digital Trauma

3

Желе , 3 байти

досить нудна відповідь ...

ÆFL

Монадійне посилання, що приймає номер і повертає число

Спробуйте в Інтернеті!

Як?

ÆFL - Link: number, n
ÆF  - prime factorisation as a list of prime, exponent pairs
  L - length

1
Як ти сумував Æv?
— моє займенник monicareinstate

Це було легко - я ніколи не користувався цим і не шукав список у вікі.
— Джонатан Аллан

Як ви набираєте символи желе без списку атомів та списку кліків?
— мій займенник monicareinstate

1. Æце alt код 0198. 2. Ви можете встановити клавіатуру (у мене немає). 3. Кодова сторінка.
— Джонатан Аллан



3

Аліса , 10 байт

/o
\i@/Dcd

Спробуйте в Інтернеті!

Пояснення

/o
\i@/...

Це лише стандартна основа для лінійних арифметично-важких програм, які потребують десяткових вводу-виводу. Фактична сама програма тоді просто:

Dcd

Що робить:

D    Deduplicate prime factors. Does what it sounds like: for every p^k which
     is a divisor n, this divides n by p^(k-1).
c    Push the individual prime factors of n. Since we've deduplicated them
     first, the number of factors is equal to the value we're looking for.
d    Push the stack depth, i.e. the number of unique prime factors.

3

JavaScript 45 байт

* Для @SEJPM вимагайте пояснення: що я тут роблю, це перехід від 2 - n (що змінюється, і врешті-решт стане найбільшим головним фактором) - тепер, якщо поточне число ділиться ni, хочете порахувати його лише один раз (навіть хоча це може бути коефіцієнт 2 * 2 * 2 * 3 - 2 рахується один раз) - так "j" приходить до картини, коли j не вказано у виклику фунції - j отримає значення " undefined ", а коли n% i == 0, то я викликаю функцію з j = 1 у наступному дзвінку) - і тоді я додаю лише 1, коли j дорівнює невизначеному, що є! j + Функція (n / i, i, ( j = 1 або просто 1)). Я не змінююсь я в цьому питанні, тому що він все ще може бути розділений на i знову (2 * 2 * 3), але тоді j буде дорівнює 1, і це не вважатиметься фактором. сподіваюся, я пояснив це досить добре.

P=(n,i=2,j)=>i>n?0:n%i?P(n,i+1):!j+P(n/i,i,1)

console.log(P(1538493)==4);
console.log(P(24)==2);
console.log(P(126)==3);
console.log(P(123456)==3);

якщо останній прайм дуже великий, він матиме максимум стеків викликів - якщо його проблема, я можу зробити ітеративний


Ви б не хотіли написати пояснення до цієї відповіді? З іншого боку, відповіді використовують звичайний підхід.
— SEJPM

@SEJPM я додав там деякі пояснення
— DanielIndie

1
FYI, ми можемо вважати нескінченну кількість викликів / нескінченних ресурсів для більшості проблем із кодовим гольфом (в основному, якщо в питанні не вказано інше).
— Джонатан Аллан








2

R + numbers, 30 14 bytes

16 bytes removed thanks to @Giuseppe

numbers::omega

Also, here is the Try it online!! link per @Giuseppe.


You may omit the f=function(x) and the (x) as numbers::omega is a function already. However, as numbers is not standard for R, you should make your answer "R + numbers". Also, you should include a TIO link. Still, +1, very nice.
— Giuseppe

@Giuseppe, you are too nice. Thanks for your help. BTW, in addition to some of your insightful answers, I checked out Tips for golfing in R, as you suggested. There are some real gems there. Anywho, I will update my answer with your recommendations. Also, your MATL solution is very nice (+1 yesterday).
— Joseph Wood

NP, feel free to ping me in chat or comment on an answer of mine if you have questions.
— Giuseppe

@Giuseppe is there a meta consensus on needing to explicitly state "R + numbers"? It seems like if we state the additional package then we should be able to save the bytes of explicitly calling it with numbers::. Otherwise, to me it's the same as using an import in any other language.
— BLT

(scrolls down and sees a python example of this...) I guess I'm wondering about a broader meta consensus, then. It just sort of seems silly to me.
— BLT



1

Haskell, 58 bytes

-4 bytes thanks to @Laikoni

f n=sum[1|x<-[2..n],gcd x n>1,all((>)2.gcd x)[2..x-1]]

Try it online!

Explanation

Essentially generates all primes at most as large as n and filters them for being a factor of n and then takes the length of the result.

f n=                                                   -- main function
    sum[                                             ] -- output the length of the list
        1|x<-[2..n],                                   -- consider all potential primes <=n
                                                       -- and insert 1 into the list if predicates are satisfied
                    gcd x n>1,                         -- which are a factor of n
                              all(          )[2..x-1]  -- and for which all smaller numbers satisfy
                                  (>)2.                -- 2 being larger than
                                       gcd x           -- the gcd of x with the current smaller number

You can use sum[1|x<- ... ] instead of length.
— Laikoni


1

ARBLE, 28 bytes

len(unique(primefactors(n)))

Try it online!

This is a very literal solution


I was looking at this and going "Hey, wait a minute, this is a snippet!" And then I see... is this supposed to be a non-esoteric language with implicit IO?!
— totallyhuman

@icrieverytim Congratulations, you have discovered one of the main reasons this language exists.
— ATaco


0

Python 2,  63  55 bytes

A much more interesting answer...

-8 bytes thanks to Jonathan Frech (use an argument with a default for the post-adjustment of the result of primes from 0 to 1 -- much better than a wrapping lambda!!)

f=lambda n,o=1:sum(n%i+f(i,0)<1for i in range(2,n))or o

A recursive function taking a positive integer, n, and returning a positive integer, the count.

Try it online! Really inefficient, don't even bother with the other test cases.



@JonathanFrech Thanks, that is much cleaner.
— Jonathan Allan

0

J, 12 bytes

{:@$@(__&q:)

q: is J's prime exponents function, giving it the argument __ produces a matrix whose first row is all nonzero prime factors and whose 2nd row is their exponents.

We take the shape $ of that matrix -- rows by columns -- the number of columns is the answer we seek.

{: gives us the last item of this two items (num rows, num columns) list, and hence the answer.

Try it online!



0

Javascript ES6, 56 chars

n=>eval(`for(q=2,r=0;q<=n;++q)n%q||(n/=q,r+=!!(n%q--))`)

Test:

f=n=>eval(`for(q=2,r=0;q<=n;++q)n%q||(n/=q,r+=!!(n%q--))`)
console.log([24,126,1538493,123456].map(f)=="2,3,4,3")

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