Це число послідовних простих / постійних-експонентів?


22

Деякий час тому я подивився на основну факторизацію 27000:

27000 = 2 3 × 3 3 × 5 3

Про це є дві особливі речі:

  • послідовно-прем'єр : Прими послідовні: 2 - перший прайм, 3 - другий прайм, 5 - третій прайм.
  • константа-експонент : Експонент однаковий для кожного простого (завжди 3)

Математично виражені:

Ціле число x - число послідовних простих / постійних-експонентів, якщо існують суворо додатні цілі числа n , k , m такі, що x = p n m × p n +1 m × ... × p n + k m , де p j - j -й прем'єр

Ваше завдання - перевірити, чи відповідає додатне ціле число цим умовам.

Вхід:

Позитивне ціле число> 1, у будь-якій розумній формі.

Вихід:

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

Корпуси кромки:

  • праймери є істиною, так як факторизація для простого p дорівнює p 1
  • інші числа, які можна записати як p m, де p є простим, також є правдою.

Правила:

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

Тестові приклади:

Truthy:

2
3
4
5
6
7
8
9
11
13
15
27000
456533

Фальсі:

10
12
14
72
10000000

Ось сценарій python, що генерує деякі тестові випадки.

Те, що я прийняв відповідь, не означає, що виклик закінчений; переможець ще може змінитися!


Ви можете, мабуть, дійти до іншого способу, створивши список усіх таких чисел і перевіривши, чи є вхідні дані в списку
Інженер Тост

@EngineerToast Є нескінченно багато правдивих цифр, хоча.
Алексіс Олсон

@AlexisOlson Безумовно, але скінченна, яку можна розглядати як цілі числа на багатьох мовах.
Інженер Тост

Ваш математичний вираз має Pj, не стосується x = Pn^mчастини. Я припускаю, що ти мав на увазі, що Пн - це n-й прем'єр
Веска

@Veskah n має конкретне значення (індекс першого простого ділення x ), тому сказати, що Pn є n -м простим , незручно, якщо ви також хочете зрозуміти, що Pn + 1 є n + 1 -простим простим.
Денніс

Відповіді:



7

Regex (ECMAScript), 276 205 201 193 189 байт

Порівнювання множинності (експонентів) різних простих факторів є цікавою проблемою для вирішення за допомогою регулярного виразів ECMAScript - відсутність зворотних посилань, що зберігаються через ітерації циклу, стає завданням рахувати що завгодно. Навіть якщо підрахунок відповідної числової ознаки є можливим, часто більш опосередкований підхід сприяє кращому гольфу.

Як і в інших моїх регламентах ECMA, я попереджую спойлер: я настійно рекомендую навчитися вирішувати одинакові математичні задачі в регулярному виразі ECMAScript. Це була захоплююча подорож для мене, і я не хочу її зіпсувати нікому, хто, можливо, захоче спробувати його сам, особливо тим, хто цікавиться теорією чисел. Перегляньте це попереднє повідомлення, щоб ознайомитися зі списком рекомендованих послідовно позначених спойлерами проблем, які потрібно вирішити по черзі.

Тож не читайте більше, якщо ви не хочете, щоб якась просунута онірна регекс-магія зіпсована для вас . Якщо ви дійсно хочете зняти цю магію самостійно, я настійно рекомендую почати з вирішення деяких проблем у регулярному вираженні ECMAScript, як описано у цій публікації, що пов’язана вище.

Основна корисна навантаження з попередньо розробленого я регулярного виразу виявилася дуже застосовною для цього завдання. Це саме регулярний вираз, який знаходить прайм (и) найбільшої кратності . Моє перше рішення для цього було дуже довгим, і я пізніше гольфував його поетапно, спочатку переписав його на використання молекулярного пошуку , а потім переніс його на звичайний ECMAScript, використовуючи вдосконалену техніку, щоб подолати відсутність молекулярного пошуку , а згодом гольф вниз, щоб бути набагато меншим, ніж оригінальне звичайне рішення ECMAScript.

Частина цього регексу, що застосовується до цієї проблеми, є першим кроком, який знаходить Q, найменший фактор N, що ділиться на всі його основні фактори. Після того, як ми отримаємо це число, все, що нам потрібно зробити, щоб показати, що N - число "постійного показника", - це ділити N на Q, поки ми не зможемо більше; якщо результат дорівнює 1, всі прайми мають однакову кратність.

