複数の方法で完璧な力?


13

チャレンジ

あなたの仕事は、正の整数Nが与えられると、複数の方法で完全なベキとして表現できるN以下のすべての正の整数を見つけるプログラムまたは関数を書くことです。

定義

完全なパワーは、m ^ kで見つかった数値iとして定義されます。ここで、

  • miは正の整数です
  • m!= k

テストケース

入力->出力
1000-> 16、64、81、256、512、625、729
56-> 16
999-> 16、64、81、256、512、625、729
81-> 16、64、81
1500-> 16、64、81、256、512、625、729、1024、1296

読みやすいコメント付きのバージョンも提供してください。


最後の文は、空白が文字数に含まれないことを意味していますか?
sepp2k

@ sepp2kはい!空白はカウントしないでください。
fR0DDY

4
@ fR0DDY 言語の空白はどうですか?空白文字を無視すると、常にこの言語が優先されます。
マーコグ

4
空白の回答で勝てる奇妙な質問をするのは痛いとは思いません。誰かがそれをするのに悩むことができるようになるまでにどれくらい時間がかかるかを見なければならない。
ニブラー

1
Nに制限はありますか?
ドグバート

回答:


3

Mathematica:103文字

スペースを削除できます

Select[Flatten@
       Table[
        Solve[Log@#/Log@b == k, k, Integers] /. k -> #, {b, 2, #}] & /@ Range@#, 
Length@# > 2 &][[All, 1, 1]] &  

使用法:

%[81]
{16, 64, 81}

3

Jelly、11バイトの意味のある、言語のポストデートチャレンジ

ḊḟÆR *@þ Ḋ  F  fḊ

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

これはまったく異なるソリューションです。これは、非常に非効率的なラッパーで効率的なコアアルゴリズムを使用して(非常に大きな数を処理できないように)効率的および非効率的な奇妙なハイブリッドです。前と同じように、すべての空白は無意味です。

仕組みは次のとおりです。(複数回表示されます)は、2から入力までの数値のリストです:

ḊḟÆR *@þ Ḋ  F  fḊ
ḊḟÆR                Ḋ, with all primes between 2 and the input removed
                    (i.e. all composite numbers from 4 to the input)
     *@þ Ḋ          Exponentiate all Ḋ elements with all ḊḟÆR elements
            F       Flatten the result (it had a nested structure)
               fḊ   Keep only elements in Ḋ

ここでの基本的な観察は、数値が複数の点で完全なべき乗であるということです。ただし、それは合成指数を持つ完全なべき乗(1ではない)である場合のみです。基数が2から入力までで、指数が4から入力までの合成数であるもののリストを生成します。本当に大きな数字が生成されるため、これは非常に遅くなります。これらはすべて質問に対する答えです。次に、範囲内の回答のみを保持します。

範囲内の最大電力が何であるかを計算し、それ以上反復しないことで、これを非常に効率的な答えに簡単に変更することができますが、それはより多くのバイトになるでしょう、これはコードゴルフです。


1

Perl:68文字

で最大(1000)を取得し$N、で答えを返します@a

for $x ( 2..$N ) {
    $c{$x**$_}++ for 2..log($N)/log$x
}
@a = grep { $c{$_} > 1 } keys %c

プログラム全体では、さらに18文字が必要です。

$m = shift;
for $x ( 2..$m ) {
    $c{$x**$_}++ for 2..log($m)/log$x
}
print join ' ', grep { $c{$_} > 1 } keys %c

これは順番に印刷されません。codepad.org/H0Zyau3z
ドグバート

@Dogbert:順番に印刷することは課題の一部ではありません。もしそうなら、sort 前に追加することができますgrep。ちなみに、以前はコードパッドを見たことがありませんでした。ありがとう。

0

Ruby-101文字(空白なし)

f=->l{c=Hash.new{0}
2.upto(1E4){|i|2.upto(20){|j|c[i**j]+=1}}
c.map{|k,v|v>1&&k<=l&&k||p}.compact.sort}

以下のための作品集1 <= limit <= 100,000,0005秒以内。

テスト

> f[10000]
[16, 64, 81, 256, 512, 625, 729, 1024, 1296, 2401, 4096, 6561, 10000]

0

ゼリー、13人の意味のあるキャラクター、言語のポストデートの挑戦

R  µ  ọḊ *@Ḋ ċ >2  µ  Ðf

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

ここの空白はすべて重要ではありません。質問が尋ねるとおり、私はそれを使って私の答えの構造を示しました。

仕組みは次のとおりです。

R  µ  ọḊ *@Ḋ ċ >2  µ  Ðf
R                     Ðf    Find all numbers n from 1 to the input, such that:
   µ               µ          (grouping marks, like {} in C)
       Ḋ   Ḋ                  Take the range from 2 to n
      ọ                       Find the number of times each divides n
         *@                   Raise the range from 2 to n to these powers
             ċ                Count the number of times n appears
               >2             and the result must be greater than 2

たとえば、n = 256をテストするとき、2〜256の各数値が256に分割される回数をチェックします。複数回分割されるのは、2(8回分​​割)、4(4分割回)、8(2回分割)、および16(2回分割)。したがって、分割数をそこで決定された権限に引き上げると、次のようになります

2⁸, 3, 4⁴, 5, 6, 7, 8², 9, 10, 11, 12, 13, 14, 15, 16², 17, ..., 255, 256

これにより、元の値256が生成されます。これは、256が完全な累乗である方法に1を加えた回数に1を加えたものです(256 =256¹であるため、最後の要素は256を生成します)。したがって、配列に256を2回以上表示する場合(この場合、8²は64ですが、他の「興味深い」要素はすべて256を生成します)、それは完全なパワーでなければなりません。

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