整数のべき乗


19

のようないくつかの数値64は、複数の方法で整数のべき乗として表現できます。

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

可能な限りすべてのそのようなべき乗(ここでは[1,2,3,6])のソートされた配列を、できるだけ少ないバイトで出力します。


入力

1より大きく10000より小さい正の整数。


出力

入力がwhole-numberで表現できる整数のべき乗の配列p(を含む1)。出力は、順番に並んでいる限り、小数を含む場合があります。a^pa

浮動小数点の問題はすべてプログラムで処理する必要があります。


Input: 3
Output: [1]

Input: 9
Output: [1, 2]

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

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

スコアボード

ボードにスコアを表示するには、次の形式にする必要があります。

# Language, Bytes

取り消し線は問題を引き起こさないはずです。


1
[1 2 3 6]最後のテストケースの回答が印刷されます。それはまた、印刷できませんでした[6 3 2 1][1.0 2.0 3.0 6.0]または[6.0 3.0 2.0 1.0]
デニス

2
入力サイズと浮動小数点演算について何を想定できますか?これは、数値の根を取り、結果が整数かどうかを確認しようとするソリューションに影響します。
-xnor

4
ルーツへの言及は皆を混乱させたと思うので、力の観点​​から書き直しました。物事を元に戻してください。
xnor

1
編集に感謝します!私の質問の質が向上したのであれば、提案や改訂はいつでも歓迎します(あなたがしたと思う)。この特定のネットワークで質問を始めたのはごく最近のことで、コミュニティが一般的に歓迎していることがわかりました。批判と修正は大歓迎です!@xnor
ザック・ゲイツ

1
最大の有効電力を見つけて、その要因をリストしてください!
SuperJedi224

回答:


10

Pyth、10バイト

f}Q^RTSQSQ

デモンストレーション

各累乗について、その累乗の入力までのすべての数値のリストを生成し、入力がリストにあるかどうかを確認します。


10

ハスケル、38

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

とても簡単です。リスト内包表記はb、入力nがの中で現れる値を見つけます[1^b, 2^b, ..., n^b]b範囲をチェックインするだけで十分です[1..n]


9

Python 2、53

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

ブルートは、[0、n-1]の指数の基底と[1、n]の基底のすべての組み合わせを強制します。


8

Python 3、56バイト

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

これは本当に不器用です。潜在的なi-thの各ルートが整数を与えるかどうかをテストします。整数に丸め、の累乗を取りi、元と等しいことを確認します。

ルートが整数であることを直接チェックすることは、浮動小数点がのようなものを与えるので注意が必要64**(1/3) == 3.9999999999999996です。それを整数に丸めると、パワーを取得すると元の値に戻るかどうかを確認できます。これを提案してくれたypercubeに感謝し、1バイト節約します。

feersumには、より短く、より賢い解決策があります。皆さんは本当にそれを支持するべきです。


チェックすると正確ではないでしょうround(n**(1/i),0)**i==nか?
ypercubeᵀᴹ

@ypercube良い呼び出しは、0ラウンドのデフォルトの精度であるとともに、これによりバイトが節約されます。
xnor

7

Pyth、11 10 12バイト

fsmqQ^dTSQSQ

可能なすべての力の組み合わせをチェックします。非常に遅い。


5

CJam、23バイト

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

これは、nの素因数分解を行い、すべての指数の約数の交差を計算することにより機能します。

それは少し長いよりも私の他の解決策が、私は仕事にそれを期待(と瞬時に仕上げ)との間のすべての整数の22 63 1 -

CJamインタープリターでオンラインで試してください。

使い方

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.

5

APL、17バイト

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

私の最初のAPLプログラム。ゴルフの提案は大歓迎です。

              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)

擬似コード/説明を追加してください。しかし、APLを使用して+1(今すぐ投票できません)(- クールになる前は簡潔でした):
mınxomaτ15年

また、+ 1、APLが大好きです。究極のゴルフ車両。

擬似コードに基づいて、これは動作しそうにありません(APLが近似浮動小数点等価テストを実行しない限り)。たとえば、CまたはPythonでpow(pow(7,3),1./3))取得6.99999999999999します。これは、1 / Aの計算時に精度が失われるためです。
feersum

@feersumオフライン通訳については知りませんが、tryapl.orgでは3の累乗がすべて正しく機能します。
リルトシアスト

@ThomasKwaほぼ同等のテストが実際に使用されているようです。dyalog.com/uploads/documents/Papers/tolerant_comparison/...
feersum

3

JavaScript(ES5)、73バイト 81バイト 79バイト 75バイト

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

