Підніміться на крок до розквіту


24

Назва найновішого відеоролика Numberphile , 13532385396179 , є фіксованою точкою наступної функції f на натуральних цілих числах:

Нехай n - натуральне число. Напишіть основну факторизацію звичайним способом, наприклад, 60 = 2 2 · 3 · 5, в якому прайми записуються у порядку зростання, а показники 1 опускаються. Потім зведіть експоненти до лінії та опустіть усі знаки множення, отримавши число f (n). [...] наприклад, f (60) = f (2 2 · 3 · 5) = 2235.

(Вищевикладене визначення взято із задачі 5 із п’яти проблем на 1000 доларів - Джон Х. Конвей )

Зауважимо, що f (13532385396179) = f (13 · 53 2 · 3853 · 96179) = 13532385396179.

Завдання

Візьміть додатне складене ціле число nяк вхід, так і вихід f(n).

Ще один приклад

48 = 2 4 · 3, тому f (48) = 243.

Тестові шафи

Більше тестів доступні тут .

   4 -> 22
   6 -> 23
   8 -> 23
  48 -> 243
  52 -> 2213
  60 -> 2235
 999 -> 3337
9999 -> 3211101

11
+1 Я все ще дивуюсь, що комусь вдалося знайти 13532385396179 як недостовірність гіпотези. Я здогадуюсь, що приз у розмірі 1000 доларів піде певним чином, щоб заплатити за використану електроенергію! :)
Wossname

7
Без переходу по посиланню не було зрозуміло, що здогадка полягає в тому, що повторне застосування f (n) завжди досягне розквіту (і, звичайно, f (p) = p, якщо p є простим). 13532385396179 спростовує гіпотезу, оскільки вона є як складною, так і фіксованою.
Кріс Х

Відповіді:


16

Пітон, 166 162 159 байт

Ви, хлопці, набагато краще. Це те, що я використав! (алгоритм, який вирішив, називає це)

from primefac import*
def c(n):
 x=factorint(n)
 a=''
 for i in range(len(x)):
  l=min(x.keys())
  a+=str(l)
  if x[l]>1:a+=str(x[l])
  x.pop(l)
 return int(a)

