Nicht triviale Kräfte

15

Schreiben Sie das kürzeste Programm, um die nicht-trivialen Potenzen ≤ 2 ^ 12 der Reihe nach auszudrucken

Nicht-triviale Potenz bedeutet, dass Basis und Exponent> 1 sind

Führende Leerzeichen sind optional.
Wenn es mehrere Lösungen gibt, ist die Reihenfolge nicht wichtig

16 = 4^2, 2^4 ist in Ordnung

Beispielausgabe:

      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
Knabberzeug
quelle
Hier fehlen viele Kräfte. was ist mit 21 ^ 3 etc? Was ist Ihre Definition von "nicht-trivialen Kräften"?
Hallvabo
Ist es auch möglich, mehrere Zeilen mit derselben Nummer auf der linken Seite zu drucken, wenn es mehrere Lösungen gibt?
FUZxxl
@hallvabo, hoppla, heute morgen hast du noch keinen Kaffee getrunken.
repariert
@FUZxxl, Sie müssen die mehreren Lösungen in dieselbe Zeile stellen. Bei Interesse senden Sie bitte auch die alternative Version, wenn die Anforderung einen großen Unterschied in Ihrer Sprache
ausmacht
+1 wenn ich mehr Stimmen bekomme :-)
hallvabo

Antworten:

6

Ruby 1.9, 112 111 99 Zeichen

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

Dieser Vorgang dauert auf meinem System etwa 0,8 Sekunden. Eine schnellere Lösung ist 111 Zeichen lang:

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*", "]*" = "}
Ventero
quelle
7

Python, 113

R = Bereich
für k in R (4097):
 v = ',' .join ('i' + '^' + 'j' für i in R (2,65) für j in R (2,13), wenn i ** j == k)
 wenn v: print k, '=', v

Dies dauert einige Sekunden.
Eine schnellere (148 Zeichen) Version, die ein Wörterbuch verwendet, um die äußerste Schleife zu vermeiden, läuft in ~ 0,01 Sekunden:

R = Bereich (2,65)
p = {}
für i in R:
 für j in R:
    wenn i ** j <4097: p [i ** j] = p.get (i ** j, []) + [`i` + '^' +` j`]
für k, v in sortiert (p.items ()): print k, '=', ',' .join (v)
hallvabo
quelle
Ich bin mir ziemlich sicher, dass das Gleichheitszeichen für die Ausgabe erforderlich ist, obwohl dies die Codegröße nicht wesentlich ändern sollte.
Kevin Brown
Whops, ich habe es versehentlich entfernt, als ich das (optionale) führende Leerzeichen entfernt habe. Repariert!
Hallvabo
4

Windows PowerShell, 102

Mit Hilfe von Ventero für den ersten Code.

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

(Letzte nicht benötigte Zeile)

Noch viel Code für die Präsentation ...

Hinweis: in der Theorie zu ändern 63und 63zu yund yspart 2 weitere Bytes aber diese Version verwendet extreme Menge an Speicher.

Bearbeitet von randomra.

JB
quelle
Mit [Leerzeichen] j [Backtick] ^, ''; ',' werden 'j';'^';' ';', '3 Bytes gespeichert . (
Aufgehört zu
@randomra Du hast Bearbeitungsrechte; bitte fahre fort! (Ich kann mit J keine Box finden, die mit meinem aktuellen Setup überprüft werden kann, und ich habe es irgendwie eilig). Dies würde J zum Besten der Show machen, es wäre schade, es nicht zu zeigen! :-)
JB
3

Bash, 138 Zeichen

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

Bearbeitungen

  • (169: 155) 2 forfür a while.
  • (155: 148) Mit anhängen+=
  • (148: 147) Ausgabe mit while, Wiederverwendung von j
  • (147: 142) Verwenden Sie sed, um leere Zeilen zu entfernen
  • (142: 137) gesetzt vin (()), v Verwendung für 4096 (letzter Wert)
  • (137: 134) Anführungszeichen entfernen, (())Ausdrücke verbinden
  • (134: 132) Ersetzen Sie Schleifen durch rekursive Funktionen
  • (132: 142) hat das Komma vergessen ,:(
  • (142: 138) müde von Updates: p
Eelvex
quelle
2

PHP, 138 Zeichen - Ausgabe

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

Ungolfed

<?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";
}
Kevin Brown
quelle
2

