【问题标题】:CodeGolf: Work out the prime factors of a given numberCodeGolf:计算给定数字的质因数
【发布时间】:2009-03-25 00:31:57
【问题描述】:

http://codegolf.com/prime-factors的启发,尝试用最少的击键次数来解决这个问题。

遗憾的是,您只能与 Perl/PHP/Python/Ruby 竞争,我希望看到这个问题在其他不那么传统的语言中得到解决。

【问题讨论】:

  • 代码高尔夫与其说是一个问题,不如说是一种生活方式
  • 赛制和Code Golf比赛的赛制一样吗?
  • 是的,格式和CodeGolf中的一样
  • 只有我一个人认为这种东西不属于这里吗?
  • 不,你肯定不是唯一一个。如果您不想看到它们,可以将 code-golf 标签设置为忽略。

标签: code-golf


【解决方案1】:

Perl

只是函数 - 返回一个素因子列表(49 个重要*字符):

sub p {
  $p = $_[0];
  return if $p == 1;
  $p % $_ or return($_, p($p/$_)) for 2..$p;
}

用于查找常数的素数(23 个有效*字符):

$, = " ";
print p(10), "\n";

用于从用户输入中查找数字的素数(28 个有效*字符):

$, = " ";
print p(<STDIN>), "\n";

* “重要”字符是非空格以及正确语法所需的任何空格。对于任何好奇的人,重要的空白以粗体表示。 :P

【讨论】:

  • 这实际上并不遵循格式,它输出2 2 5 5 100 而不是100: 2^2 5^2。不过很好。
【解决方案2】:

Perl 107 98 个字符

printf'%d: ',$n=<>;for($p=1;$n>=++$p;){for($i=0;0==$n%$p;$i++){$n/=$p}print$p,
$i>1?"^$i ":" "if$i}

那是

printf '%d: ', $n = <>;
for ($p = 1; $n >= ++$p;) {
  for ($i = 0;  0 == $n % $p;  $i++) {
    $n /= $p
  }
  print "$p", $i > 1 ? "^$i " : ' ' if $i
}

【讨论】:

    【解决方案3】:

    哈斯克尔

    我最近开始学习 Haskell - 这是一种鲜为人知(但非常好)的语言的尝试。

    main=readLn>>=print.f 2
    f a 1=[]
    f a x=if x`mod`a==0 then show a:f a(x`div`a)else f(a+1)x
    

    89 个字符,但实际上是因为输出格式不正确而作弊。我尝试更正输出,但无法得到少于 208 个字符的输出:

    import List
    main=readLn>>=w
    w n=putStrLn.foldl1(++).v n.map m.group.f 2$n
    m a=' ':head a++j(length a)
    v n=((s n++":"):)
    s=show
    j 1=[]
    j n='^':s n
    f a 1=[]
    f a x=if x`mod`a==0 then s a:f a(x`div`a)else f(a+1)x
    

    欢迎任何改进。顺便说一句,我很惊讶 GHC 可以让你删除多少空白而不抱怨。

    【讨论】:

      【解决方案4】:

      PowerShell,146 个 161 个字符

      $i="$input"
      "$i`: "+(
        $(
          for(;$i-gt1){
            for($x=1;++$x-le5e9){
              if(!($i%$x)){
                $i/=$x
                $x
                break
              }
            }
          }
        ) |
        sort |
        group |
        %{
          ''+$_.Name+('^'+$_.Count)*($_.Count-gt1)
        })
      

      目前几乎没有打高尔夫球。

      【讨论】:

        【解决方案5】:

        Python,214 个字符

        p=int(raw_input())
        def r(x,d):d[x]=d.setdefault(x,0)+1;return d
        y=lambda x,d:d==x and {x:1} or x%d and y(x,d+1) or r(d,y(x/d,2))
        print "%d: %s"%(p," ".join([`x`+("^"+`c` if ~-c else "") for x,c in y(p,2).items()]))
        

        我的第一个代码高尔夫,不要评判。可能可以进行很多优化。

        从好的方面来说,它的格式正确。

        【讨论】:

        • 在这个问题中,使用 input() 代替 int(raw_input()) 会更好。
        【解决方案6】:

        Python 127 个字符

        a=input()
        x=2
        print'%d:'%a,
        while x*x<=a:
         c=0
         while a%x==0:a/=x;c+=1
         if c:print`x`+('','^%d'%c)[c!=1],
         x+=1
        if a>1:print a
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-04-03
          • 1970-01-01
          • 1970-01-01
          • 2020-03-07
          • 2020-07-18
          • 2020-07-29
          • 1970-01-01
          相关资源
          最近更新 更多