Pouvoirs non triviaux

15

Ecrivez le programme le plus court pour imprimer les puissances non triviales ≤ 2 ^ 12 dans l'ordre

une puissance non triviale signifie que la base et l'exposant sont> 1

Le premier espace est facultatif.
Lorsqu'il existe plusieurs solutions, la commande n'est pas importante, donc

16 = 4^2, 2^4 est ok

Exemple de sortie:

      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
grignoteur
la source
Il manque beaucoup de pouvoirs ici; qu'en est-il de 21 ^ 3 etc? Quelle est votre définition des «pouvoirs non triviaux»?
hallvabo
Est-il également possible d'imprimer plusieurs lignes avec le même numéro à gauche, s'il existe plusieurs solutions?
FUZxxl
@hallvabo, oops n'a pas encore pris de café ce matin. corrigé maintenant
gnibbler
@FUZxxl, vous devez mettre les multiples solutions sur la même ligne, bien que pour l'intérêt, veuillez également soumettre la version alternative si l'exigence fait une grande différence dans votre langue
gnibbler
+1 quand j'obtiens plus de votes :-)
hallvabo

Réponses:

6

Ruby 1.9, 112 111 99 caractères

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

Cela prend environ 0,8 seconde pour terminer sur mon système. Une solution plus rapide comporte 111 caractères:

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
la source
7

Python, 113

R = plage
pour k dans R (4097):
 v = ',' .join (`i` + '^' +` j`for i in R (2,65) for j in R (2,13) ​​if i ** j == k)
 si v: imprimer k, '=', v

Cela prend quelques secondes.
Une version plus rapide (148 caractères), utilisant un dictionnaire pour éviter la boucle la plus externe, s'exécute en ~ 0,01 sec:

R = plage (2,65)
p = {}
pour i dans R:
 pour j dans R:
    si i ** j <4097: p [i ** j] = p.get (i ** j, []) + [`i` + '^' +` j`]
pour k, v en tri (p.items ()): affiche k, '=', ',' .join (v)
hallvabo
la source
Je suis presque sûr que le signe égal est requis pour la sortie, bien que cela ne devrait pas changer beaucoup la taille du code.
Kevin Brown
Whops, je l'ai accidentellement supprimé lorsque je me suis débarrassé du premier espace (facultatif). A corrigé!
hallvabo
4

Windows PowerShell, 102

Avec l'aide de Ventero pour le code initial.

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

(dernière nouvelle ligne inutile)

Encore beaucoup de code pour la présentation ...

Remarque: en théorie, changer 63et63 à yet yenregistre 2 plus d' octets , mais cette version utilise quantité extrême de la mémoire.

Édité par randomra.

JB
la source
Utiliser [espace] j [backtick] ^, ''; ',' au lieu d' 'j';'^';' ';', 'enregistrer 3 octets. (Abandonné le formatage ...)
randomra
@randomra Vous avez les droits d'édition; allez-y! (Je ne trouve pas de boîte avec J pour vérifier ma configuration actuelle, et je suis en quelque sorte pressé). Cela ferait de J le meilleur du spectacle, il serait dommage de ne pas le montrer! :-)
JB
3

Bash, 138 caractères

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

Modifications

  • (169: 155) 2 forpour a while.
  • (155: 148) Ajoutez avec+=
  • (148: 147) sortie avec while, réutilisation de j
  • (147: 142) utilisez sed pour supprimer les lignes vides
  • (142: 137) mis ven (()), l' utilisation v pour 4096 (dernière valeur)
  • (137: 134) supprimer les citations sed, joindre des (())expressions
  • (134: 132) remplacer les boucles par des fonctions récursives
  • (132: 142) a oublié la virgule ,:(
  • (142: 138) fatigué des mises à jour: p
Eelvex
la source
2

PHP, 138 caractères - Sortie

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

Non golfé

<?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
la source
2

Python, 127 caractères

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
la source
2

Mathematica, 152 octets

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

Cela est devenu d'une longueur embarrassante. Quelque chose comme 25 caractères sont dépensés pour le formatage de sortie. Le code réel est assez simple: filtrez les nombres où tous les exposants de la factorisation première sont égaux. Ensuite, pour chacun d'entre eux, produire un résultat pour chaque diviseur de l'exposant (à l'exclusion de 1, y compris lui-même).

Martin Ender
la source
1

C (589 octets)

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

Je n'ai pas joué au golf également, cette approche n'est pas la meilleure mais elle est pourtant assez rapide pour produire un 0 exact en idéone .

Chimérique
la source
1

OCaml + batteries, 220 206 158 156 caractères

Prendre un indice parmi les solutions les mieux notées:

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

(Les fins de ligne à des espaces significatifs pour garder les lignes courtes.) Une version plus rapide mais plus longue qui génère des pouvoirs au lieu de les tester:

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
la source
1

Haskell, 146 caractères

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
la source
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
la source
2
Annulées; veuillez poster des suggestions de golf sous forme de commentaires, pas de modifications.
lirtosiast
1

Pyth, 39 octets

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

Essayez-le en ligne ici .

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

Si le format de sortie est suffisamment flexible pour supprimer le besoin d'espaces, -5 octets à remplacer " = "par \=et ", "avec\,

Sok
la source
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
la source
les puissances qui ont la même valeur sont censées être sur la même ligne
MtnViewMark
0

JavaScript, 148 caractères

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
la source
0

C 184

Devrait compiler (avec des avertissements) avec n'importe quel compilateur 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);
}
edc65
la source
0

Pyth, 55 caractères

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

Ma première fois en utilisant Pyth, il peut donc probablement être amélioré. C'est une force brute qui vérifie jusqu'à 64 ^ 64, donc est assez lente. Vous pouvez gagner du temps en vérifiant uniquement jusqu'à 64 ^ 12, mais cela coûterait un octet.

élan
la source
0

JavaScript (ES6) 134 127

Edit révisé, corrigé et raccourci Edit 2 Après quelques recherches, j'ai réalisé que cette réponse n'était pas valide pour des raisons chronologiques. La question est antérieurearrow functions à des années.

Cela dit, les autres réponses JS sont beaucoup trop compliquées

/* 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
la source
Si vous ne vous souciez pas trop de la mise en forme '=', vous pouvez réduire jusqu'à 121 octets: pour (l = [], b = 1; ++ b <65;) pour (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 il y a des exigences strictes sur le formatage
edc65
Eh bien ... changez au moins la partie v.join. Cela peut au moins ramener le nombre d'octets à 123.
Mama Fun Roll
@molarmanful au moment où ce défi (et cette réponse!) a été publié, les chaînes de modèle n'ont été implémentées dans aucun navigateur: Firefox a été le premier - rel 34, déc premier 2014 - puis Chrome, mars 2015. Vous ne pouvez pas utiliser une fonctionnalité qui était disponible 3 ans après la question
edc65
Eh bien ... je ne le savais pas. Je viens d'entrer dans ES6 il y a une semaine!
Mama Fun Roll du
0

05AB1E , 36 octets

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

J'ai le sentiment que cela peut être amélioré un peu en utilisant une approche légèrement différente ..

Essayez-le en ligne.

Explication:

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
la source