ตัวเลขคอมโพสิตสูง


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 -th หรือตัวเลขคอมโพสิตสูงnอันดับแรกตามที่คุณเลือก (แต่ตัวเลือกต้องเหมือนกันสำหรับทุกอินพุตn )

กฎระเบียบ

โปรแกรมหรือฟังก์ชั่นในทางทฤษฎีควรทำงานกับอินพุตที่มีขนาดใหญ่ตามอำเภอใจโดยไม่ จำกัด เวลาและหน่วยความจำโดยไม่พิจารณาข้อ จำกัด ชนิดข้อมูล โดยพื้นฐานแล้วนี่หมายความว่าไม่มีการเข้ารหัสฮาร์ดค่าจำนวน จำกัด

ในทางปฏิบัติโปรแกรมหรือฟังก์ชั่นควรทำงานในระยะเวลาที่เหมาะสมพูดน้อยกว่า 1 นาทีสำหรับnสูงสุด 20 การป้อนเข้าหรือส่งออกสูงสุดอาจถูก จำกัด โดยประเภทข้อมูลมาตรฐานภาษาของคุณ (แต่อีกครั้งอัลกอริทึมควรทำงาน สำหรับจำนวนมากโดยพล)

อนุญาตรูปแบบอินพุตและเอาต์พุตที่เหมาะสมรวมถึง unary

รหัสกอล์ฟ ไบต์ที่น้อยที่สุดจะเป็นผู้ชนะ


การสนทนานี้ได้รับการย้ายไปแชท
Dennis

สามารถn TH-ดัชนีจะเป็นศูนย์การจัดทำดัชนีหรือต้องได้รับนี้ 1 การจัดทำดัชนี?
Adnan

@ แอนฉันไม่ได้คิดอย่างนั้นดังนั้นสมมติว่าทั้งสองได้รับการยอมรับ (ฉันดูเหมือนจะจำเมตาโพสต์ที่เสนอทั้งแบบ 1 และ 0 ได้รับอนุญาต แต่ฉันหามันไม่เจอใคร?)
Luis Mendo

คำตอบ:


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 ไบต์ (ไม่แข่งขัน)

ในขณะที่โค้ดด้านล่างทำงานในเยลลี่เวอร์ชันล่าสุดที่อยู่เหนือความท้าทายนี้การใช้งาน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 bytes) แต่ใช้เวลา 44 นาทีในเครื่องของฉัน ...
Dennis

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 สามารถประหยัด byte สองเท่าของเวลาทำงาน

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

น้อย golfed

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 ไบต์ขอบคุณ 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

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++;}

ลองมันนี่

Ungolfed

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 ส่งคืนnหมายเลขคอมโพสิตสูงที่จัดทำดัชนีไว้ที่ 1

มันทำงานอย่างไร

นี่คือการดำเนินการที่ตรงไปตรงมา อินพุตnเป็นดัชนีหมายเลขรวมสูง

iterates 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

ใช้วิธีเดียวกันกับคำตอบของ Dennis 'Jelly คำนวณ 20 เทอมแรกในไม่<2กี่วินาที

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.