以多种方式完善权力?


13

挑战

您的任务是编写一个给定正整数N的程序或函数,该程序或函数查找所有小于或等于N的正整数,这些正整数可以以多种方式表示为完美幂。

定义

完美的功率被定义为一个数发现立方公尺ķ,其中:

  • mi是正整数
  • m!= k

测试用例

输入->输出
1000-> 16,64,81,256,512,625,729
56-> 16
999-> 16,64,81,256,512,625,729
81-> 16,64,81
1500-> 16,64,81,256,512,625,729,1024,1296

请提供一个可读的,注释的版本。


您的最后一句话是否意味着空格不会计入字符数?
sepp2k 2011年

@ sepp2k是的!我们不应该算空格。
fR0DDY 2011年

4
@ fR0DDY那空白的语言呢?忽略空格字符将始终使该语言获胜。
moinudin 2011年

4
我认为拥有一个空白答案可以解决的奇怪问题没有什么坏处。我们将看到需要花多长时间才能有人打扰。
gnibbler 2011年

1
N是否有限制?
Wile E. Coyote

Answers:


3

Mathematica:103个字符

可以删除空格

Select[Flatten@
       Table[
        Solve[Log@#/Log@b == k, k, Integers] /. k -> #, {b, 2, #}] & /@ Range@#, 
Length@# > 2 &][[All, 1, 1]] &  

用法:

%[81]
{16, 64, 81}

3

果冻,11个有意义的字节,语言发布日期挑战

ḊḟÆR *@þ Ḋ  F  fḊ

在线尝试!

这是一个完全不同的解决方案。这是效率与效率低下的奇怪混合体,它在效率非常低下的包装器中使用了有效的核心算法(其数量太多,以至于它无法处理非常大的数字)。和以前一样,所有空格都是没有意义的。

运作方式如下。(出现几次)是从2到输入(含)的数字列表:

ḊḟÆR *@þ Ḋ  F  fḊ
ḊḟÆR                Ḋ, with all primes between 2 and the input removed
                    (i.e. all composite numbers from 4 to the input)
     *@þ Ḋ          Exponentiate all Ḋ elements with all ḊḟÆR elements
            F       Flatten the result (it had a nested structure)
               fḊ   Keep only elements in Ḋ

这里的基本观察结果是,从多种角度来看,数是一个完美的幂,只有当它是具有复合指数(不是1)的完美幂时才可以。我们生成一个底数为2到输入,指数为4到输入的复合数的列表。这真的很慢,因为它会产生一些非常大的数字,所有这些数字都可以回答这个问题。然后,我们只保留范围内的答案。

可以很容易地将其修改为高效答案,方法是计算范围内的最大功率,而无需进一步迭代,但这会增加很多字节,这就是代码高尔夫。


1

Perl:68个字符

在中获取最大值(1000),$N并在中返回答案@a

for $x ( 2..$N ) {
    $c{$x**$_}++ for 2..log($N)/log$x
}
@a = grep { $c{$_} > 1 } keys %c

对于整个程序,我还需要18个字符:

$m = shift;
for $x ( 2..$m ) {
    $c{$x**$_}++ for 2..log($m)/log$x
}
print join ' ', grep { $c{$_} > 1 } keys %c

这不会按顺序打印。codepad.org/H0Zyau3z
Wile E. Coyote

@Dogbert:顺序打印并不是挑战。如果是这样,您可以sort 在之前添加grep。顺便说一下,我以前没看过键盘。谢谢。

0

Ruby-101个字符(无空格)

f=->l{c=Hash.new{0}
2.upto(1E4){|i|2.upto(20){|j|c[i**j]+=1}}
c.map{|k,v|v>1&&k<=l&&k||p}.compact.sort}

适用于1 <= limit <= 100,000,000在5秒内。

测试

> f[10000]
[16, 64, 81, 256, 512, 625, 729, 1024, 1296, 2401, 4096, 6561, 10000]

0

果冻,13个有意义的人物,语言约会挑战

R  µ  ọḊ *@Ḋ ċ >2  µ  Ðf

在线尝试!

这里的所有空白都不重要。根据问题的要求,我用它来显示答案的结构。

运作方式如下:

R  µ  ọḊ *@Ḋ ċ >2  µ  Ðf
R                     Ðf    Find all numbers n from 1 to the input, such that:
   µ               µ          (grouping marks, like {} in C)
       Ḋ   Ḋ                  Take the range from 2 to n
      ọ                       Find the number of times each divides n
         *@                   Raise the range from 2 to n to these powers
             ċ                Count the number of times n appears
               >2             and the result must be greater than 2

因此,例如,当测试n = 256时,我们检查从2到256的每个数字除以256的次数。除一次以上的数字是2(除以8的次数),4(除以4的次数)次),8(两次除法)和16(两次除法)。因此,当我们将划分的数量提高到在那里确定的力量时,我们得到:

2⁸, 3, 4⁴, 5, 6, 7, 8², 9, 10, 11, 12, 13, 14, 15, 16², 17, ..., 255, 256

这样就产生了原始值256,其次数等于256是一个完美幂的方式,再加上一个(最后一个元素产生256,因为256 =256¹)。因此,如果我们在数组中看到256的两倍以上(并且在这种情况下我们这样做;8²是64,但其他“有趣的”元素都产生256),那么它一定是完美的功效。

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.