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


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.