2
Чому хтось спровокував новачка замість того, щоб допомогти йому покращити свою відповідь, як це робив @LeakyNun? :(
Shaggy

3
Вибачте - це справді те, що я використав (я знайшов номер). Я просто думав, що комерційний код буде смішним. Ви можете зняти його.
jchd

9
Ласкаво просимо на сайт. Дуже приємно, щоб ти поділився з нами своїм рішенням. (для людей, які не знають, в першу чергу вирішив цю проблему Джим Девіс). Однак для відповіді на виклики потрібно дотримуватися деяких правил. Якщо ви просто дотримуєтесь пропозицій від @LeakyNun, то відповідь буде вірною. (можливо, подивіться на інші відповіді, щоб побачити, як вони зазвичай виглядають)
Dada

4
Боже мій, я не очікував, що сам Джим Девіс з’явиться на цьому веб-сайті та відповість на моє виклик ... Зараз я відчуваю себе таким чесним ...
Leaky Nun

2
Ех, а не троль до речі. Моя адреса електронної пошти вказана на gladhoboexpress.blogspot.ca/2014/10/climb-to-prime.html ... Я залишив цю посаду, ніхто не перекидає вас електронною поштою над математикою.
jchd

9

Брахілог , 8 байт

ḋoọc;1xc

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

Пояснення

Example input: 60

ḋ          Prime decomposition: [5,3,2,2]
 o         Order: [2,2,3,5]
  ọ        Occurences: [[2,2],[3,1],[5,1]]
   c       Concatenate: [2,2,3,1,5,1]
    ;1x    Execute 1s: [2,2,3,5]
       c   Concatenate: 2235

Ви можете використовувати ℕ₂ˢ( виберіть усі цілі числа, що перевищують або дорівнюють 2 ) замість ;1x, що, мабуть, читабельніше та більше в дусі Брахілога.


9

Желе , 6 байт

ÆFFḟ1V

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

Пояснення

ÆF      Get prime factorisation of input as prime-exponent pairs.
  F     Flatten.
   ḟ1   Remove 1s.
     V  Effectively flattens the list into a single integer.

V= "приєднайтесь до однієї струни і зробіться як Jelly"
Ерік Позакореневий,

@EriktheOutgolfer Так, отже, "ефективно".
Мартін Ендер

@MartinEnder Якась конкретна причина, яку ви не використовуєте (Перетворити з десяткової в цілу)?
розкидання

@Christian Оскільки список може містити багатоцифрові цілі числа.
Мартін Ендер

@MartinEnder Ах, розумний. Я використовував FḌу минулому - це хороша порада!
розкидання

5

Математика, 43 36 байт

Row@Flatten@FactorInteger@#/. 1->""&

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


2
DeleteCasesдовго, ви можете використовувати /.1->""або /.1->##&[](альтернативна форма/.1->Nothing
user202729

3
@ user202729 Усі вони потребують місця перед, 1щоб не допустити його розбору як ... / (0.1).
Мартін Ендер

Ти правий! виправлено
J42161217

4

CJam , 8 байт

limF:~1-

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

Пояснення

li  e# Read input and convert to integer.
mF  e# Get prime factorisation as prime-exponent pairs.
:~  e# Flatten.
1-  e# Remove 1s.
    e# Implicitly print a flattened representation of the list.

Я б звик e_вирівнювати, оскільки це для чого, але це не змінює балів.
Пітер Тейлор

1
@PeterTaylor Гм, так, я ніколи не можу вирішити, який з них використовувати, але, як правило, e_використовую лише для глибокого вирівнювання та використовую, :~коли це лише один рівень.
Мартін Ендер



2

Pyth, 12 байт

smjk_>hddr8P

Спробуй це!

альтернативно, 12 байт

smjk<_AdGr8P

Спробуйте це!

пояснення

smjk_>hddr8P
           PQ  # prime factorization (already in correct order) of the implicit input: [3, 3, 11, 101]
         r8    # length encode: [[2, 3], [1, 11], [1, 101]]
 m             # map over the length encoded list (lambda variable: d)
     >hdd      # take the d[0] last elements of d (so only the last for d[0]==1 and all else)
    _          # reverse that list
  jk           # join into a string
s              # conatenate the list of strings


2

Python 2 , 99 байт

n=input()
r=''
p=2
while~-n:
 e=0
 while n%p<1:e+=1;n/=p
 r+=str(p)*(e>0)+str(e)*(e>1);p+=1
print r

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

Якщо введення обмежено нижче 2147483659, обидва str(...)можуть бути замінені `...`збереженням 6 байтів (ця програма буде дуже повільною для чисел, на які це впливає!).



1

Japt , 19 байт

k ó¥ ®¯1 pZlÃc fÉ q

Перевірте це в Інтернеті!

Пояснення

 k ó¥  ®   ¯  1 pZlà c fÉ  q
Uk ó== mZ{Zs0,1 pZl} c f-1 q  // Ungolfed
                              // Implicit: U = input number
Uk                            // Break U into its prime factors.
   ó==                        // Group into runs of equal items.
       mZ{         }          // Map each item Z in this to
          Zs0,1               //   Z.slice(0, 1) (the array of the first item),
                pZl           //   with Z.length added at the end.
                              // This returns an array of prime-exponent pairs (Jelly's ÆF).
                     c        // Flatten.
                       f-1    // Filter to the items X where X - 1 is truthy (removes '1's).
                           q  // Join the resulting array into a single string.
                              // Implicit: output result of last expression


0

C #, 206 100 байт

n=>{var r="";for(int d=1,c;++d<=n;){c=0;while(n%d<1){c++;n/=d;}r+=c>0?d+(c>1?c+"":""):"";}return r;}

Повна / відформатована версія:

using System;

class P
{
    static void Main()
    {
        Func<int, string> func = n =>
        {
            var r = "";
            for (int d = 1, c; ++d <= n;)
            {
                c = 0;
                while (n % d < 1)
                {
                    c++;
                    n /= d;
                }

                r += c > 0 ? d + (c > 1 ? c + "" : "") : "";
            }

            return r;
        };

        Console.WriteLine(func(4));
        Console.WriteLine(func(6));
        Console.WriteLine(func(8));
        Console.WriteLine(func(48));
        Console.WriteLine(func(52));
        Console.WriteLine(func(60));
        Console.WriteLine(func(999));
        Console.WriteLine(func(9999));

        Console.ReadLine();
    }
}

0

Javascript - 91 байт

(x,r='',i=1,n)=>{while(x>i++){for(n=0;x%i<1;n++)x/=i;r+=(n>0?i+'':'')+(n>1?n:'')}return r}

Пояснення

(x,r='',i=1,n)=>(          // input x is the number to process, r, i, n are default values only
    while(x>i++){          // iterate over i until x
        for(n=0;x%i<1;n++) // iterate over n until i is not a factor of x
            x/=i;          // factor i out of x
        r+=(n>0?i+'':'')   // append i to r if n > 0
            +(n>1?n:'')    // append n to r if n > 1
                           // i+'' prevents adding i and n before appending to r
    }
    return r               // return r by comma-operator and arrow function syntax
)

0

Ява 8, 103 символів

Досить просте рішення.

n->{String r="";int d=2,c;while(n>1){c=0;while(n%d<1){c++;n/=d;}if(c>0)r+=d;if(c>1)r+=c;d++;}return r;}

Безголівки:

private static Function<Integer, String> f = n->{
    String result = "";
    int divisor = 2, count;
    while (n>1) {
        count = 0;
        while (n % divisor < 1) {
            count++;
            n /= divisor;
        }
        if (count > 0) result += divisor;
        if (count > 1) result += count;
        divisor++;
    }
    return result;
};


0

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

@(a)printf('%d',(f=[[~,c]=hist(b=factor(a),d=unique(b));d](:))(f~=1))

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

Закінчилося досить довго, але це призведе до бажаного результату.

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

  • Результат factor()функції дає основні фактори у порядку зростання
  • Потім ми знаходимо unique()значення в цьому масиві
  • hist() повертає кількість подій

Як тільки у нас є два масиви (один для унікальних факторів, один для рахунків), ми з'єднуємо масиви вертикально (один на інший), а потім вирівнюємо. Це поєднує фактори з підрахунками.

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




0

R , 72 байти

x=rle(pracma::factors(scan()));x$l[x$l<2]='';paste0(x$v,x$l,collapse='')

Потрібен pracmaпакет, який не встановлений у TIO.

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