Подавши відповідь, використовуючи попередньо розроблений алгоритм пошуку Q, я зрозумів, що його можна обчислити зовсім по-іншому: Знайдіть найбільший квадратний вільний коефіцієнт N (використовуючи той самий алгоритм, що і мій регекс числа Carmichael ). Як виявляється, це зовсім не створює труднощів * з точки зору подолання нестачі молекулярної розвідки та змінної довжини позаду (не потрібно застосовувати вдосконалену раніше техніку), і на 64 байти коротше! Крім того, це виключає складність трактування N без прямокутника і простого N як різних спеціальних випадків, видаляючи з цього рішення ще 7 байт.

(Досі залишаються інші проблеми, для яких потрібна вдосконалена техніка, яка раніше використовувалася для гольфу для обчислення Q, але наразі жодна з них не представлена ​​моїми повідомленнями про PPCG.)

Я ставлю тест на кратність перед тестом послідовних праймес, оскільки останній значно повільніше; введення тестів, які можуть вийти з ладу швидше, спочатку робить регекс швидше для рівномірного розподілу введення. Також гольф краще поставити на перше місце, тому що він використовує більше зворотних посилань (що коштувало б дорожче, якби вони були двозначними).

Мені вдалося скинути 4 байти з цього регулярного виразу (193 → 189) за допомогою трюку, знайденого Гримі, який може в подальшому скоротити поділ у випадку, якщо коефіцієнт гарантовано буде більшим або рівним дільнику.

^(?=(|(x+)\2*(?=\2$))((?=(xx+?)\4*$)(?=(x+)(\5+$))\6(?!\4*$))*x$)(?=.*$\2|((?=((x*)(?=\2\9+$)x)(\8*$))\10)*x$)(?!(((x+)(?=\13+$)(x+))(?!\12+$)(x+))\11*(?=\11$)(?!(\15\14?)?((xx+)\18+|x?)$))

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

# For the purposes of these comments, the input number = N.
^

# Assert that all of N's prime factors are of equal multiplicity
# Step 1: Find Q, the largest square-free factor of N (which will also be the smallest
# factor of N that has all the same prime factors as N) and put it in \2.
# If N is square-free, \2 will be unset.
(?=
    # Search through all factors of N, from largest to smallest, searching for one that
    # satisfies the desired property. The first factor tried will be N itself, for which
    # \2 will be unset.
    (|(x+)\2*(?=\2$))     # for factors < N: \2 = factor of N; tail = \2
    # Assert that tail is square-free (its prime factors all have single multiplicity)
    (
        (?=(xx+?)\4*$)    # \4 = smallest prime factor of tail
        (?=(x+)(\5+$))    # \5 = tail / \4 (implicitly); \6 = tool to make tail = \5
        \6                # tail = \5
        (?!\4*$)          # Assert that tail is no longer divisible by \4, i.e. that that
                          # prime factor was of exactly single multiplicity.
    )*x$
)
# Step 2: Require that either \2 is unset, or that the result of repeatedly
# dividing tail by \2 is 1.
(?=
    .*$\2
|
    (
        # In the following division calculation, we can skip the test for divisibility
        # by \2-1 because it's guaranteed that \2 <= \8. As a result, we did not need to
        # capture \2-1 above, and can use a better-golfed form of the division.
        (?=
            (              # \8 = tail / \2
                (x*)       # \9 = \8-1
                (?=\2\9+$)
                x
            )
            (\8*$)         # \10 = tool to make tail = \8
        )
        \10               # tail = \8
    )*
    x$                    # Require that the end result is 1
)

# Assert that there exists no trio of prime numbers such that N is divisible by the
# smallest and largest prime but not the middle prime.
(?!
    (                          # \11 = a factor of N
        (                      # \12 = a non-factor of N between \11 and \13
            (x+)(?=\13+$)      # \13 = a factor of N smaller than \11
            (x+)               # \14 = tool (with \15) to make tail = \13
        )
        (?!\12+$)
        (x+)                   # \15 = tool to make tail = \12
    )
    \11*(?=\11$)               # tail = \11

    # Assert that \11, \12, and \13 are all prime
    (?!
        (\15\14?)?             # tail = either \11, \12, or \13
        ((xx+)\18+|x?)$
    )
)