Python, 127 Zeichen

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:]
Keith Randall
quelle
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~" = "]

Das wurde peinlich lange. Etwa 25 Zeichen werden für die Ausgabeformatierung verwendet. Der eigentliche Code ist ziemlich einfach: Filtern Sie die Zahlen, bei denen alle Exponenten in der Primfaktorisierung gleich sind. Dann liefert jeder dieser Werte ein Ergebnis für jeden Teiler des Exponenten (mit Ausnahme von 1, einschließlich sich selbst).

Martin Ender
quelle
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;
 }

Ich habe nicht Golf gespielt, auch dieser Ansatz ist nicht der beste, aber dennoch schnell genug, um eine exakte Null in Ideone zu erreichen .

Quixotic
quelle
1

OCaml + Batteries, 220 206 158 156 Zeichen

Nehmen Sie einen Hinweis von den am besten bewerteten Lösungen:

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

(Zeilenenden mit signifikanten Leerzeichen, um die Zeilen kurz zu halten.) Eine schnellere, aber längere Version, die Potenzen erzeugt, anstatt sie zu testen:

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.?])))
Matías Giovannini
quelle
1

Haskell, 146 Zeichen

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]
MtnViewMark
quelle
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)
zzzzBov
quelle
2
Zurückgerollt; Bitte poste Golf-Vorschläge als Kommentare, nicht als Änderungen.
Lirtosiast
1

Pyth, 39 Bytes

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

Probieren Sie es hier online aus .

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

Wenn das Ausgabeformat flexibel genug ist , um die Notwendigkeit von Räumen zu entfernen, -5 - Bytes zu ersetzen , " = "mit \=und ", "mit\,

Sok
quelle
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]
CAS
quelle
Potenzen, die den gleichen Wert haben, sollen sich in der gleichen Zeile befinden
MtnViewMark
0

JavaScript, 148 Zeichen

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)
Casey Chu
quelle
0

C 184

Sollte (mit Warnungen) mit jedem C-Compiler kompilieren

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);
}
edc65
quelle
0

Pyth, 55 Zeichen

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

Ich habe Pyth zum ersten Mal benutzt, daher kann es wahrscheinlich verbessert werden. Es ist eine Brute-Force, die bis zu 64 ^ 64 prüft, also ziemlich langsam ist. Sie können Zeit sparen, indem Sie nur bis zu 64 ^ 12 prüfen, dies würde jedoch ein Byte kosten.

Elch
quelle
0

JavaScript (ES6) 134 127

Edit überarbeitet, Bugfix und gekürzt Edit 2 Nach einigen Recherchen stellte ich fest, dass diese Antwort aus chronologischen Gründen ungültig war. Die Frage geht arrow functionsum Jahre zurück.

Trotzdem sind die anderen Antworten von JS viel zu kompliziert

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

edc65
quelle
Wenn Ihnen die Formatierung mit '=' nicht so wichtig ist, können Sie sie auf 121 Byte reduzieren: für (l = [], b = 1; ++ b <65;) für (e = 2, r = b ; (r * = b) <4197;) (l [r] = l [r] || []). push (b + '^' + e ++); l.map ((v, i) => console. log (i + '=' + v.join`, `))
Mama Fun Roll
@ Molarmanful gibt es strenge Anforderungen an die Formatierung
edc65
Na ja ... zumindest den v.join Teil ändern. Das kann zumindest die Anzahl der Bytes auf 123
Mama Fun Roll
@molarmanful Zu der Zeit, als diese Herausforderung (und diese Antwort!) veröffentlicht wurden, wurden Vorlagenzeichenfolgen in keinem Browser implementiert: Firefox war das erste - rel 34, dec first 2014 - dann Chrome, März 2015. Sie können keine Funktion verwenden, die verfügbar war 3 Jahre nach der Frage
edc65
Na ja ... das wusste ich nicht. Ich bin gerade vor einer Woche zu ES6 gekommen!
Mama Fun Roll
0

05AB1E , 36 Bytes

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

Ich habe das Gefühl, dass dies durch einen etwas anderen Ansatz ein wenig verbessert werden kann.

Probieren Sie es online aus.

Erläuterung:

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)
Kevin Cruijssen
quelle