非平凡的权力


15

编写最短的程序以按顺序打印≤2 ^ 12的非平凡幂次

非平凡幂表示基数和指数> 1

前导空格是可选的
当有多个解决方案时,顺序并不重要,因此

16 = 4^2, 2^4 还可以

样本输出:

      4 = 2^2
      8 = 2^3
      9 = 3^2
     16 = 2^4, 4^2
     25 = 5^2
     27 = 3^3
     32 = 2^5
     36 = 6^2
     49 = 7^2
     64 = 2^6, 4^3, 8^2
     81 = 3^4, 9^2
    100 = 10^2
    121 = 11^2
    125 = 5^3
    128 = 2^7
    144 = 12^2
    169 = 13^2
    196 = 14^2
    216 = 6^3
    225 = 15^2
    243 = 3^5
    256 = 2^8, 4^4, 16^2
    289 = 17^2
    324 = 18^2
    343 = 7^3
    361 = 19^2
    400 = 20^2
    441 = 21^2
    484 = 22^2
    512 = 2^9, 8^3
    529 = 23^2
    576 = 24^2
    625 = 5^4, 25^2
    676 = 26^2
    729 = 3^6, 9^3, 27^2
    784 = 28^2
    841 = 29^2
    900 = 30^2
    961 = 31^2
   1000 = 10^3
   1024 = 2^10, 4^5, 32^2
   1089 = 33^2
   1156 = 34^2
   1225 = 35^2
   1296 = 6^4, 36^2
   1331 = 11^3
   1369 = 37^2
   1444 = 38^2
   1521 = 39^2
   1600 = 40^2
   1681 = 41^2
   1728 = 12^3
   1764 = 42^2
   1849 = 43^2
   1936 = 44^2
   2025 = 45^2
   2048 = 2^11
   2116 = 46^2
   2187 = 3^7
   2197 = 13^3
   2209 = 47^2
   2304 = 48^2
   2401 = 7^4, 49^2
   2500 = 50^2
   2601 = 51^2
   2704 = 52^2
   2744 = 14^3
   2809 = 53^2
   2916 = 54^2
   3025 = 55^2
   3125 = 5^5
   3136 = 56^2
   3249 = 57^2
   3364 = 58^2
   3375 = 15^3
   3481 = 59^2
   3600 = 60^2
   3721 = 61^2
   3844 = 62^2
   3969 = 63^2
   4096 = 2^12, 4^6, 8^4, 16^3, 64^2

这里缺少很多力量;那21 ^ 3等呢?您对“非平凡的权力”的定义是什么?
hallvabo 2011年

如果有多种解决方案,是否还可以在左侧打印具有相同编号的多行?
FUZxxl 2011年

@hallvabo,哎呀今天早上还没喝咖啡。现在修好了
gnibbler

@FUZxxl,您必须将多个解决方案放在同一行上,不过,如果有兴趣,也请提交替代版本,如果要求对您的语言有很大的影响的话
gnibbler 2011年

当我获得更多投票时+1 :-)
hallvabo 2011年

Answers:


6

Ruby 1.9, 112111 99个字符

4097.times{|x|s=[]
2.upto(64){|a|2.upto(12){|b|a**b==x&&s<<[a,b]*?^}}
puts [x,s*", "]*" = "if s[0]}

在我的系统上大约需要0.8秒才能完成。更快的解决方案是111个字符长:

h={};(2..64).map{|a|(2..12).map{|b|a**b<4097&&(h[a**b]||=[])<<[a,b]*?^}}
puts h.sort.map{|a,b|[a,b*", "]*" = "}

7

Python,113