* Він все ще чистіший з молекулярною виворітною головкою, без особливого випадку для N, що не має площі. Це падає 6 байт, даючи 195 187 183 байт розчин:

^(?=(?*(x+))\1*(?=\1$)((?=(xx+?)\3*$)(?=(x+)(\4+$))\5(?!\3*$))*x$)(?=((?=((x*)(?=\1\8+$)x)(\7*$))\9)*x$)(?!(((x+)(?=\12+$)(x+))(?!\11+$)(x+))\10*(?=\10$)(?!(\14\13?)?((xx+)\17+|x?)$))

# For the purposes of these comments, the input number = N.
^

# Assert that all of N's prime factors are of equal multiplicity
# Step 1: Find Q, the largest square-free factor of N (which will also be the smallest
# factor of N that has all the same prime factors as N) and put it in \1.
(?=
    (?*(x+))              # \1 = proposed factor of N
    \1*(?=\1$)            # Assert that \1 is a factor of N; tail = \1
    # Assert that tail is square-free (its prime factors all have single multiplicity)
    (
        (?=(xx+?)\3*$)    # \3 = smallest prime factor of tail
        (?=(x+)(\4+$))    # \4 = tail / \3 (implicitly); \5 = tool to make tail = \4
        \5                # tail = \4
        (?!\3*$)          # Assert that tail is no longer divisible by \3, i.e. that that
                          # prime factor was of exactly single multiplicity.
    )*x$
)
# Step 2: Require that the result of repeatedly dividing tail by \1 is 1.
(?=
    (
        # In the following division calculation, we can skip the test for divisibility
        # by \1-1 because it's guaranteed that \2 <= \8. As a result, we did not need to
        # capture \1-1 above, and can use a better-golfed form of the division.
        (?=
            (             # \7 = tail / \1
                (x*)      # \8 = \7-1
                (?=\1\8+$)
                x
            )
            (\7*$)        # \9 = tool to make tail = \7
        )
        \9                # tail = \7
    )*
    x$                    # Require that the end result is 1
)

# Assert that there exists no trio of prime numbers such that N is divisible by the
# smallest and largest prime but not the middle prime.
(?!
    (                          # \10 = a factor of N
        (                      # \11 = a non-factor of N between \10 and \12
            (x+)(?=\12+$)      # \12 = a factor of N smaller than \10
            (x+)               # \13 = tool (with \14) to make tail = \12
        )
        (?!\11+$)
        (x+)                   # \14 = tool to make tail = \11
    )
    \10*(?=\10$)               # tail = \10

    # Assert that \10, \11, and \12 are all prime
    (?!
        (\14\13?)?             # tail = either \10, \11, or \12
        ((xx+)\17+|x?)$
    )
)

Ось воно переноситься на змінну довжину позаду:

Regex (ECMAScript 2018), 198 195 194 186 182 байт

^(?=(x+)(?=\1*$)(?<=^x((?<!^\5*)\3(?<=(^\4+)(x+))(?<=^\5*(x+?x)))*))((?=((x*)(?=\1\8+$)x)(\7*$))\9)*x$(?<!(?!(\14\16?)?((xx+)\12+|x?)$)(?<=^\13+)((x+)(?<!^\15+)((x+)(?<=^\17+)(x+))))

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

# For the purposes of these comments, the input number = N.
^

# Assert that all of N's prime factors are of equal multiplicity
# Step 1: Find Q, the largest square-free factor of N (which will also be the smallest
# factor of N that has all the same prime factors as N) and put it in \1.
(?=
    (x+)(?=\1*$)      # \1 = factor of N; head = \1
    (?<=              # This is evaluated right-to-left, so please read bottom to top.
        ^x
        (
            (?<!^\5*)        # Assert that head is no longer divisible by \6, i.e. that
                             # that prime factor was of exactly single multiplicity.
            \3               # head = \4
            (?<=(^\4+)(x+))  # \4 = head / \5 (implicitly); \3 = tool to make head = \4
            (?<=^\5*(x+?x))  # \5 = smallest prime factor of head
        )*
    )
)
# Step 2: Require that the result of repeatedly dividing tail by \1 is 1.
(
    # In the following division calculation, we can skip the test for divisibility
    # by \1-1 because it's guaranteed that \2 <= \8. As a result, we did not need to
    # capture \1-1 above, and can use a better-golfed form of the division.
    (?=
        (             # \7 = tail / \1
            (x*)      # \8 = \7-1
            (?=\1\8+$)
            x
        )
        (\7*$)        # \9 = tool to make tail = \7
    )
    \9                # tail = \7
)*
x$                    # Require that the end result is 1

