Kekuatan yang tidak sepele


15

Tuliskan program terpendek untuk mencetak kekuatan non-sepele ≤ 2 ^ 12 secara berurutan

kekuatan non-trivial berarti basis dan eksponen adalah> 1

Leading whitespace adalah opsional
Ketika ada beberapa solusi, urutannya tidak penting, jadi

16 = 4^2, 2^4 tidak apa-apa

Output sampel:

      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

Ada banyak kekuatan yang hilang di sini; bagaimana dengan 21 ^ 3 dll? Apa definisi Anda tentang "kekuatan non-sepele"?
hallvabo

Apakah mungkin untuk mencetak banyak baris dengan nomor yang sama di sebelah kiri, jika ada banyak solusi?
FUZxxl

@hallvabo, oops belum minum kopi pagi ini. perbaiki sekarang
gnibbler

@FUZxxl, Anda harus meletakkan beberapa solusi pada baris yang sama, meskipun untuk minat silakan kirimkan versi alternatif juga jika persyaratan membuat perbedaan besar dalam bahasa Anda
gnibbler

Memberi +1 saat saya mendapat lebih banyak suara :-)
hallvabo

Jawaban:


6

Ruby 1.9, 112 111 99 karakter

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

Ini membutuhkan waktu sekitar 0,8 detik untuk menyelesaikan sistem saya. Solusi yang lebih cepat adalah 111 karakter:

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 = range
untuk k dalam R (4097):
 v = ',' .join (`i` + '^' +` j`untuk saya di R (2,65) untuk j di R (2,13) ​​jika saya ** j == k)
 jika v: cetak k, '=', v

Ini membutuhkan beberapa detik untuk selesai.
Versi yang lebih cepat (148 karakter), menggunakan kamus untuk menghindari loop terluar, berjalan dalam ~ 0,01 detik:

R = rentang (2,65)
p = {}
untuk saya di R:
 untuk j dalam R:
    jika saya ** j <4097: p [i ** j] = p.get (i ** j, []) + [`i` + '^' +` j`]
untuk k, v diurutkan (p.items ()): cetak k, '=', ',' .join (v)

Saya cukup yakin tanda sama dengan yang diperlukan untuk output, meskipun itu seharusnya tidak mengubah ukuran kode.
Kevin Brown

Aduh, saya tidak sengaja menghapusnya ketika saya menyingkirkan spasi (opsional) terkemuka. Memperbaikinya!
hallvabo

4

Windows PowerShell, 102

Dengan bantuan Ventero untuk kode awal.

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

4

Interactive J, 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.
)

(baris terakhir terakhir tidak dibutuhkan)

Masih banyak kode untuk presentasi ...

Catatan: secara teori mengubah 63dan 63ke ydan ymenyimpan 2 byte lebih banyak tetapi versi itu menggunakan jumlah memori yang ekstrem.

Diedit oleh randomra.


Menggunakan [spasi] j [backtick] ^, ''; ',' alih-alih 'j';'^';' ';', 'menghemat 3 byte. (Diberikan memformatnya ...)
randomra

@randomra Anda punya hak edit; Tolong pergilah! (Saya tidak dapat menemukan kotak dengan J untuk memverifikasi dengan pengaturan saya saat ini, dan saya sedang terburu-buru). Ini akan membuat J yang terbaik dari pertunjukan, akan sangat sayang untuk tidak memamerkannya! :-)
JB

3

Bash, 138 karakter

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/.$//'

