Pouvoirs entiers

19

Certains nombres comme 64peuvent être exprimés en puissance entière de plusieurs façons:

64 ^ 1
 8 ^ 2
 4 ^ 3
 2 ^ 6

Afficher un tableau trié de toutes ces puissances possibles (ici [1,2,3,6]) en aussi peu d'octets que possible.


Contribution

Un nombre entier positif supérieur à 1 et inférieur à 10000.


Production

Tableau de puissances de nombre entier p(y compris 1) pour lesquelles l'entrée peut être exprimée comme a^pavec nombre entier a. Les sorties peuvent avoir des décimales, tant qu'elles sont en ordre.

Tout problème de virgule flottante doit être géré par le programme.


Exemples

Input: 3
Output: [1]

Input: 9
Output: [1, 2]

Input: 81
Output: [1, 2, 4]

Input: 729
Output: [1, 2, 3, 6]

Tableau d'affichage

Pour que votre score apparaisse sur le tableau, il doit être dans ce format:

# Language, Bytes

Les barrés ne devraient pas poser de problème.

Portes Zach
la source
1
Ma réponse s'imprime [1 2 3 6]pour le dernier cas de test. Pourrait-il également imprimer [6 3 2 1], [1.0 2.0 3.0 6.0]ou [6.0 3.0 2.0 1.0]?
Dennis
2
Que pouvons-nous supposer sur les tailles d'entrée et l'arithmétique à virgule flottante? Cela affecte la solution dans laquelle vous essayez de prendre racine du nombre et voyez si le résultat est entier.
xnor
4
Je pense que les références aux racines déroutaient tout le monde, alors je l'ai réécrit en termes de pouvoirs. N'hésitez pas à changer les choses en arrière.
xnor
1
J'apprécie le montage! Les suggestions et révisions sont toujours les bienvenues, à condition qu'elles améliorent la qualité de ma question (ce que je crois que la vôtre a fait). Je n'ai commencé que récemment à poser des questions sur ce réseau particulier et je trouve la communauté généralement accueillante. La critique et la correction sont très appréciées! @xnor
Zach Gates
1
Trouvez simplement la plus grande puissance valide et listez ses facteurs!
SuperJedi224

Réponses:

10

Pyth, 10 octets

f}Q^RTSQSQ

Manifestation

Pour chaque puissance, il génère la liste de tous les nombres jusqu'à l'entrée prise pour cette puissance, puis vérifie si l'entrée est dans la liste.

isaacg
la source
10

Haskell, 38

f n=[b|b<-[1..n],n`elem`map(^b)[1..n]]

Assez simple. La compréhension de la liste trouve les valeurs bpour lesquelles l'entrée napparaît parmi [1^b, 2^b, ..., n^b]. Il suffit de vérifier bla plage [1..n].

xnor
la source
9

Python 2, 53

lambda n:[i/n for i in range(n*n)if(i%n+1)**(i/n)==n]

Brute force toutes les combinaisons de bases dans les exposants dans [0, n-1] et les bases dans [1, n].

feersum
la source
8

Python 3, 56 octets

lambda n:[i for i in range(1,n)if round(n**(1/i))**i==n]

C'est vraiment maladroit. Teste si chaque iracine potentielle -th donne un entier en l'arrondissant, en lui prenant la puissance de iet en vérifiant qu'il est égal à l'original.

Vérifier directement que la racine est un nombre entier est délicat car les virgules flottantes donnent des choses comme 64**(1/3) == 3.9999999999999996. L'arrondir à un entier nous permet de vérifier si la prise de puissance revient à la valeur d'origine. Merci à ypercube de l'avoir suggéré, économisant 1 octet.

feersum a une solution plus courte et plus intelligente . Vous devriez tous vraiment voter pour cela.

xnor
la source
Ne serait-il pas exact de vérifier round(n**(1/i),0)**i==n?
ypercubeᵀᴹ
@ypercube Bon appel, en plus d' 0être la précision par défaut pour le tour, cela économise un octet.
xnor
7

Pyth, 11 10 12 octets

fsmqQ^dTSQSQ