# Assert that there exists no trio of prime numbers such that N is divisible by the
# smallest and largest prime but not the middle prime.
# This is evaluated right-to-left, so please read bottom to top, but switch back to
# reading top to bottom at the negative lookahead.
(?<!
    # Assert that \13, \15, and \17 are all prime.
    (?!
        (\14\16?)?           # tail = either \13, \15, or \17
        ((xx+)\12+|x?)$
    )

    (?<=^\13+)
    (                        # tail = \13
        (x+)                 # \14 = tool to make tail = \15
        (?<!^\15+)
        (
            (x+)             # \16 = tool (with \14) to make tail = \17
            (?<=^\17+)(x+)   # \17 = a factor of N smaller than \13
        )                    # \15 = a non-factor of N between \13 and \17
    )                        # \13 = a factor of N
)

Ви можете замінити .*$\2на\2^
H.PWiz

Хоча, я вважаю, це справедливо:^(?=(|(x+)\2*(?=\2$))(((?=(xx+?)\5*$)(?=(x+)(\6+$))\7(?!\5*$))*x$))(?!(((xx+)(?=\10+$)(x+))(?!\9+$)(x+))\8*(?=\8$)(?!(\12\11?)?(xx+)\14+$))((?=((x*)(?=\2\17+$)x)(\16*$))\19)*\3$
H.PWiz

Не здається близьким до оптимального, хоча
H.PWiz

6

Желе , 13 6 5 байт

ÆEt0E

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

Ще перевершив ... (дякую Еріку за -1 байт)


Пояснення

ÆE     # get a list of prime exponents (noooo long builtin name)
  t0   # remove zeroes on both sides (leading or trailing)
    E  # all remaining elements are equal

œl-> t. Немає жодних причин, щоб у виводі ÆE були присутні нульові нулі.
Ерік Аутгольфер


@dylnan Це не вдається для 2250 року .
Денніс

@Dennis Спасибі, я зрозумів, що це не спрацює, але сподіваюся, що це надихне рішення на чотири байти
dylnan

6

JavaScript (ES6), 87 байт

Повертає 0 для трибути або ненульове ціле число для помилки.

f=(n,k=2,j,i)=>n%k?j*(P=d=>k%--d?P(d):d==!i)(k)|j-i|(n>1&&f(n,k+1,j||i)):f(n/k,k,j,-~i)

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

Прокоментував

f = (                     // f() = recursive function taking:
  n,                      //   n = input
  k = 2,                  //   k = current factor
  j,                      //   j = reference exponent, initially undefined
  i                       //   i = current exponent, undefined each time we start testing
) =>                      //       the next factor
  n % k ?                 // if k is not a divisor of n:
    j * (                 //   ignore the primality of k if j is still undefined
      P = d =>            //     P() = function testing if k is prime:
        k % --d ?         //       decrement d; if d is not a divisor of k:
          P(d)            //         do a recursive call until it is
        :                 //       else:
          d == !i         //         unless i is already defined: d must not be equal to 1
                          //         (if it is: k is the next prime but does not divide n)
    )(k) |                //   initial call to P() with d = k
    j - i | (             //   if both i and j are defined, they must be equal
      n > 1 &&            //   if n is not yet equal to 1,
      f(n, k + 1, j || i) //   go on with k + 1; if j is undefined, set it to i
    )                     //   (otherwise, stop recursion and return what we have)
  :                       // else:
    f(n / k, k, j, -~i)   //   increment the current exponent and go on with n / k

Це було порушено зміною j||iна i. Зараз це дає безліч хибних позитивних результатів.
Deadcode