Suntingan

  • (169: 155) 2 foruntuk a while.
  • (155: 148) Tambahkan dengan+=
  • (148: 147) keluaran dengan while, menggunakan kembali j
  • (147: 142) gunakan sed untuk menghapus garis kosong
  • (142: 137) dimasukkan vdalam (()), gunakan v untuk (nilai terakhir) 4096
  • (137: 134) hapus tanda kutip, gabung (())ekspresi
  • (134: 132) ganti loop dengan fungsi rekursif
  • (132: 142) lupa koma, :(
  • (142: 138) bosan dengan pembaruan: hlm

2

PHP, 138 karakter - Output

<?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";

Tidak disatukan

<?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 karakter

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 byte

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

Ini menjadi sangat memalukan. Sesuatu seperti 25 karakter dihabiskan untuk memformat output. Kode aktualnya cukup sederhana: saring angka-angka itu di mana semua eksponen dalam factorisation prima sama. Kemudian, untuk masing-masing menghasilkan satu hasil untuk setiap pembagi eksponen (tidak termasuk 1, termasuk itu sendiri).


1

C (589 bytes)

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

Saya tidak bermain golf juga, pendekatan ini bukan yang terbaik tetapi cukup cepat untuk menghasilkan angka 0 yang tepat di ideone .


1

Baterai OCaml +, 220 206 158 156 karakter

Mengambil petunjuk dari solusi skor terbaik:

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))

(Baris akhir pada spasi putih signifikan untuk menjaga garis pendek.) Versi lebih cepat tetapi lebih lama yang menghasilkan kekuatan alih-alih mengujinya:

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 karakter

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
Diputar kembali; silakan kirim saran bermain golf sebagai komentar, bukan suntingan.
lirtosiast

1

Pyth, 39 byte

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

Cobalah online di sini .

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

Jika format output cukup fleksibel untuk menghilangkan kebutuhan spasi, -5 byte untuk mengganti " = "dengan \=dan ", "dengan\,


0

Haskell, 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]

kekuatan yang memiliki nilai yang sama seharusnya berada di jalur yang sama
MtnViewMark

0

JavaScript, 148 karakter

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

Harus dikompilasi (dengan peringatan) dengan kompiler C apa pun

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 karakter

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

Pertama kali saya menggunakan Pyth, jadi mungkin bisa diperbaiki. Ini adalah kekuatan brutal yang memeriksa hingga 64 ^ 64, sehingga sangat lambat. Anda dapat menghemat waktu hanya dengan memeriksa hingga 64 ^ 12 tetapi akan memakan biaya satu byte.


0

JavaScript (ES6) 134 127

Sunting yang direvisi, diperbaiki bug, dan disingkat Sunting 2 Setelah beberapa penelitian, saya menyadari bahwa jawaban ini tidak valid karena alasan kronologis. Pertanyaannya sudah ada sejak arrow functionsbertahun-tahun.

Semua yang mengatakan, jawaban JS lainnya terlalu rumit

/* 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>


Jika Anda tidak terlalu peduli tentang pemformatan '=', maka Anda dapat mengurangi hingga 121 byte: untuk (l = [], b = 1; ++ b <65;) untuk (e = 2, r = b ; (r * = b) <4197;) (l [r] = l [r] || []) .dorong (b + '^' + e ++); l.map ((v, i) => konsol. log (i + '=' + v.join`, `))
Mama Fun Roll

@molarmanful ada persyaratan ketat tentang pemformatan
edc65

Oh well ... setidaknya ubah v.join. Setidaknya itu bisa menurunkan hitungan byte menjadi 123.
Mama Fun Roll

@manmanmanful saat tantangan ini (dan jawaban ini!) diposting, string template tidak diterapkan di browser apa pun: Firefox adalah yang pertama - rel 34, Desember pertama 2014 - lalu Chrome, Maret 2015. Anda tidak dapat menggunakan fitur yang tersedia 3 tahun setelah pertanyaan
edc65

Oh well ... saya tidak tahu itu. Saya baru saja masuk ke ES6 seminggu yang lalu!
Mama Fun Roll

0

05AB1E , 36 byte

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

Saya merasa ini dapat sedikit ditingkatkan dengan menggunakan pendekatan yang sedikit berbeda ..

Cobalah online.

Penjelasan:

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)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.