ตัวแบ่งที่เหมาะสมผสม


20

หารที่เหมาะสมเป็นตัวหารของจำนวนnซึ่งไม่ได้เป็นnตัวเอง ตัวอย่างเช่นตัวหารที่เหมาะสมของ 12 คือ 1, 2, 3, 4 และ 6

คุณจะได้รับจำนวนเต็ม x , x ≥ 2 x ≤ 1000 งานของคุณคือการรวมตัวหารที่เหมาะสมที่สุดทั้งหมดของจำนวนเต็มจาก2ถึงx (รวม) (OEIS A280050 )

ตัวอย่าง (พร้อมx = 6):

  • ค้นหาจำนวนเต็มทั้งหมดระหว่าง 2 ถึง 6 (รวม): 2,3,4,5,6

  • รับตัวหารที่เหมาะสมของพวกเขาทั้งหมดและเลือกตัวที่สูงที่สุดจากแต่ละหมายเลข:

    • 2 -> 1
    • 3 -> 1
    • 4 -> 1, 2
    • 5 -> 1
    • 6 -> 1, 2, 3
  • รวมตัวหารที่เหมาะสมที่สุด: 1 + 1 + 2 + 1 + 3 = 8.

  • ผลลัพธ์สุดท้ายคือ 8

กรณีทดสอบ

อินพุต | เอาท์พุต
------- + ---------
       |
 2 | 1
 4 | 4
 6 | 8
 8 | 13
 15 | 41
 37 | 229
 100 | 1690
 1,000 | 165279

กฎระเบียบ



5
หากคุณกำลังจะไปที่กล่องทรายให้ปล่อยไว้ที่นั่นนานกว่าสองชั่วโมง
ปีเตอร์เทย์เลอร์

@PeterTaylor ฉัน sandbox โพสต์เท่านั้นที่จะได้รับข้อเสนอแนะเพราะนี่เป็นความท้าทายที่ง่ายมากที่ฉันมักจะไม่โพสต์ใน sandbox เลย BTW ขอบคุณสำหรับการแก้ไข
นาย Xcoder

คำตอบ:



5

Husk , 7 ไบต์

ṁȯΠtptḣ

ลองออนไลน์!

คำอธิบาย

Husk ไม่มี built-in สำหรับคำนวณ divisors โดยตรง (ยัง) ดังนั้นฉันจึงใช้การแยกตัวประกอบเฉพาะ ตัวหารที่เหมาะสมที่สุดของจำนวนนั้นคือผลผลิตของปัจจัยหลักยกเว้นตัวที่เล็กที่สุด ฉันแมปฟังก์ชั่นนี้ในช่วงตั้งแต่ 2 ถึงอินพุตและรวมผลลัพธ์

ṁȯΠtptḣ  Define a function:
      ḣ  Range from 1 to input.
     t   Remove the first element (range from 2).
ṁ        Map over the list and take sum:
 ȯ        The composition of
    p     prime factorization,
   t      tail (remove smallest prime) and
  Π       product.

5

Python 2 , 50 ไบต์

f=lambda n,k=2:n/k and(f(n,k+1),n/k+f(n-1))[n%k<1]

นี่คือช้าและไม่สามารถแม้แต่จะรับมือกับการป้อนข้อมูล15ใน TIO

ลองออนไลน์!

อย่างไรก็ตามการบันทึกช่วยจำ ( ขอบคุณ @ musicman523 ) สามารถใช้ในการตรวจสอบกรณีทดสอบทั้งหมด

ลองออนไลน์!

รุ่นสำรอง 52 ไบต์

ค่าใช้จ่ายของ 2 ไบต์ที่เราสามารถเลือกได้ว่าจะคำนวณหรือf(n,k+1)n/k+f(n-1)

f=lambda n,k=2:n>1and(n%k and f(n,k+1)or n/k+f(n-1))

ด้วยเล่ห์เหลี่ยมบางอย่างมันใช้ได้กับทุกกรณีทดสอบแม้แต่ใน TIO

ลองออนไลน์!


