代码高尔夫:数字的主要因素

Ale*_*lex 28 code-golf

根据字符数,找到任何数字的素数因子最短路径是什么?

示例输入: 1806046

示例输出: 2x11x11x17x439

示例计算器

Yur*_*ich 22

C#,69

x是输入数字

int i=2;while(x>1)if(x%i++==0){x/=--i;Console.Write(i+(x>1?"x":""));};
Run Code Online (Sandbox Code Playgroud)

包括:

using system;
namespace nameSP
{
   class Program
   {
     static void Main(string[] args)
     { 
        int i=2;while(x>1)if(x%i++==0){x/=--i;Console.Write(i+(x>1?"x":""));};
     }
   }
}
Run Code Online (Sandbox Code Playgroud)

  • @Alex除了它根本不会编译. (2认同)
  • @Yuriy这是代码高尔夫的标准格式,是挑战的一部分,与"我的特权"无关. (2认同)

Jim*_*mmy 20

强制性J答案(2个字符):

q:
Run Code Online (Sandbox Code Playgroud)

  • 问题中的示例显示11为因子两倍. (6认同)

Ale*_*x B 15

ANSI C,79个字符

main(d,i){for(d+=scanf("%d",&i);i>1;i%d?++d:printf("%d%c",d,(i/=d)>1?'x':10));}
Run Code Online (Sandbox Code Playgroud)

  • 啊,这就是诀窍:你可以使用'char**argv'作为int,而C会吞下它. (2认同)
  • 我意识到编译和运行时.那是糟糕的.这样做你是一个可怕的人.(当C解决方案击败Python和Perl时,我总是喜欢它.) (2认同)

Per*_*son 11

Mathematica(包括括号的15个字符):

FactorInteger
Run Code Online (Sandbox Code Playgroud)

例:

FactorInteger[42]

{{2, 1}, {3, 1}, {7, 1}}
Run Code Online (Sandbox Code Playgroud)

  • 现在_that_以正确的方式思考问题. (10认同)
  • 这不遵循示例输出:2x11x11x17x439.你可以使用bash`factor x`.Whoohoo,6个字符!我太棒了!1! (2认同)

Tri*_*ych 10

Python:带有输入和输出的77个字符

d,s,n=2,'',input()
while n>1:
 if n%d:d+=1
 else:s+='%dx'%d;n/=d
print s[:-1]
Run Code Online (Sandbox Code Playgroud)


sth*_*sth 10

Haskell,53个字符:(包括3个换行符)

a%1=[]
a%n|mod n a<1=a:p(div n a)|1>0=(a+1)%n
p=(2%)
Run Code Online (Sandbox Code Playgroud)

例:

*Main> p 1806046
[2,11,11,17,439]
Run Code Online (Sandbox Code Playgroud)


Aar*_*lla 6

Python(没有I/O的228个字符,340个字符):

import sys

def primeFactors(n):
    l = []
    while n > 1:
        for i in xrange(2,n+1):
            if n % i == 0:
                l.append(i)
                n = n // i
                break
    return l if len(l) > 0 else [n]

n = int(sys.argv[1])
print '%d: %s' % (n, 'x'.join(map(lambda x: str(x), primeFactors(n))))
Run Code Online (Sandbox Code Playgroud)

可以压缩到120个字符:

import sys
n,l=int(sys.argv[1]),[]
while n>1:
 for i in range(2,n+1):
    if n%i==0:l+=[str(i)];n/=i;break
print'x'.join(l)
Run Code Online (Sandbox Code Playgroud)

注意:这是一个制表符if,而不是四个空格.它作为另一个缩进级别工作,只需要一个字符而不是两个字符.


Nol*_*rin 5

F#

81个字符

let rec f n=if n=1 then[]else let a=[2..n]|>List.find(fun x->n%x=0)in a::f(n/a)
Run Code Online (Sandbox Code Playgroud)

这是非常低效的,但由于目标无疑是尽可能写出最短的代码,我忽略了这个问题.

可读表格(使用#light语法):

let rec factorise n =
    if n = 1 then [] else
    let a = [2 .. n] |> List.find (fun x -> n % x = 0)
    a :: factorise (n / a)
Run Code Online (Sandbox Code Playgroud)


Jon*_*ght 5

GNU bc,47个字符,包括收集输入(需要GNU扩展print,elseread):

x=read();for(i=2;x>1;)if(x%i){i+=1}else{x/=i;i}
Run Code Online (Sandbox Code Playgroud)

如果你真的想要输出中的x个字符,那就是64个字符:

x=read();for(i=2;x>1;)if(x%i){i+=1}else{x/=i;print i;if(x>1)"x"}
Run Code Online (Sandbox Code Playgroud)

另外,请注意,使用bc可以处理任意长度的数字.


小智 5

APL中有11个字符

排除函数标题和换行符

factors?{2÷/???\????}
Run Code Online (Sandbox Code Playgroud)