Обміняйте основні показники з сусідами


13

(Слідкуйте за моїм питанням щодо обміну бітами з сусідами .)

Завдання

З огляду на додатне ціле число x = (2 a  · 3 b ) · (5 c  · 7 d ) · (11 e  · 13 f ) · ... , надрукуйте ціле число, отримане шляхом заміни показників у цій факторизації для кожної послідовної пари простих чисел, y = (2 b  · 3 a ) · (5 d  · 7 c ) · (11 f  · 13 e ) ·…

A061898 в ОЕІС . Це , тому найкоротша програма (у байтах) виграє!

Тестові справи

1 -> 1
2 -> 3
3 -> 2
10 -> 21
37 -> 31
360 -> 756
12345 -> 11578
67895678 -> 125630871

Чи можемо ми повернути True замість 1 ?
Денніс

@Dennis Після певного розгляду я вирішив, що моя відповідь - ні. Вихід повинен хоча б виглядати як число.
Лінь

Відповіді:



4

Желе, 17 16 11 байт

5 байт завдяки Деннісу.

ÆfÆC’^1‘ÆNP

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

Пояснення

ÆfÆC’^1‘ÆNP   Main monadic chain. Argument: n

Æf            Yield the prime factors of n.
  ÆC          For each factor, count the number of primes below it.
              This effectively yields their indices.
    ’         Decrement [each] by 1.
     ^1       Xor with 1
       ‘      Increment [each] by 1.
        ÆN    Find their corresponding primes.
          P   Yield their product.

Попередня 16-байтна версія

ÆnÆRiЀÆf’^1‘ÆNP

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

Пояснення

ÆnÆRiЀÆf’^1‘ÆNP   Main monadic chain. Argument: n

Æn                 Yield the next prime from n.
  ÆR               Yield all primes from 2 to it.
       Æf          Yield prime factors of n
    iЀ            Yield their index in the prime list.
         ’         Decrement [each] by 1.
          ^1       Xor with 1
            ‘      Increment [each] by 1.
             ÆN    Find their corresponding primes.
               P   Yield their product.

Попередня 17-байтна версія:

ÆnÆR©iЀÆf’^1‘ị®P

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

Пояснення

ÆnÆR©iЀÆf’^1‘ị®P   Main monadic chain. Argument: n

Æn                  Yield the next prime from n.
  ÆR                Yield all primes from 2 to it.
    ©               Store to register.
        Æf          Yield prime factors of n
     iЀ            Yield their index in the prime list.
          ’         Decrement [each] by 1.
           ^1       Xor with 1
             ‘      Increment [each] by 1.
              ị®    Find their corresponding primes in
                    the list in register.
                P   Yield their product.

3

Математика, 70 69 байт

1##&@@(Prime[BitXor[PrimePi@#+1,1]-1]^#2&)@@@FactorInteger@#/._@_->1&

Безіменна функція, яка приймає і повертає ціле число. Він кидає помилку при введенні, 1але все ж обчислює правильний результат.

Пояснення

Як завжди, через увесь синтаксичний цукор порядок читання трохи смішний. &На право визначає неназвані функції і її аргументи посилаються #, #2, #3і т.д.

...FactorInteger@#...

Почнемо з факторного введення. Це дає список пар, {prime, exponent}наприклад, введення 12дає {{2, 2}, {3, 1}}. Дещо незручно, 1дає {{1, 1}}.

(...&)@@@...

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

...PrimePi@#...

Ми обчислюємо кількість праймерів до і включаючи (основний) вхід за допомогою вбудованого PrimePi. Це дає нам індекс простих.

...BitXor[...+1,1]-1...

Результат збільшується, XOR'ед 1і знову зменшується. Це свопи 1 <-> 2, 3 <-> 4, 5 <-> 6, ..., тобто всі індекси на основі 1. Зверніть увагу , що вхід 1буде вихід 0за PrimePiякий потім перетворюється в -1в цьому процесі. Ми з цим розберемося пізніше.

 ...Prime[...]^#2...

Тепер ми отримуємо n- е просте (де n - результат попереднього обчислення), яке є правильно заміненим простим, і піднімаємо його до сили вихідного простого при факторизації вхідних даних. У цей момент Prime[-1]буде видано помилку, але повернеться не оціненою. Потужність у цьому випадку 1така, що весь процес поки що дає {Prime[-1]}вхід 1і список правильних простих повноважень для всіх інших входів.

 1##&@@...

Далі ми просто множимо всі прем'єр-сили. 1##&- це стандартний трюк для гольфу для Timesфункції. Дивіться цю пораду (розділ «Послідовність аргументів»), як це працює.