@Deadcode Я не можу це перевірити чи виправити на даний момент, тому наразі я просто відкатився.
Арнольд

5

CJam , 30 29 байт

{mFz~)-!\__W=,\0=>\-:mp1#W=&}

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

Моя перша відповідь після майже 2 (!) - року перерви, тому, можливо, можна пограти більше. Це блок, який приймає введення як ціле число (також може бути відображений для масивів цілих чисел).

Пояснення

{        e# Begin block
 mF      e# Factor input, giving an array of primes and their powers
 z~      e# Transpose and dump, giving an array of primes and an array of powers
 )-      e# Check that the powers are the same: subtract each power from the last element
 !       e# Negate to make sure they're all 0
 \__W=,  e# Get the range from 0 to the largest prime minus one
 \0=>    e# Slice that array so it only includes everything larger than the smallest prime
 \-      e# Remove the original primes from the range array
 :mp     e# Check each element for primality. If the input's primes are consecutive,
         e# this will contain no primes
 1#W=    e# Make sure a "1" is not found
 &       e# If the powers are the same AND primes are consecutive, return 1. Otherwise, 0.
}

5

Стакс , 5 6 байт

╣♥qJ╬c

Запустіть і налагоджуйте його

Розпакований, неозорений та прокоментований, це виглядає приблизно так.

|n    get the exponents of the prime factorization
0:D   trim leading zeroes
:u    array has exactly a single distinct element

Редагувати: це не працює 512. Я дам трохи думки та, сподіваюся, виправлення пізніше. Це працює зараз.


3

Стакс , 9 байт

1 - правдивий, 0 - хибний

αAG<└\{┬⌠

Запустіть і налагоджуйте його

Пояснення

|nX0-u%x:^=      # Full Program, unpacked, implicit input
|n               # Exponents of sequential primes in factorization. (eg. 20 -> [2 0 1])
  X              # Save to X register
   0-            # Remove all '0' from array
     u%          # Get unique numbers and get length of array
       x         # Copy back the array saved to X
        :^       # Is it ascending
         =       # Are the two comparisons equal? implicit output

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


3

MATL , 12 11 10 байт

YFtgYsg)Zs

Спробуйте в MATL Online!

Дякуємо Луїсу Мендо за частину, що вилучає нулі. Він також зазначив, що дозволяється змінювати значення правди, тому це повертає 0 для чисел, які задовольняють вимоги виклику та будь-яке додатне значення в іншому випадку.

Grosso Modo, це генерує показники послідовного просте множення, видаляє провідні нулі та обчислює стандартне відхилення.


Я думаю, що 0iYFhdzпрацює на 7 байт: додайте 0 до показників послідовної факторизації, послідовних відмінностей, кількості не нулів. Результат - 1iff input задовольняє вимогу
Луїс Мендо

@LuisMendo Вибачте за затримку відповіді, але ви можете опублікувати її як окрему відповідь. Це, безумовно, дуже різне.
Містер Xcoder

Гаразд, я опублікував це як відповідь
Луїс Мендо

3

Java 10, 223 191 178 176 168 байт

n->{var s=new java.util.HashSet();for(int f=1,i=1,x,j;n>1;){for(x=++i,j=2;j<x;)x=x%j++<1?1:x;if(x>1){for(j=0;n%i<1&&n>(f=0);n/=i)j++;if(f<1)s.add(j);}}return s.size();}

Повертається 1як триут, і >=2як фальси.

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

Пояснення:

n->{                   // Method with integer parameter and boolean return-type
  var s=new java.util.HashSet();
                       //  Set to keep track of the prime exponents
  for(int f=1,         //  Prime-flag, starting at 1
          i=1,x,j;     //  Index and temp integers
          n>1;){       //  Loop as long as `n` is still larger than 1
    for(x=++i,         //   Set `x` to `i`, after we've increased `i` by 1 first with `++i`
        j=2;           //   Set `j` to 2 (first prime)
        j<x;)          //   Inner loop as long as `j` is still smaller than `x`
      x=x%j++<1?       //    If `x` is divisible by `j`:
         1             //     Set `x` to 1
        :              //    Else:
         x;            //     Leave `x` unchanged
    if(x>1){           //    If `x` is larger than 1 (if `i` is a prime):
      for(j=0;         //     Use `j` as counter, and set it to 0
          n%i<1        //     If `n` is divisible by `i`:
                       //      And loop as long as `n` is still divisible by `i`,
          &&n>         //      and `n` is larger than 0
              (f=0);   //      (and set `f` to 0 at the same time)
          n/=i)        //       Divide `n` by `i`
        j++;           //       And increase `j` by 1
      if(f<1)          //     If the flag `f` is now/still 0:
        s.add(j);}}    //      Add counter `j` to the Set
  return s.size();}    //  Return the amount of items in the Set
                       //  (1 being true, >=2 being false)