可能なルートの最も近い整数の累乗が等しいかどうかを確認しますn。整数範囲(0〜2 ^ 31-1)内の式~~(.5+...)と同等Math.round(...)です。

編集: 2バイトを削る&&代わりにレイジーロジックを使用しif、質問に説明が追加されたため、入力プロンプトを追加しました。以前は入力がに保存されてnいると仮定していました

編集2:グループ化を避けて2バイトを節約~~(.5+...)する.5+...|0ように変更されました。

編集3:var 4バイトを節約するために削除されました。非厳密モードでは、これは許容されます。


式をジャグリングすることにより、数バイトを削ることができます:for(var p = Math.pow、i = 1; i ++ <n; p(~~(.5 + p(n、1 / i))、i)== n && console .log(i));

@Alhadis入力に感謝します。少し編集します
パトリックロバーツ

@PatrickRoberts p=Math.pow1バイトを保存するプロンプトに
絞り込める-Downgoat

@vihan、それvarは必要であるため無効な宣言になります
パトリックロバーツ

..のfor代わりに意味しない限りprompt
パトリックロバーツ

3

Brachylog、8バイト

≥^↙.?≥ℕ≜

オンラインでお試しください!

入力変数を介して入力を取得し、出力変数を介して必要に応じて昇順に各電力を生成します。≥ℕ≜^↙.?∧これは、まったく同じ長さである古いソリューションとは異なります。

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

すべての指数が入力より大きくないことを主張する厳密な正当化はありませんが、プログラムが実際に終了するためには境界が必要です。

ḋḅlᵛfは、指定されたすべてのテストケースに対してはるかに短い(ジェネレーターではない)ソリューションですが、入力が異なる素数の積の累乗でない場合は失敗します。(テストケースはすべて素数の力であるḋlfため、考えてみてください...)アイデアを救うために思いついた最高のものはḋḅlᵐḋˢ⊇ᵛ×f、10バイトになります。




2

JavaScript ES7、66バイト

実験的な配列内包表記を利用します。Firefoxでのみ機能します。

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

可能なゴルフ。表現を少し短くして、長い表現の代替案を見つけることを期待しますArray(n).keys()構文のます。

短くすることもできますが、JavaScriptの精度は恐ろしく浮動小数点です。


ああ、何か新しいことを学んだ...かっこいい。
パトリックロバーツ

2

CJam、20バイト

ri_,1df+\1$fmL9fmO&p

入力のためのN、この計算するには、ログB nはすべてのためにBを小さいか等しいn個および整数で結果を保持します。

これは間のすべての整数のために働く必要が29999。実行時間は大体 O(n)です。

でオンラインでお試しください CJamインタープリター

使い方

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.

15,625は失敗した唯一の入力ですか、それともテストした唯一の失敗ですか?
ベータ崩壊

間違いなく他のものがあります。実際、4913でも失敗したことがわかり、以前のリビジョンが無効になりました。
デニス

2

ルビー、50

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

画面に印刷します。

ルビー、57

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

配列を返します。

テストプログラムで:

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)

各ルートを計算し、1を法としてそれらをテストして、剰余が1e-8未満かどうかを確認します。精度が限られているため、有効な整数のルートの一部は0.9999の形式で計算されます。したがって、1e-9を追加する必要があります。

nのn番目のルートまで計算されます。これは完全に過剰ですが、無限ループを記述する最短の方法と思われます。



2

DC、104バイト

入力は端末から取得され、出力はスタック上にも出力されます。

これは?演算子を使用するには、dc -e "<solution>"またはを使用する必要がありますdc <file with solution in it>

誰も私の答えを見たり、投票することはできませんが、DCでの問題解決は本当に楽しいです。これまでのところ、このスレッドで最も効率の悪いソリューションですが、とにかく投稿したいと思いました。

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

スタータースタッフ

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

結果がターゲットよりも大きくなるかターゲットと等しくなるまで、すべての累乗に基数を上げるマクロ

[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

上記の指数マクロから見つかった有効な指数値を別のスタックに保存するマクロ

[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

2からターゲット番号までのすべてのベースを介してマクロの2倍(マクロc)を実行するマクロ

[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

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)


1
DCを知っている人はあまりいないと思います。新しい質問に答えること(特に最も早い回答の1つ)は、より多くの注意を引くのに役立ちます。また、TIOリンクを使用して回答することもできます。これは非常に人気があるためです。TIODCです。
mbomb007

ありがとう!今後の回答には間違いなく使用します!
FlexEast



0

Japt、10バイト

õ
f@mpX øN

それを試してみてください

õ            :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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.