高度に合成された数値


23

高度合成数は、任意の小さな正の整数で有するよりも約数を有する正の整数です。これは、OEISシーケンスA002182です。最初の20の用語は

1, 2, 4, 6, 12, 24, 36, 48, 60, 120, 180, 240, 360, 720, 840, 1260, 1680, 2520, 5040, 7560

たとえば、43の除数(つまり、1、2、4)があり、3には2の除数しかなく、2にも2の除数があり、1には1の除数があるため、シーケンス内にあります。

チャレンジ

正の整数入力を考えるとnは、出力のいずれかのn番目の高度合成数か、最初のn個お好みで高度合成数、(ただし、選択はすべての入力に対して同じでなければなりませんN)。

ルール

プログラムまたは関数は、無限の時間とメモリが与えられ、データ型の制限を考慮せずに、任意の大きな入力に対して理論的に機能する必要があります。基本的に、これは有限数の値をハードコーディングしないことを意味します。

実際には、プログラムまたは関数は妥当な時間(たとえば1分未満)でnから20まで実行する必要があります。最大入力または出力は、言語の標準データ型によって制限される場合があります(ただし、アルゴリズムは理論的に機能するはずです)任意の大きな数の場合)。

単項を含む、合理的な入力および出力形式が許可されます。

コードゴルフ。少ないバイトが勝ちます。



n番目のインデックスにゼロインデックスを付けることはできますか、または1インデックスにする必要がありますか?
アドナン

@AandN私はそれを考えていなかったので、両方とも受け入れられるとしましょう。(1ベースと0ベースの両方が提案されているメタ投稿を思い出すようですが、見つけられません。誰ですか?)
ルイスメンドー

回答:


4

05AB1E15 14バイト

ゼロインデックスの入力。つまり、n = 0与える1n = 1与える2などのコードです。

$µ>DÑgD®›i©¼}\

説明:

$               # Pushes 1 and input
 µ              # Counting loop, executes until the counting variable is equal to input
  >             # Increment (n + 1)
   DÑ           # Duplicate and calculate all divisors
     gD         # Get the length of the array and duplicate
       ®        # Retrieve element, standardized to zero
        ›i  }   # If greater than, do...
          ©     #   Copy value into the register
           ¼    #   Increment on the counting variable
             \  # Pop the last element in the stack

n = 19を計算し7560ます。これは約10秒で得られます。

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

CP-1252エンコードを使用します。


5

ゼリー、15バイト

,®ÆDL€ṛ©0>/?µƓ#

入力nの場合、これは最初のn個の高度に合成された数値を出力します。

n = 20、それは上の2秒未満かかるオンラインそれをお試しを!

使い方

,®ÆDL€ṛ©0>/?µƓ#  Main link. No implicit input.

            µ    Push the chain to the left on the local link stack.
             Ɠ   Read an integer n from STDIN.
              #  Execute the chain for k = 0, 1, 2, ..., until it returned a truthy
                 value n times. Return the list of matches.

,®               Pair k with the value in the register (initially 0).
  ÆD             Compute the divisors of k and the register value.
    L€           Count both lists of divisors.
           ?     If
         >/        k has more divisors than the register value:
      ṛ©             Save k in the register and return k.
        0          Else: Return 0.

代替バージョン、13バイト(非競合)

以下のコードは、この課題に先行する最新バージョンのJellyで機能しましたが、の実装Mは非常に遅く、時間制限に準拠していませんでした。これは修正されました。

ÆDL®;©MḢ’>µƓ#

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

使い方

ÆDL®;©MḢ’>µƓ#  Main link. No implicit input.

          µ    Push the chain to the left on the local link stack.
           Ɠ   Read an integer n from STDIN.
            #  Execute the chain for k = 0, 1, 2, ..., until it returned a truthy
               value n times. Return the list of matches.

ÆD             Compute the divisors of k.
  L            Count them.
   ®;          Append the count to the list in the register (initially 0 / [0]).
     ©         Save the updated list in the register.
      M        Obtain all indices the correspond to maximal elements.
       Ḣ       Retrieve the first result.
        ’>     Subtract 1 and compare with k.
               This essentially checks if the first maximal index is k + 2, where
               the "plus 2" accounts for two leading zeroes (initial value of the
               register and result for k = 0).

1
RÆDL€MḢ=µƓ#(11バイト)もありますが、私のマシンでは44分かかります
デニス

3

MATL26 24バイト

~XKx`K@@:\~s<?@5MXKx]NG<

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

現在検出されている除数の最大数は、クリップボードKに保持されます。高複合数(HCN)は、スタックに直接保持されます。ループは、HCNへの候補をテストし続けます。見つかったら、スタックに残され、クリップボードKが更新されます。必要な数のHCNが見つかると、ループは終了します。

~         % take input implicitly (gets stored in clipboard G). Transform into a 0 
          % by means of logical negation
XKx       % copy that 0 into clipboard K, and delete
`         % do...while
  K       %   push largest number of divisors found up to now
  @       %   push iteration index, i: current candidate to HCN
  @:      %   range [1,...,i]
  \       %   modulo operation
  ~s      %   number of zeros. This is the number of divisors of current candidate
  <       %   is it larger than previous largest number of divisors?
  ?       %   if so: a new HCN has been found
    @     %     push that number
    5M    %     push the number of divisors that was found
    XKx   %     update clipboard K, and delete
  ]       %   end if
  N       %   number of elements in stack
  G<      %   is it less than input? This the loop condition: exit when false
          % end do...while implicitly
          % display all numbers implicitly