Деякі приклади входів:

n=15:

  • Прапор залишається 1за першим простим рівнем 2 (адже 15 не ділиться на 2).
  • Прапор переходить 1до 0того часу, коли ми на першому рівні 3. Оскільки 15 ділиться на 3, nстає 5 (15/3 1 ), і Набір стає [] → [1].
  • Потім ми перевіряємо наступне просте 5. Оскільки 5 ділиться на 5, nстає 1 (5/5 1 ), а множина залишається такою ж ( [1] → [1]).
  • Тепер n=1ми зупиняємо зовнішню петлю. Комплект Set ( [1]) містить лише один предмет - 1з обох суміжних прайменів 3 і 5, тому ми повертаємо істину.

n=14:

  • Прапор переходить з 1на 0перший простір 2 (тому що 14 ділиться на 2). nстає 7 (14/2 1 ), а Набір стає [] → [1].
  • Потім ми перевіряємо наступний простір 3. Оскільки 7 не ділиться на 3, nзалишається тим самим, і Набір стає [1] → [1,0].
  • Потім ми перевіряємо наступне просте 5. Оскільки 7 також не ділиться на 5, nзалишається тим самим, а Набір залишається таким же, як і ( [1,0] → [1,0]).
  • Потім ми перевіряємо наступне просте 7. Оскільки 7 ділиться на 7, nстає 1 (7/7 1 ), а Набір залишається таким же ( [1,0] → [1,0]).
  • Тепер n=1ми зупиняємо зовнішню петлю. Set ( [1,0]) містить два елементи: 1від суміжних прайменів 2 та 7 та 0від простих праймів 3 та 5, тому ми повертаємо помилкові.

n=72:

  • Прапор переходить 1до 0першого для першого проміжку 2, оскільки 72 ділиться на 2 (кілька разів). Так nстає 9 (72/2 3 ), а Набір стає [] → [3].
  • Потім ми перевіряємо наступний простір 3. Оскільки 9 ділиться на 3 (кілька разів), nстає 1 (9/3 2 ), і множина стає [3] → [3,2].
  • Тепер n=1ми зупиняємо зовнішню петлю. Set ( [3,2]) містить два елементи: 3від prime 2 і 2від prime 3, тому ми повертаємо false.

1
Ви можете видалити <2та повернути int (вказати, що ви повернете 1 за truthy).
wastl

@wastl Ах, пропустив правило про узгодження лише одного з двох значень. У цьому випадку 1фальшивий і, 2або вище, - фальси. Спасибі.
Кевін Круїссен

Дякую тому, хто дарував мені щедроту, але чому?
Кевін Кройсейсен

1
Я розпочав винагороду за "винагороду за існуючу відповідь", щоб привернути більше уваги до моєї відповіді ECMAScript, яка, як я вважаю, заслуговує більше, ніж отримана (я вважаю, що щедрість не відбулася). Коли тиждень закінчився, мені довелося вибрати іншу, ніж власну відповідь, щоб присвоїти винагороду або залишити її за замовчуванням найвищим голосам. Я не вважав, що це заслуговує, але ваша відповідь мала найкраще пояснення, і саме тому я її нагородив; хороші пояснення занадто рідкісні для PPCG. Що стосується моєї відповіді, я вважаю, що я повинен дати їй краще написати, на що я планую, коли встигну.
Deadcode