Vérifie toutes les combinaisons de pouvoirs possibles. Très lent.

orlp
la source
5

CJam, 23 octets

rimF{1=:E){E\d%!},}%:&p

Cela fonctionne en prenant la factorisation principale de n et en calculant l'intersection des diviseurs de tous les exposants.

Il est un peu plus long que mon autre solution , mais je m'attends à ce qu'il fonctionne (et se termine instantanément) pour tous les entiers compris entre 2 et 2 63 - 1 .

Essayez-le en ligne dans l' interpréteur CJam .

Comment ça fonctionne

ri                       Read an integer from STDIN.
  mF                     Push its prime factorization.
    {             }%     For each [prime exponent]:
     1=:E                  Retrieve the exponent and save it in E.
         ){     },         Filter; for each I in [0 ... E]:
           E\d%              Compute E % Double(I).
                             (Casting to Double is required to divide by 0.)
               !             Push the logical NOT of the modulus.
                           Keep I if the result is truhty, i.e., if I divides E.
                    :&   Intersect all resulting arrays of integers.
                      p  Print the resulting array.
Dennis
la source
5

APL, 17 octets

(X=⌊X←N*÷⍳N)/⍳N←⎕

Mon premier programme APL; les suggestions de golf sont appréciées.

              N←⎕  ⍝ Store input into N
             ⍳     ⍝ The list [1 2 ... N]
            /      ⍝ Select the elements A for which
      N*÷⍳N)       ⍝ N^(1/A)
