登峰造极


24

Numberphile最新视频的标题13532385396179,是下面的函数的固定点˚F的正整数:

n为正整数。以通常的方式写素数分解,例如60 = 2 2 ·3·5,其中素数以递增顺序写,而指数1被忽略。然后将指数降低到该行并省略所有乘法符号,得到数字f(n)。例如,f(60)= f(2 2 ·3·5)= 2235。

(以上定义来自五个$ 1,000问题中的问题5 -John H.Conway

请注意,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)的重复应用将始终达到素数(当然,如果p是素数,则f(p)= p)。13532385396179驳斥了这个猜想,因为它既是复合的又是固定的opint。
克里斯·H

Answers:


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的建议,那么您的回答将是有效的。(也许看看其他答案,看看它们通常是什么样子的)
Dada

4
噢,天哪,我没想到吉姆·戴维斯本人会出现在这个网站上,并回答我的挑战……我现在感到非常荣幸……
Leaky Nun

2
嗯,顺便说一下,不是巨魔。我的电子邮件地址在gladhoboexpress.blogspot.ca/2014/10/climb-to-prime.html上。
jchd

9

Brachylog,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,这可能更具可读性,并且更具Brachylog的精神。


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”
Erik the Outgolfer

@EriktheOutgolfer是的,因此“有效”。
Martin Ender

@MartinEnder您不使用的任何特定原因(从十进制转换为整数)吗?
散布

@Christian,因为列表可能包含多位数的整数。
Martin Ender

@MartinEnder啊,聪明。我过去使用FḌ过-这是一个很好的提示!
散布


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_只进行深压平,并且:~只要它是单个级别就可以使用。
Martin Ender

4

05AB1E,10个字节

Òγʒ¬?gDië?

在线尝试!

Ò          # Push list of prime factors with duplicates
 γ         # Break into chunks of consecutive elements
  ʒ        # For each
   ¬?      #   Print the first element
     gD    #   Push the length of this chunk twice
       ië  #   If not 1
         ? #     Print the length

3

05AB1E12 11字节

Òγvy¬sgD≠×J

在线尝试!

说明

Ò            # calculate prime factors with duplicates
 γ           # group consecutive equal elements
  vy         # for each group
    ¬        # get the head without popping
     sg      # push the length of the group
       D≠×   # repeat the length (length != 1) times
          J  # join

失败48
Leaky Nun

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

在线尝试!

如果将输入限制在以下2147483659str(...)则可以通过`...`节省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#,206100字节

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

取消高尔夫:

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上安装的软件包。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.