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

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

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)

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

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.


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

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

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:]

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


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 .


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.?])))

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]

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
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\,


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]

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)

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

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.


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>


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)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.