(X=⌊X←             ⍝ equals its floor (that is, is an integer)
lirtosiast
la source
Veuillez ajouter un pseudocode / explication. Mais +1 (ne peut pas voter pour le moment) pour avoir utilisé APL (- être concis avant qu'il ne soit cool ) :-)
mınxomaτ
+1 également, beaucoup d'amour pour APL. Véhicule de golf ultime.
Sur la base du pseudocode, il est peu probable que cela fonctionne (sauf si APL effectue un test d'égalité approximative en virgule flottante). Par exemple, avec pow(pow(7,3),1./3))je reçois 6.99999999999999en C ou Python. En effet, la précision est perdue lors du calcul de 1 / A.
feersum
@feersum Je ne connais pas les interprètes hors ligne, mais tous les pouvoirs de 3 fonctionnent correctement sur tryapl.org.
lirtosiast
@ThomasKwa Il semble qu'un test d'égalité approximatif soit effectivement utilisé. dyalog.com/uploads/documents/Papers/tolerant_comparison/…
feersum
3

JavaScript (ES5), 73 octets 81 octets 79 octets 75 octets

for(n=+prompt(),p=Math.pow,i=0;i++<n;)p(.5+p(n,1/i)|0,i)==n&&console.log(i)

Vérifie si la puissance entière la plus proche de la racine possible est égale n. ~~(.5+...)est équivalent à Math.round(...)pour les expressions dans la plage entière (0 à 2 ^ 31 - 1).

Modifier: utilisé la &&logique paresseuse au lieu de ifraser 2 octets et ajouté une invite d'entrée car la question a ajouté une clarification. Supposait auparavant que l'entrée était stockée dans n.

Edit 2: modifié ~~(.5+...)pour .5+...|0enregistrer deux octets en évitant le regroupement.

Edit 3: supprimé varpour enregistrer 4 octets. En mode non strict, cela est acceptable.

Patrick Roberts
la source
Vous pouvez raser quelques octets en jonglant avec des expressions: pour (var p = Math.pow, i = 1; i ++ <n; p (~~ (.5 + p (n, 1 / i)), i) == n && console .log (i));
@Alhadis merci pour votre contribution, je ferai un montage dans un peu
Patrick Roberts
@PatrickRoberts Vous pouvez vous faufiler p=Math.powdans l'enregistrement rapide d'un octet
Downgoat
@vihan, ce serait une déclaration invalide, car varest requise
Patrick Roberts
Sauf si vous vouliez dire forau lieu de prompt..
Patrick Roberts
3

Brachylog , 8 octets

≥^↙.?≥ℕ≜

Essayez-le en ligne!

Prend l'entrée via sa variable d'entrée et génère chaque puissance via sa variable de sortie, dans l'ordre croissant selon les besoins, contrairement à l'ancienne solution ≥ℕ≜^↙.?∧qui se trouve avoir exactement la même longueur.

≥           Some number which is less than or equal to
            the input,
 ^          when raised to the power of
  ↙.        the output,
    ?       is the input.
       ≜    Label
            the output
      ℕ     as a whole number
     ≥      which is less than or equal to
    ?       the input.

Je n'ai aucune justification rigoureuse pour affirmer que chaque exposant n'est pas supérieur à l'entrée, mais pour que le programme se termine réellement, il doit être limité.

ḋḅlᵛfest une solution beaucoup plus courte (non génératrice) pour tous les cas de test donnés, mais elle échoue si l'entrée n'est pas une puissance d'un produit de nombres premiers distincts. (Venez y penser, puisque tous les cas de test sont des pouvoirs de nombres premiers, ḋlfça marche aussi ...) Le meilleur que j'ai trouvé pour sauver l'idée ḋḅlᵐḋˢ⊇ᵛ×f,, sort à 10 octets.

Chaîne indépendante
la source
3

Gelée , 6 octets

ÆEg/ÆD

Essayez-le en ligne!

    ÆD    The list of divisors of
ÆE        the exponents in the prime factorization of the input
   /      reduced by
  g       greatest common divisor.
Chaîne indépendante
la source
2

JavaScript ES7, 66 octets

Tire parti des compréhensions expérimentales des tableaux. Fonctionne uniquement sur Firefox.

n=>[for(i of Array(n).keys(m=Math.pow))if(m(0|.5+m(n,1/i),i)==n)i]

Golf possible. J'essaierai probablement d'écraser les expressions un peu plus courtes et j'espère trouver une alternative à la longue Array(n).keys()syntaxe.

Peut être plus court mais JavaScript a une précision horriblement virgule flottante.

Downgoat
la source
Ah, j'ai appris quelque chose de nouveau ... cool.
Patrick Roberts
2

CJam, 20 octets

ri_,1df+\1$fmL9fmO&p

Pour l'entrée n , cela calcule le log b n pour tout b inférieur ou égal à n et conserve les résultats qui sont des entiers.

Cela devrait fonctionner pour tous les entiers compris entre 2 et 9 999 . Le temps d'exécution est à peu près O (n) .

Essayez-le en ligne dans l' interpréteur CJam .

Comment ça fonctionne

ri                   e# Read an integer N from STDIN.
  _,                 e# Copy N and transform it into [0 ... N-1].
    1df+             e# Add 1.0 to each, resulting in [1.0 ... Nd].
        \1$          e# Swap the array with N and copy the array.
           fmL       e# Mapped log base N: N [1.0 ... Nd] -> [log1(N) ... logN(N)]
              9fmO   e# Round each logarithm to 9 decimals.
                  &  e# Intersect this array with [1.0 ... Nd].
                   p e# Print the result.
Dennis
la source
Est-ce que 15 625 est la seule entrée sur laquelle il échoue ou est-ce la seule qui a échoué que vous avez testée?
Beta Decay
Il y en a certainement d'autres. En fait, je viens de découvrir qu'il a également échoué pour 4913 , ce qui a invalidé ma révision précédente.
Dennis
2

Rubis, 50

->n{(1..n).map{|i|(n**(1.0/i)+1e-9)%1>1e-8||p(i)}}

Imprime à l'écran.

Rubis, 57

->n{a=[]
(1..n).map{|i|(n**(1.0/i)+1e-9)%1>1e-8||a<<i}
a}

Renvoie un tableau.

En programme de test:

f=->n{(1..n).map{|i|(n**(1.0/i)+1e-9)%1>1e-8||puts(i)}}

g=->n{a=[]
(1..n).map{|i|(n**(1.0/i)+1e-9)%1>1e-8||a<<i}
a}

f.call(4096)
puts g.call(4096)

Calcule chaque racine et les teste modulo 1 pour voir si le reste est inférieur à 1e-8. En raison de la précision limitée, certaines racines entières valides sont calculées sous la forme 0,9999 .., d'où la nécessité de leur ajouter 1e-9.

On calcule jusqu'à la nième racine de n, ce qui est une surpuissance totale, mais semblait le moyen le plus court d'écrire une boucle non infinie.

Level River St
la source
2

Stax , 6 octets

£ÅeÉåC

Exécuter et déboguer

Tous les diviseurs du nombre entier d'exposants dans la décomposition en facteurs premiers. C'est la même chose que l'algorithme de gelée.

récursif
la source
2

DC, 104 octets

L'entrée est prise à partir du terminal, la sortie est imprimée et également sur la pile.

Parce que cela utilise le? opérateur, vous devez utiliser dc -e "<solution>"ou dc <file with solution in it>.

Personne ne voit jamais mes réponses, encore moins voter sur elles, mais j'aime vraiment résoudre des problèmes dans DC. C'est la solution la moins efficace dans ce fil jusqu'à présent, mais j'ai pensé que je la publierais de toute façon.

1sb?sn[lesi]ss[lble1+dse^dln=sln>c]sc[liSflq1+sq]sm[Lfplq1-dsq0<p]dsp[lb1+sb0si0selcxli0!=mlbln!=h]dshxx

trucs de démarrage

1sb           Store 1 in register b
?sn           Store user input in register n
[lesi]ss      A macro to copy the e to the i register, stored in the s register

Macro pour élever une base à tous les pouvoirs jusqu'à ce que le résultat soit supérieur à la cible ou égal à la cible

[lble1+dse^dln=sln>c]sc
[lb                 ]   load our base num (register b)
[  le               ]   load our exponent (register e)
[    1+dse          ]   add 1 to the exponent, copy and store in the e register
[         ^d        ]   raise the base to the exponent and copy it
[           ln=s    ]   load the user input, if that is equal to the power result run the macro in register s
[               ln>c]   load the user input, if it's greater than the power result run the macro in register c (this one)
[                   ]sc save this macro in register c

Macro pour enregistrer une valeur d'exposant valide trouvée dans les macros d'exposant ci-dessus dans une autre pile

[liSflq1+sq]sm
[liSf      ]     copy the i register to the top of the stack in register f
[    lq1+sq]     add 1 to the q register
[          ]sm   save this macro in the m register

Macro pour exécuter la macro 2x ci-dessus (macro c) sur toutes les bases de 2 à notre nombre cible

[lb1+sb0si0selcxli0!=mlbln!=h]dsh
[lb1+sb                      ]     add 1 to the base number
[      0si0se                ]     reset the i and e registers (previously found value and exponent
[            lcx             ]     load and run the c macro
[               li0!=m       ]     load the result of the c macro and if it's not 0, run m to save it to the f stack
[                     lbln!=h]     if our base number is not equal to our target number, run macro h (this macro)
[                            ]dsh  duplicate this macro and save one copy, so that one is left on the stack to run later

Macro pour imprimer les valeurs de la pile f

[Lfplq1-dsq0<p]dsp
[Lfp          ]      load the top value from the f register and print it
[   lq1-dsq   ]      load the q register and subtract one from it and save it
[          0<p]      if the q register is greater than 0, run macro p (this macro) again
[             ]dsp   duplicate this macro and save one copy, so that one is left on the stack to run later

xx finally run the two macros on the stack (h and then p)

FlexEast
la source
1
Je suppose que peu de gens connaissent DC. Répondre à de nouvelles questions (en particulier étant l'une des premières réponses) aidera à attirer davantage l'attention. Vous pouvez également essayer d'utiliser des liens TIO pour vos réponses, car c'est très populaire. Voici DC sur TIO .
mbomb007
Merci! Je vais certainement l'utiliser pour les réponses à venir!
FlexEast
0

Japt , 10 octets

õ
f@mpX øN

Essayez-le

õ            :Implicit input of integer U
õ            :Range [1,U]
f@mpX øN     :Reassign to U
f            :Filter
 @           :By passing each X through the following function
  m          :  Map U
   pX        :    Raise to the power of X
      ø      :  Contains
       N     :    Any element of the (singelton) array of inputs
Hirsute
la source