Сильно складені числа


23

Високо складене число є позитивним цілим числом , яке має більше подільників , ніж будь-який менше позитивне ціле число має. Це послідовність OEIS A002182 . Перші 20 термінів такі

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

Наприклад, 4є в послідовності, оскільки вона має 3 дільника (а саме 1, 2, 4), тоді як у 3 є лише 2 дільники, у 2 також є 2 дільники, у 1 - у 1 дільник.

Виклик

З урахуванням позитивного цілого вводу n , виведіть або n -ве високоскладене число, або перше n високоскладених чисел, на ваш вибір (але вибір повинен бути однаковим для кожного вводу n ).

Правила

Програма або функція теоретично повинна працювати для довільно великих входів з урахуванням нескінченного часу та пам'яті, без урахування обмежень типу даних. По суті, це означає відсутність жорсткого кодування кінцевої кількості значень.

На практиці програма або функція повинна працювати протягом розумного часу, скажімо, менше 1 хвилини, протягом n до 20. Максимальний вхід або вихід може бути обмежений типовим типом даних вашої мови (але знову ж таки, алгоритм повинен теоретично працювати для довільно великої кількості).

Дозволений будь-який обґрунтований формат введення та виводу, включаючи одинаковий

Код гольфу. Виграє найменше байт.



Чи може n- й індекс бути нульовим індексом або повинен бути 1-індексованим?
Аднан

@AandN Я про це не думав, тому скажемо, що обидва прийняті. (Здається, я пригадую мета-повідомлення, в якому пропонуються як на основі 1, так і на основі 0, але я не можу його знайти. Хто-небудь?)
Луїс Мендо

Відповіді:


4

05AB1E , 15 14 байт

Вхід з нульовим показником. Це означає, що n = 0дає 1, n = 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 потрібно менше двох секунд, щоб спробувати його в Інтернеті!

Як це працює

,®Æ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

MATL , 26 24 байти

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

Спробуйте в Інтернеті!

Поточна найбільша кількість знайдених дільників зберігається у буфері обміну. ​​Високоскладові номери (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 міг би врятувати байт, подвоюючи час виконання

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

Піта, 17 16 байт

1 байт завдяки Jakube

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

Рубі, 70 69 67 66 64 62

->n{r=k=0
0until(r<t=(1..k+=1).count{|d|k%d<1})&&1>n-=t/r=t
k}

Безпосередня реалізація.


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менше, ніж i, i mod jбереться; якщо це так 0, jповинен бути коефіцієнтом 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

Використовується той самий метод, що і відповідь Женіса Денніса. Обчислює перші 20 доданків за <2секунди.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.