Нарешті, нам потрібно подбати про вклад, 1до якого призвело все вищезазначене Prime[-1]. Ми можемо це легко виправити за допомогою простого правила заміни. Пам'ятайте, що f@xце коротко f[x]. Ми просто хочемо співставити будь-яке вираження цієї форми (оскільки всі інші результати будуть цілими числами, тобто атомними виразами), і замінимо його на 1:

.../._@_->1

Ось, /.коротше ReplaceAll, _@_- це шаблон для будь-якої форми f[x](тобто будь-якого складового виразу з однією дитиною) і ->1говорить "замінити на 1".


3

Python 2, 149 139 байт

10 байт завдяки Деннісу.

n=input()
p=f=1;w=[2]
while w[-1]<=n:f*=p;p+=1;w+=[p]*(-~f%p<1)
r=p=1;w=w[1:]
while n>1:
    p+=1
    while n%p<1:n/=p;r*=w[w.index(p)^1]
print r

input()працює в Python 2?
NoOneIsHere

@NoOneIsHere Так, це еквівалент eval(input())в Python 3.
Mego

2

MATL , 17 байт

EZqGYfy&mt2\Eq+)p

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

Пояснення

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

EZq    % Implicit input. Multiply by 2
Zq     % Array with sequence of primes up to that (this is more than enough)
GYf    % Prime factors of input, with possible repetitions
y      % Duplicate array with sequence of primes
&m     % Indices of prime factors in the sequence of primes
t2\    % Duplicate, modulo 2. Gives 0 for even indices, 1 for odd
Eq     % Multiply by 2, add 1. Transforms 0 / 1 into -1 / 1 
+      % Add. This modifies the indices to perform the swapping
)      % Apply the new indices into the sequence of primes
p      % Product. Implicit display

2

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

~=primes
!n=prod(t->(~3n)[endof(~t[1])+1$1-1]^t[2],factor(2n))/3

Спробуйте в Інтернеті! Останній тестовий випадок вимагає занадто багато пам'яті для TIO, але я перевірив його локально.

Як це працює

Щоб уникнути введення спеціального обкладинки 1 - добуток порожнього словника не визначений - ми множимо вхід n на 2 і ділимо кінцевий результат на його пару 3 .

factor(2n)дає всі позитивні показники простих факторів 2n як словник. Під час ітерації над словником ми отримаємо пари ключ-значення / prime-exponent. Функція prodвізьме ці пари, застосує до них анонімну функцію t->...та поверне добуток результатів.

Для кожної пари т = (р, е) , endof(~t[1])або endof(primes(t[1]))повернення до , число простих чисел , які менше або дорівнюють р , а це означає , що р є до е просте число.

+1$1-1приріст k , XOR k + 1 на 1 і зменшення результату. Якщо k непарне, k + 1 парне, тож приріст XOR і кінцевий результат k + 1 . Якщо k парне, k + 1 непарне, тому зменшення XOR і кінцевий результат k - 1 .

Нарешті, ми обчислимо всі прості числа менше або дорівнює 3n з (~3n)або primes(3n)(найвищим первинним чинником 2n менше або дорівнює п , якщо п> 2 , і завжди є простий між п і ), виберіть один з індексом K + 1 або k - 1 , і піднесіть його до е й сили за допомогою ^t[2].


2

Python 2, 112 109 108 95 94 байт

f=lambda n,k=4,m=6,p=[3,2]:1/n or n%p[1]and f(n,k+1,m*k,m*m%k*[k]+p)or p[len(p)*2%4]*f(n/p[1])

Перевірте це на Ideone .

Як це працює

Коли f викликається, він спочатку обчислює 1 / n . Якщо результат не нульовий, n дорівнює 1, а f повертає 1 .