R =范围
对于R(4097)中的k:
 v =','.join('i` +'^'+`j` for i in R(2,65)for j in R(2,13)如果i ** j == k
 如果v:print k,'=',v

这需要几秒钟才能完成。
使用字典避免最外层循环的更快版本(148个字符)在〜0.01秒内运行:

R =范围(2,65)
p = {}
对于R中的我:
 对于R中的j:
    如果i ** j <4097:p [i ** j] = p.get(i ** j,[])+ [`i` +'^'+`j`]
对于k,v进行sorted(p.items()):print k,'=',','.join(v)

我很确定输出需要等号,尽管这不会太大地改变代码大小。
凯文·布朗

糟糕,当我摆脱了(可选)前导空白时,我不小心删除了它。固定它!
hallvabo,2011年

4

Windows PowerShell,102

在Ventero的帮助下获得了初始代码。

$OFS=', '
4..4KB|%{$x=$_
if($s=2..64|%{$a=$_
2..12|?{[math]::pow($a,$_)-eq$x}|%{"$a^$_"}}){"$x = $s"}}

4

交互式 Ĵ,118 101 98

3 :0"0 i.4097
if.#l=.":2j2+63(<.@%~j.|)I.y=,^/~2+i.63
do.echo(":y),' = ',l rplc j`^,' ';', 'end.
)

(不需要最后一个换行符)

演示文稿的代码仍然很多...

注:在理论上不断变化63,并63yy节省2多个字节,但该版本使用的内存量极端。

由randomra编辑。


使用[space] j [backtick] ^,'';','代替 'j';'^';' ';', '保存3个字节。(放弃对其进行格式化...)
randomra 2015年

@randomra您拥有编辑权;请继续!(我找不到带有J的框来验证当前的设置,我有点急)。这将使J成为本场比赛的最佳拍品,可惜不炫耀一下!:-)
JB

3

Bash,138个字符

i=2;j=1
f(){((v>4096))&&((j=1,++i))
a[$v]+="$i^$j, "
((v=i**++j,i<65))&&f
}
f
f(){
echo $j = ${a[$j]}
((j++<v))&&f
}
f|sed '/=$/d;s/.$//'

