Поднимитесь на шаг к вершине


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.

Testcases

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

   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

Python, 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? :(
Лохматый

3
Извините - это действительно то, что я использовал (я нашел номер). Я просто подумал, что вялый код будет смешным. Вы можете снять это.
jchd

9
Добро пожаловать на сайт. Очень приятно, что вы делитесь с нами своим решением. (для людей, которые не знают, Джим Дэвис - тот, кто решил эту проблему в первую очередь). Тем не менее, ответы на вызовы должны следовать некоторым правилам. Если вы просто последуете советам @LeakyNun, то ваш ответ будет действительным. (может быть, посмотрите на другие ответы, чтобы увидеть, как они обычно выглядят)
Дада

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= "объединить в одну строку и оценить как желе"
Эрик Outgolfer

@EriktheOutgolfer Да, следовательно, «эффективно».
Мартин Эндер

@MartinEnder Какая-то конкретная причина, по которой вы не используете (Конвертировать из десятичного в целое)?
разброс

@Christian Потому что список может содержать многозначные целые числа.
Мартин Эндер

@MartinEnder Ах, умный. Я использовал FḌв прошлом - это хороший совет!
разброс

5

Mathematica, 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 байтов (эта программа будет очень медленной для чисел, затронутых в любом случае!).


2

Ом , 11 байт

o:_]D2<?O;J

Попробуйте онлайн!

объяснение

o:_]D2<?O;J
o           # Push prime factors with powers from input (Format [[prime,power],...]
 :          # For each...
  _          # Push current element
   ]         # flatten
    D        # Duplicate power
     2<? ;   # Is the power smaller than 2?
        O     # Delete top of stacks
          J  # Join

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

Java 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;}

Ungolfed:

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.