Якщо n> 1 , відбувається наступне.

  • Якщо n не ділиться на p [1] (спочатку 2 ), n%p[1]виходить тритильове значення і

    f(n,k+1,m*k,m*m%k*[k]+p)

    називається.

    Ця гілка генерує просте число, поки передостаннє рівномірно не поділить n . Для цього використовується наступний слід з теореми Вілсона .

    слідство теореми Вілсона

    У будь-який час m дорівнює факторі k - 1 (спочатку 6 = 3! І 4. У кожній ітерації результат m*m%k*[k]випередження додається до списку простих чисел p . За наслідками, m*m%kдорівнює 1, якщо k є простим і 0, якщо ні, то це передує k до p тоді і лише тоді, коли k є простим числом.

  • Якщо n ділиться на p [1] , n%p[1]виходить 0 і

    p[len(p)*2%4]*f(n/p[1])

    отримує страту.

    Якщо p містить парну кількість простих чисел, len(p)*2%4вийде 0, а перший мультиплікація прийме значення p [0] . Якщо p містить непарну кількість простих чисел, len(p)*2%4вийде 2, а перший мультиплікація приймає значення p [2] .

    У будь-якому випадку це просте значення, експоненти якого повинні бути замінені на коефіцієнт p [1] , тому ділимо n на p [1] (зменшуючи показник на 1 ) і множимо результат f(n/p[1])на відповідний простий (збільшуючи показник на 1 ).

    Зауважте, що f(n/p[1])скидає k , m та p до значень за замовчуванням. f(n/p[1],k,m,p)покращить ефективність, ціною шести зайвих байтів.


1

Pyth, 25 байт

JfP_TSfP_ThQ*F+1m@Jx1xJdP

Тестовий набір.

Пояснення

JfP_TSfP_ThQ*F+1m@Jx1xJdP

           Q    get input
          h     add one
      fP_T      find the first prime after it
     S          range from 1 to that prime
 fP_T           filter for the primes
J               assign to J

                        P  prime factorize input
                m      d   for each factor
                     xJ    find its index in J
                   x1      xor with 1
                 @J        find the corresponding entry in J
            *F+1           product of the whole list

1

Джулія, 155 131 127 байт

n->(x=[sort([merge([p=>0for p=primes(n+1)],factor(n))...]);1=>0];prod([x[i-1][1]^x[i][2]*x[i][1]^x[i-1][2]for i=2:2:endof(x)]))

Це анонімна функція, яка приймає ціле число і повертає ціле число. Щоб викликати його, призначте його змінній. Для нього потрібна версія Julia <0,5, тому що основна функціональність була видалена з Base в 0,5.

Безголівки:

function f(n::Int)
    # Create an array of pairs by merging the Dict created from factoring n
    # with all primes less than n+1 with a 0 exponent. Append an extra pair
    # to account for 1 and situations where x would otherwise have odd length.
    x = [sort([(merge([p=>0 for p in primes(n+1)], factor(n))...]); 1=>0]

    # Compute a^d * c^b, where a and c are primes with b and d as their
    # respective exponents.
    prod([x[i-1][1]^x[i][2] * x[i][1]^x[i-1][2] for i = 2:2:endof(x)])
end

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


1

Власне, 15 байт

w`i;r♂Pí1^Pn`Mπ

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

Пояснення:

w`i;r♂Pí1^Pn`Mπ
w                prime factorization
 `          `M   map (for (p,e) in factorization):
  i;               flatten, make a copy of p
    r♂P            [prime[i] for i in range(p)]
       í           index (essentially the 0-based prime index of p)
        1^         XOR with 1
          P        prime[n]
           n       repeat e times
              π  product

1

05AB1E, 22 байти

Ó¾‚˜2ô€R˜DgL<Ø)øvy`smP

Пояснив

Ó¾‚˜                    # list of primeexponents with a 0 appended: n=10 -> [1,0,1,0] 
    2ô                  # split into pairs: [[1,0],[1,0]]
      €R˜               # reverse each pair and flatten: [0,1,0,1]
         DgL<Ø          # get list of primes corresponding to the exponents: [2,3,5,7]
              )ø        # zip lists: [[0,2],[1,3],[0,5],[1,7]]
                vy`sm   # raise each prime to its new exponent: [1,3,1,7]
                     P  # product: 21

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


0

J, 21 байт

([:,_2|.\,&0)&.(_&q:)

Получає прості показники n як прості сили з нулями. Потім розділіть їх на підрозділи, що не відкриваються, розміром 2, заповнивши додатковий нуль. Потім переверніть кожен підпис і вирівняйте їх у списку. Нарешті, перетворіть назад з простих показників у число.

Використання

   f =: ([:,_2|.\,&0)&.(_&q:)
   (,.f"0) 1 2 3 10 37 360 12345
    1     1
    2     3
    3     2
   10    21
   37    31
  360   756
12345 11578
   f 67895678x
125630871

Пояснення

([:,_2|.\,&0)&.(_&q:)  Input: n
                _&q:   Obtain the list of prime exponents
(           )&.        Apply to the list of prime exponenets
         ,&0           Append a zero to the end of the list
    _2  \              Split the list into nonoverlapping sublists of size 2
      |.               Reverse each sublist
 [:,                   Flatten the list of sublists into a list
             &.(    )  Apply the inverse of (Obtain the list of prime exponents)
                       to convert back to a number and return it
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.