1
@Deadcode Ага, ось чому. Я подумав, що, можливо, хтось почав баунті, але вони випадково дозволили йому закінчитися, і він прийшов замість мене. Ще трохи розгублено, чому моя відповідь тоді і не найвища проголосувала. Треба сказати, що я вражений усіма вашими відповідями на Regex. Я бачив деякі з них, і щоразу дивуюсь. Тим більше, коли я пізніше повертаюся до тієї самої відповіді, і ти пограєш ще більше. : DI щойно помітив, що я не бачив і не підтримував цю проблему, тому я просто зробив це. Ви знаєте, я додам щедрості до вашої відповіді . :)
Кевін Крейссен

2

J , 16 байт

Велика подяка FrownyFrog за -8 байт!

(=&#+/\=@#])_&q:

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

Моє старе рішення:

J , 24 байти

[:(1=[:#@~.{.@I.}.])_&q:

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

Пояснення:

_&q: основні показники

{.@I.}.] видаляє провідні нулі, знаходячи перший ненульовий елемент:

     }.   drop
       ]  from the list of exponents
{.@       as much items as the first of the 
   I.     indices of non-zero elements

1=[:#@~. тести, якщо всі інші числа рівні:

  [:#@~.  finds the length of the list after removing the duplicates
1=        is it 1?



2

Октава , 67 байт

@(x)~any(diff(find(h=histc(factor(x),primes(x))))-1)&h(h>0)==max(h)

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

Я вважаю, що це єдине рішення, в якому використовується гістограма.

Пояснення:

Це робить гістограму, де змінна, яка підраховується, є коефіцієнтами введення та розміщується у бункерах primes(x) , що на всі прості менше, ніж на вході. Потім ми знаходимо розташування простих факторів, приймаємо різницю між кожним з індексів і віднімаємо один. Якщо є якісь елементи, які не дорівнюють нулю (тобто різниця індексів простих чисел не дорівнює 1), це призведе до помилкового значення, інакше воно поверне справжнє значення.

Потім ми перевіряємо, що всі ненульові елементи в гістограмі рівні максимальному. Якщо є рівні, які не рівні, то це призведе до помилкового значення, інакше воно поверне справжнє значення.

Якщо обидва ці блоки є truthy, то наше введення - це послідовне просте постійне число показника!


1

APL (Dyalog Extended) , 28 байт

{f p`↓⍭⍵⋄(1=≢∪p)∧∨/f⍷⍸1⍭⍳⍵}

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

Як:

{f p`↓⍭⍵⋄(1=≢∪p)∧∨/f⍷⍸1⍭⍳⍵} ⍝ Monadic function, takes an argument ⍵
       ⍭⍵                     ⍝ Prime factors and exponents of ⍵
     `                         split the resulting matrix in 2 vectors
 f p                           assign the factors to f and the powers to p
                               then
                          ⍳⍵    range [1..⍵]
                        1      primality check for each element in the vector
                                where; returns the indices of truthy values
                     f          find the factors; returns a boolean vector
                   ∨/            logical OR reduction
                                logical AND
           (   p)               unique members of the powers
                                tally; returns the number of elements in the vector
            1=                   check if there's only one element




0

Чисто , 127 байт

import StdEnv
@n=[]== $n
?n#j= $n
= @n||j==filter@[hd j..last j]&&any(\p=(prod j)^p==n)[1..n]
$n=[i\\i<-[2..n-1]|n/i*i==n&& @i]

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

Визначає функцію ? :: Int -> Boolза допомогою $ :: Int -> [Int]факторизації та @ :: Int -> Boolперевірки первинності.


0

APL (NARS) 41 знак, 82 байти

{(1=≢∪+/¨{v=⍵⊃v}¨⍳≢v)∧(1↓w)≡¯1↓1πw←∪v←π⍵}

{π⍵} - функціональна факторизація аргументу ⍵ у списку простих факторів (повторити, якщо один простий з’являється більше часу);
{1π⍵} - функція наступного простого (зауважте, що в цьому випадку її аргументом є не скалярний, а один масив цілих чисел). тест:

  h←{(1=≢∪+/¨{v=⍵⊃v}¨⍳≢v)∧(1↓w)≡¯1↓1πw←∪v←π⍵}
  (2..30)/⍨h¨2..30
2 3 4 5 6 7 8 9 11 13 15 16 17 19 23 25 27 29 30 
  h¨27000 456533 72 10000000
1 1 0 0 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.