编辑

  • (169:155) 2 for为一while
  • (155:148)附加+=
  • (148:147)输出while,重用j
  • (147:142)使用sed删除空行
  • (142:137)v(()),使用v为4096(最终值)
  • (137:134)删除sed引号,加入(())表达式
  • (134:132)用递归函数替换循环
  • (132:142)忘记了逗号, :(
  • (142:138)厌倦了更新:p

2

PHP,138个字符- 输出

<?for($b=1;++$b<65;)for($e=1;++$e<13;)if(4097>$f=pow($b,$e))$p[$f][]="$b^$e";ksort($p);foreach($p as$n=>$c)echo"$n = ".join($c,", ")."\n";

不打高尔夫球

<?php

// Array of combinations

$powers = array();

// Loop through every base from 2 to 64, as 64 is the highest you can go

for($base = 2; $base < 65; $base++){

    // Loop through all powers from 2 to 12, as 12 is the maximum

    for($power = 2; $power < 13; $power++){

        // Calculate the power

        $end = pow($base, $power);

        // Kill the loop if the result is too high

        if($end > 4096){
            break;
        }

        // Add the combination if the result is within limits

        $powers[$end][] = $base."^".$power;
    }
}

// Sort the powers by the total amount

ksort($powers);

// Output the powers in the correct format

foreach($powers as $number => $combinations){
    echo $number." = ".implode($combinations, ", ")."\n";
}

2

Python,127个字符

F={}
for i in range(693):a,b=i/11+2,i%11+2;F[a**b]=F.get(a**b,'')+', %d^%d'%(a,b)
for k in sorted(F)[:81]:print k,'=',F[k][2:]

2

Mathematica,152个字节

Print/@Cases[Range@4096,n_/;(2<=##&&##==##&)@@(f=#2&@@@FactorInteger@#&)@n:>{n,Row[{n^(1/#),#}~Row~"^"&/@Reverse@Rest@Divisors@#,", "]&@@f@n}~Row~" = "]

这太尴尬了。大约25个字符花在输出格式上。实际的代码非常简单:过滤那些素数分解中所有指数均相等的数字。然后,对于每个指数,对指数的每个除数(不包括1,包括其自身)产生一个结果。


1

C(589字节)

int pow(int a,int b){
   int res = 1;
   while(b>0){
    while(b%2 == 0){
        a *= a; b/=2;
    }
    b--;
    res = res*a;
}
return res;
}
char s[99],t[9];

int main(){
   int N,T,a,i,f,e,n;
  for(n = 2; n <= 1<<12; n++){
      strcpy(s,"");
      T = N = n;
      f = 0;
      int sqt = sqrt(N)+1;
      for(i = 2; i <= sqt; i++){
         for(e=0;0==N%i;e++,N/=i);
           for(a = i; e > 1;e = e%2?(e+1)/2:e/2)
              for(a=i;a<T;pow(a,e)==T?f++?0:printf("%d =",T),sprintf(t,", %d^%d",a,e),strcat(s,t):0,a*=i);
    }
    f?puts(s+1):0;
   }
   return 0;
 }

我也没有打高尔夫球,这种方法并不是最好的方法,但是速度足够快,可以产生精确的ideone 0 。


1

OCaml的+电池,220个 206 158 156字符

从得分最高的解决方案中获取提示:

Printf.(iter(fun x->match
String.join", "[?List:sprintf"%d^%d"b e|b<-2--64;e<-2--12;float
x=float b**float e?]with""->()|s->printf"%5d = %s\n"x s)(4--4096))

(行末尾处是有意义的空格,以使行短。)一种更快但更长的版本,它生成幂而不是对其进行测试:

Printf.(List.(iter(fun l->printf"%5d = %s\n"(fst(hd l))(String.join", "(map
snd l)))(group(fun(x,_)(y,_)->x-y)[?List:truncate p,sprintf"%d^%d"b
e|b<-2--64;e<-2--12;p<-List:[float b**float e];p<=4096.?])))

1

Haskell,146个字符

c[a]=a
c(a:z)=a++", "++c z
n#[]=""
n#s=shows n$" = "++c s++"\n"
main=putStr$(\n->n#[shows x$'^':show y|x<-[2..64],y<-[2..12],x^y==n])=<<[4..4096]

1

JavaScript,160

o={}
i=2
s=''
n=4097
for(k=4;k<n;k=++i*i)for(j=2;k<n;k*=i)
{a=i+'^'+j
if(o[k])o[k]+=', '+a
else o[k]=a
j++}for(i=0;i<n;i++)if(o[i])s+='\n'+i+' = '+o[i]
alert(s)

194

o={},i=2,s='',n=4096
for(k=4;k<=n;k=i*i){for(j=2;k<=n;k*=i){o[k]=o[k]||[]
o[k].push(i+'^'+j)
j++}i++}
for(i=0;i<n;i++){if(o[i]){s+='\n'+i+' = '
for(j in o[i])s+=(j==0?'':', ')+o[i][j]}}
alert(s)

2
回滚; 请张贴高尔夫建议作为评论,而不是编辑。
lirtosiast,2015年

1

Pyth,39个字节

jm++^Fhd" = "j", "jL\^d<.g^Fk^tS64 2 81

在这里在线尝试。

jm++^Fhd" = "j", "jL\^d<.g^Fk^tS64 2 81
                               S64       [1-64]
                              t          Discard first element
                             ^     2     Cartesian product of the above with itself
                        .g               Group the pairs, as k, using:
                          ^Fk              [a,b] -> a^b
                       <             81  Take the first 81 results of the above (those where exponential <= 4096)
 m                                       Map the remaining groups, as d, using:
                  jL\^d                    Join each pair in d on "^"
             j", "                         Join on ", "
  +     " = "                              Prepend " = "
   +^Fhd                                   Prepend the result of the exponent of one of the pairs
j                                        Join the result of the above on newlines, implicit print

如果输出格式具有足够的灵活性,以消除对空间的需求,-5字节替换" = "\=,并", "\,


0

哈斯克尔(131)

p[]=return()
p((x,y,z):s)=do print$show x++" = "++show y++"^"++show z;p s
main=p [(x,y,z)|x<-[2..2^12],y<-[2..x],z<-[2..x],x==y^z]

具有相同值的幂应该在同一行上
MtnViewMark 2011年

0

JavaScript,148个字符

s=''
for(i=2;i<4097;i++){q=''
for(a=2;a<65;a++)for(b=2;b<13;b++)if(Math.pow(a,b)==i)q+=a+'^'+b+', '
if(q)s+=i+' = '+q.slice(0,-2)+"\n"}alert(s)

0

C 184

应该使用任何C编译器进行编译(带有警告)

char*l[5000],*t=l+4100,*u;
main(b,e,r) 
{
  for(;++b<65;)
    for(e=2,r=b;(r*=b)<4100;l[r]=u)
      t+=1+sprintf(u=t,"%s, %d^%d",l[r]?l[r]:"",b,e++);
  for(r=1;++r<4097;)
    l[r]&&printf("%d =%s\n",r,l[r]+1);
}

0

Pyth,55个字符

=Tr2 64V^2 12JYFZTFbTIqN^ZbaJj\^[Zb))))IJjk[Nd\=dj", "J

我第一次使用Pyth,因此可能会得到改善。这是一种蛮力检查,最高可达64 ^ 64,因此相当慢。您最多可以检查64 ^ 12来节省时间,但这将花费一个字节。


0

JavaScript的(ES6)134 127

编辑经过修改,修正和缩短的 修改。编辑2经过一些研究,我意识到这个答案由于时间原因是无效的。问题早于arrow functions几年。

综上所述,其他JS答案过于复杂

/* for TEST:redefine console.log */ console.log=x=>O.innerHTML+=x+'\n';

for(l=[],b=1;++b<65;)for(e=2,r=b;(r*=b)<4197;)(l[r]=l[r]||[]).push(b+'^'+e++);l.some(function(v,i){console.log(i+' = '+v.join(', '))})
<pre id=O></pre>


如果您不太在乎'='格式,则可以减少到121个字节:for(l = [],b = 1; ++ b <65;)for(e = 2,r = b ;(r * = b)<4197;)(l [r] = l [r] || [])。push(b +'^'+ e ++); l.map((v,i)=>控制台。 log(i +'='+ v.join`,`))
Mama Fun

@molarmanful对于格式有严格的要求
edc65

哦,好吧……至少要更改v.join部分。这至少可以带来字节计数下降到123
妈妈乐辊

@molarmanful发布此挑战(和答案!)时,没有在任何浏览器中实现模板字符串:Firefox是第一个-rel 34,2014年12月首先-然后是Chrome,2015年3月。您不能使用可用的功能提问3年后
edc65

哦,我不知道。我一周前刚刚接触ES6!
Mama Fun Roll

0

05AB1E,36 个字节

2žxŸãΣ`m}99£.γ`m}εн`m'=yε'^ý}„, ý)}»

我觉得可以通过使用稍有不同的方法来改善这一点。

在线尝试。

说明:

2žxŸ           # Create a list in the range [2,64]
    ã          # Create each possible pair by taking the cartesian product with itself
Σ`m}           # Sort these `a,b`-pairs by their result of `a ** b`
    99£        # Only leave the first 99 pairs
       .γ`m}   # And then group the `a,b`-pairs by their result of `a ** b`
ε              # Now map each list of pairs `y` to:
 н             #  Take the first pair of list `y`
  `m           #  Take the `a ** b` value
 '=           '#  Push character "=" to the stack
 yε            #  Inner map over the pairs of list `y`:
   '^ý        '#   Join each pair with a "^" delimiter
      }„, ý    #  After the inner map: join these strings with a ", " delimiter
 )             #  Wrap all values on the stack into a list
             # After the outer map: join every inner list by spaces,
               # and the outer list by newlines (and output the result implicitly)
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.