เนื่องจากfเป็นฟังก์ชั่นที่บริสุทธิ์คุณสามารถบันทึกเพื่อเรียกใช้เคสขนาดใหญ่ในTIO ได้
musicman523

ใช่ฉันไม่สามารถใช้มัณฑนากรโยนฉันออกไปได้ ขอบคุณ!
Dennis



4

JavaScript (ES6), 40 ไบต์

f=(n,i=2)=>n<2?0:n%i?f(n,i+1):n/i+f(n-1)
<input type=number oninput=o.textContent=f(this.value)><pre id=o>

จำนวนเท่ากับผลคูณของตัวหารที่เหมาะสมที่สุดและตัวประกอบตัวเล็กที่สุด


สแต็คล้นสำหรับn>352(อย่างน้อยในตัวอย่างนี้ไม่ทราบว่ามันเป็นเบราว์เซอร์ของฉัน / เครื่องพึ่งพา) n=1000ในขณะที่คุณควรจะสนับสนุนที่เกินน้อย
อย่างเป็นทางการ

@officialaimm ทำงานสำหรับถ้าคุณใช้เช่นn=1000 node --stack_size=8000
Neil

4

05AB1E , 9 8 ไบต์

-1 ไบต์ต้องขอบคุณเคล็ดลับสำคัญของLeaky Nunในคำตอบ Pyth ของเขา

L¦vyÒ¦PO

ลองออนไลน์!

คำอธิบาย

L¦vyÒ¦PO
L¦       # Range [2 .. input]
  vy     # For each...
    Ò¦    # All prime factors except the first one
      P   # Product
       O  # Sum with previous results
         # Implicit print

ทางเลือก 8 โซลูชันไบต์ (ไม่ทำงานบน TIO)

L¦vyѨθO    

และ ofc ทางเลือก 9 Byte solution (ใช้งานได้กับ TIO)

L¦vyѨ®èO    

4

เรติน่า , 31 24 ไบต์

7 ไบต์ขอบคุณ Martin Ender