3

Perl、60 57 + 1 = 58バイト

$,++;$==grep$,%$_<1,1..$,;$_--,$m=$=if$=>$m;$_?redo:say$,

が必要-nと無料-M5.010| -E

$ perl -nE'$,++;$==grep$,%$_<1,1..$,;$_--,$m=$=if$=>$m;$_?redo:say$,' <<< 10 
120

使い方:

$,++;
     $==grep$,%$_<1,1..$,;                                # Calculate total numbers of divisors for `$,`
                          $_--,$m=$=if$=>$m;              # Set `$m`ax divisors to `$=`ivisors if `$m>$=`
                                            $_?redo:say$, # Repeat or print

2

JavaScript(ES6)72

簡単な実装。入力20で20秒に近い時間

x=>{for(i=e=n=0;i<x;d>e&&(++i,e=d))for(d=1,j=++n;--j;)n%j||++d;return n}

evalトリックは、実行時間を2倍にするバイトを節約できます。

x=>eval("for(i=e=n=0;i<x;d>e&&(++i,e=d))for(d=1,j=++n;--j;)n%j||++d;n")

少ないゴルフ

x=>{
  for(i = e = 0, n = 1; i < x; n++)
  {
    for(d = 1, j = n; --j; )
    {
      if (n%j == 0) 
        ++d;
    }
    if (d > e)
      ++i,
      e = d;
  }
  return n;
}

2

Pyth、17 16バイト

ジャクベのおかげで1バイト

uf<Fml{yPd,GTGQ1

テストスイート

0から始まるnを取り、n番目の高度に合成された数を返します。

説明:

uf<Fml{yPd,GThGQ1
                     Input: Q = eval(input())
u              Q1    Apply the following function Q times, starting with 1.
                     Then output the result. lambda G.
 f           hG      Count up from G+1 until the following is truthy, lambda T.
          ,GT        Start with [G, T] (current highly comp., next number).
    m                Map over those two, lambda d.
        Pd           Take the prime factorization of d, with multiplicity.
       y             Take all subsets of those primes.
      {              Deduplicate. At this point, we have a list of lists of primes.
                     Each list is the prime factorization of a different factor.
     l               Take the length, the number of factors.
  <F                 Check whether the number of factors of the previous highly
                     composite number is smaller than that of the current number.


1

C、98バイト

f,i,n,j;main(m){for(scanf("%d",&n);n--;printf("%d ",i))for(m=f;f<=m;)for(j=++i,f=0;j;)i%j--||f++;}

ここで試してみてください

非ゴルフ

f,i,n,j;

main(m)
{
    for(scanf("%d",&n); /* Get input */
            n--; /* Loop while still HCN's to calculate... */
            printf("%d ",i)) /* Print out the last calculated HCN */
        for(m=f;f<=m;) /* Loop until an HCN is found... */
            for(j=++i,f=0;j;) /* Count the number of factors */
                i%j--||f++;
}

1

Python 3、97バイト

i=p=q=0;n=int(input())
while q<n:
 c=j=0;i+=1
 while j<i:j+=1;c+=i%j==0
 if c>p:p=c;q+=1
print(i)

STDINから入力を受け取り、出力をSTDOUTに出力する完全なプログラム。これは、n1番目にインデックス付けされた高度に複合的な数値を返します。

使い方

これは簡単な実装です。入力nは、高度に合成された数値インデックスです。

プログラムは整数を反復処理しますi。各整数ためj未満ii mod j取られます。これがあれば0jの要因でなければならないiとカウンタはcの約数の数を与えて、インクリメントされi、ループ後。pは、除数の以前の最大数であるため、の場合c > p、新しい高度に合成された数が見つかり、カウンターqが増分されます。一度はq = n、高度に合成された番号でiなければなりませんn。これが出力されます。

Ideoneでお試しください

(これには〜15秒かかりますがn = 20、これはIdeoneの制限時間を超えています。したがって、与えられた例はですn = 18。)


0

Python 2、207バイト

n,i,r,o=input(),1,[],[]
while len(o)<n:
 r+=[(lambda n:len(set(reduce(list.__add__,([i,n//i]for i in range(1,int(n**0.5)+1)if n%i==0)))))(i)];h=max(r)
 if r.index(h)>i-2 and r.count(h)<2:o+=[i]
 i+=1
print o

デニスのゼリーの回答と同じ方法を使用します。<2秒単位で最初の20項を計算します。

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