.+
$*
M!&`(1+)(?=\1+$)
1

ลองออนไลน์!

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

regex /^(1+)\1+$/จับตัวหารที่เหมาะสมที่สุดของจำนวนที่แน่นอนที่แสดงใน unary ในรหัสนั้น\1+จะกลายเป็นไวยากรณ์ lookahead




4

Python 2 (PyPy) , 73 71 70 ไบต์

n=input();r=[0]*n;d=1
while n:n-=1;r[d+d::d]=n/d*[d];d+=1
print sum(r)

ไม่ใช่คำตอบของ Python ที่สั้นที่สุด แต่นี่เป็นเพียงการพูดคุยผ่านกรณีทดสอบ TIO จัดการอินพุตได้สูงสุด30,000,000โดยไม่ทำให้เหงื่อออก คอมพิวเตอร์เดสก์ท็อปของฉันรองรับได้300,000,000 ครั้งต่อนาที

ที่ราคา2 ไบต์เงื่อนไขn>dสามารถใช้เพื่อเร่งความเร็วได้ ~ 10%

ขอบคุณ @xnor สำหรับr=[0]*nความคิดที่บันทึกไว้ 3 ไบต์!

ลองออนไลน์!


ตลกผมเพิ่งเขียนโดยทั่วไปรหัสเดียวกัน
xnor

l=[0]*n-2จะช่วยให้คุณได้รับการกำจัด execค่อนข้างฆ่าความเร็ว แต่แม้กระทั่งwhileลูปจะสั้นกว่าวิธีของฉัน
เดนนิส

นี้ดูเหมือนว่าจะเล็กน้อยเร็วกว่าวิธีการของฉัน รังเกียจไหมถ้าฉันแก้ไขมันเป็นคำตอบ?
เดนนิส

กรุณาไปด้วย
xnor

1
@ Mr.Xcoder ไม่ได้อยู่ใน PyPy แต่ใช่ sieves ทำได้ดีสำหรับปัญหาแบบนี้
เดนนิส

4

Haskell, 48 46 43 ไบต์

f 2=1
f n=until((<1).mod n)pred(n-1)+f(n-1)

ลองออนไลน์!

แก้ไข: @rogaos บันทึกสองไบต์ ขอบคุณ!

แก้ไข II: ... และ @xnor อีก 3 ไบต์


-2 ไบต์:f 2=1 f n=last[d|d<-[1..n-1],mod n d<1]+f(n-1)
vroomfondel

@rogaos: ขอบคุณ! ฉันลองเรียกใช้ซ้ำอีกครั้งอย่างชัดเจน แต่ไม่ได้ลบsumดังนั้นฉันคิดว่ามันไม่สั้น
nimi

1
untilประหยัดอีก:until((<1).mod n)pred(n-1)+f(n-1)
xnor

4

Japt , 8 + 2 = 10 8 6 ไบต์

òâ1 xo

ทดสอบมัน

  • บันทึก 1 ไบต์ด้วย ETHproductions

คำอธิบาย

    :Implicit input of integer U.
ò   :Generate an array of integers from 1 to U, inclusive
â   :Get the divisors of each number,
1   :  excluding itself.
x   :Sum the main array
o   :by popping the last element from each sub-array.
    :Implicit output of result

โปรดทราบว่า-xนับเป็นสองไบต์ตามโพสต์นี้ อย่างไรก็ตามฉันคิดว่าคุณสามารถบันทึกไบต์ด้วยò2_â1 o( âไม่รวมหมายเลขเดิมเมื่อได้รับการโต้แย้ง)
ETHproductions

ขอบคุณ @ETHproductions; ฉันคิดถึงสิ่งเหล่านั้นทั้งคู่ ฉันสงสัยว่าจะใช้ย้อนหลังกับโซลูชั่นทั้งหมดที่เรานับธงเป็น 1 ไบต์หรือไม่ ฉันกำลังหาวิธีแก้ปัญหาทางเลือกที่ไม่ได้ใช้แฟล็กอยู่ดี การชี้ให้เห็นถึงâข้อโต้แย้งทำให้ฉันได้รับความประหยัดที่ฉันกำลังมองหา
Shaggy

ฉันจะถือว่าเป็นเช่นนั้นเนื่องจากเราไม่ได้ติดตามฉันทามติก่อนหน้านี้จริงๆ BTW ผมเคยเล่นกับõ Åก่อนและพบว่าเป็นคู่ที่ 8 และ 9 byters: õ Åx_/k g, ,õ Åx_k Å× õ Åx_â¬oและโดยรวมõและÅมีความเป็นอัจฉริยะของคุณxoเคล็ดลับผมพบว่าวิธีการแก้ปัญหา 7 ไบต์ :-)
ETHproductions

3

MATL ขนาด 12 ไบต์

q:Q"@Z\l_)vs

ลองที่ MATL Online

คำอธิบาย

        % Implicitly grab input (N)
q       % Subtract one
:       % Create an array [1...(N-1)]
Q       % Add one to create [2...N]
"       % For each element
  @Z\   % Compute the divisors of this element (including itself)
  l_)   % Grab the next to last element (the largest that isn't itself)
  v     % Vertically concatenate the entire stack so far
  s     % Sum the result



3

Cubix , 27 39ไบต์

?%\(W!:.U0IU(;u;p+qu.@Op\;;

ลองออนไลน์!

Cubified

      ? % \
      ( W !
      : . U
0 I U ( ; u ; p + q u .
@ O p \ ; ; . . . . . .
. . . . . . . . . . . .
      . . .
      . . .
      . . .

ดูมันวิ่ง

  • 0IUตั้งค่าสแต็คด้วยแอคคูมูเลเตอร์และจำนวนเต็มเริ่มต้น กลับกลายเป็นวงด้านนอก
  • :(? ทำซ้ำด้านบนปัจจุบันของสแต็กการลดและการทดสอบ
  • \pO@ ถ้าศูนย์วนรอบคิวบ์ไปที่มิเรอร์ให้คว้าด้านล่างของสแต็กเอาท์พุทและหยุด
  • %\! ถ้าบวก, mod, relect และทดสอบ
    • u;.W ถ้าเป็นจริง u-turn ให้ลบผลลัพธ์ mod และเปลี่ยนเลนกลับไปเป็นวงใน
    • U;p+qu;;\(ถ้า falsey, u-turn, ลบผลลัพธ์ mod, นำมาสะสมไว้ด้านบน, เพิ่มจำนวนเต็ม (top) ตัวหารปัจจุบันกดไปที่ด้านล่างและกลับ ทำความสะอาดสแต็กเพื่อให้มีเพียงตัวสะสมและจำนวนเต็มปัจจุบันลดจำนวนเต็มและป้อนลูปด้านนอกอีกครั้ง

3

C # (.NET แกน) , 74 72 ไบต์

n=>{int r=0,j;for(;n>1;n--)for(j=n;--j>0;)if(n%j<1){r+=j;j=0;}return r;}

ลองออนไลน์!

  • 2 ไบต์โกนด้วย Kevin Cruijssen

1
ฉันรู้ว่ามันได้รับประมาณปี แต่คุณสามารถกอล์ฟไปbreak j=0
Kevin Cruijssen

@KevinCruijssen เป็นเคล็ดลับที่เรียบง่าย แต่มีประสิทธิภาพ ความคิดดี!
Charlie


2

Python 3 , 78 75 73 71 ไบต์

ไม่ได้ใกล้เคียงกับคำตอบหลามของ Leaky nun ในจำนวนไบต์

f=lambda z:sum(max(i for i in range(1,y)if 1>y%i)for y in range(2,z+1))

ลองออนไลน์!


1
คุณใกล้จะถึงคำตอบที่แก้ไขครั้งแรกของฉันแล้ว ... คุณสามารถตรวจสอบประวัติการแก้ไขของฉันได้
Leun Nun

โอ้ฮ่าฮ่า ... ฉันสาบานว่าฉันไม่ได้ขโมย ... :)
เจ้าหน้าที่อย่างเป็นทางการ

2

Python 3 , 69 63 59 ไบต์

4 ไบต์ขอบคุณเดนนิส

f=lambda n:n-1and max(j for j in range(1,n)if n%j<1)+f(n-1)

ลองออนไลน์!

ฉันตั้งค่าขีด จำกัด การเรียกซ้ำเป็น 2000 เพื่อให้ทำงานได้ 1,000


+1 คุณมีคะแนนบราวนี่ของฉัน! นั่นเป็นคำตอบที่ฉันพูดถึงเมื่อพูดว่า "น้อยกว่า 70 ไบต์" ...
Mr. Xcoder

นอกจากนี้ยังใช้งานได้ใน Python 2 เช่นกัน
Mr. Xcoder

2

ถ่าน , 37 ไบต์

A⁰βF…·²N«A⟦⟧δF⮌…¹ι«¿¬﹪ικ⊞δκ»A⁺β⌈δβ»Iβ

ลองออนไลน์!

ลิงก์คือเวอร์ชัน verbose ฉันใช้เวลาเกือบทั้งวันในการหาว่าฉันจะแก้คำถามที่ไม่ใช่ ASCII เกี่ยวกับศิลปะใน Charcoal ได้อย่างไร แต่ในที่สุดฉันก็ได้รับมาและฉันก็ภูมิใจในตัวฉันมาก :-D

ใช่ฉันแน่ใจว่านี่สามารถเล่นกอล์ฟได้มาก ฉันเพิ่งแปลคำตอบ C # ของฉันและฉันมั่นใจว่าสิ่งต่าง ๆ สามารถทำได้แตกต่างกันใน Charcoal อย่างน้อยก็แก้1000กรณีในไม่กี่วินาที ...



2

Python 2 (PyPy) , 145 ไบต์

เนื่องจากการเปลี่ยนการแข่งขันรหัส - กอล์ฟเป็นการแข่งขันรหัสที่เร็วที่สุดคือความสนุกนี่คืออัลกอริทึมO ( n ) ที่บน TIO แก้n = 5,000,000,000ใน 30 วินาที ( ตะแกรงของเดนนิสคือ O ( n log n ))

import sympy
n=input()
def g(i,p,k,s):
 while p*max(p,k)<=n:l=k*p;i+=1;p=sympy.sieve[i];s-=g(i,p,l,n/l*(n/l*k+k-2)/2)
 return s
print~g(1,2,1,-n)

ลองออนไลน์!

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

เรานับขนาดของชุด

S = {(a, b) | 2 ≤ an, 2 ≤ b ≤ largest-proper-divisor(a)},

by rewriting it as the union, over all primes p ≤ √n, of

Sp = {(pd, b) | 2 ≤ dn/p, 2 ≤ bd},

and using the inclusion–exclusion principle:

|S| = ∑ (−1)m − 1 |Sp1 ∩ ⋯ ∩ Spm| over m ≥ 1 and primes p1 < ⋯ < pm ≤ √n,

where

Sp1 ∩ ⋯ ∩ Spm = {(p1pme, b) | 1 ≤ en/(p1pm), 2 ≤ bp1pm − 1e},
|Sp1 ∩ ⋯ ∩ Spm| = ⌊n/(p1pm)⌋⋅(p1pm − 1⋅(⌊n/(p1pm)⌋ + 1) − 2)/2.

The sum has Cn nonzero terms, where C converges to some constant that’s probably 6⋅(1 − ln 2)/π2 ≈ 0.186544. The final result is then |S| + n − 1.


Oooh, that's fast...
Mr. Xcoder

2

NewStack, 5 bytes

Luckily, there's actually a built in.

Nᵢ;qΣ

The breakdown:

Nᵢ       Add the first (user's input) natural numbers to the stack.
  ;      Perform the highest factor operator on whole stack.
   q     Pop bottom of stack.
    Σ    Sum stack.

In actual English:

Let's run an example for an input of 8.

Nᵢ: Make list of natural numbers from 1 though 8: 1, 2, 3, 4, 5, 6, 7, 8

;: Compute the greatest factors: 1, 1, 1, 2, 1, 3, 1, 4

q. Remove the first element: 1, 1, 2, 1, 3, 1, 4

Σ And take the sum: 1+1+2+1+3+1+4 = 13


1+1+2+1+3+1+4 = 13 not 8. Apart from that: great answer so +1.
Kevin Cruijssen

@KevinCruijssen Whoops, thanks for catching that!
Graviton

2

Java 8, 78 74 72 bytes

n->{int r=0,j;for(;n>1;n--)for(j=n;j-->1;)if(n%j<1){r+=j;j=0;}return r;}

Port of @CarlosAlejo's C# answer.

Try it here.

Old answer (78 bytes):

n->{int r=0,i=1,j,k;for(;++i<=n;r+=k)for(j=1,k=1;++j<i;k=i%j<1?j:k);return r;}

Try it here.

Explanation (of old answer):

n->{                    // Method with integer parameter and integer return-type
  int r=0,              //  Result-integers
      i=1,j,k;          //  Some temp integers
  for(;++i<=n;          //  Loop (1) from 2 to `n` (inclusive)
      r+=k)             //    And add `k` to the result after every iteration
    for(j=1,k=1;++j<i;  //   Inner loop (2) from `2` to `i` (exclusive)
      k=i%j<1?j:k       //    If `i` is dividable by `j`, replace `k` with `j`
    );                  //   End of inner loop (2)
                        //  End of loop (2) (implicit / single-line body)
  return r;             //  Return result-integer
}                       // End of method



1

Stacked, 31 bytes

[2\|>[divisors:pop\MAX]map sum]

Try it online! (All testcases except for 1000, which exceeds the 60 second online time limit.)

Explanation

[2\|>[divisors:pop\MAX]map sum]
 2\|>                               range from 2 to the input inclusive
     [                ]map          map this function over the range
      divisors                      get the divisors of the number (including the number)
              :pop\                 pop a number off the array and swap it with the array
                   MAX              gets the maximum value from the array
                           sum      sum's all the max's

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