Kết hợp đúng cách


20

Một ước đúng là một ước số của một số n , mà không phải là n chính nó. Ví dụ, các ước số thích hợp của 12 là 1, 2, 3, 4 và 6.

Bạn sẽ được cấp một số nguyên x , x 2, x ≤ 1000 . Nhiệm vụ của bạn là tổng hợp tất cả các ước số cao nhất của các số nguyên từ 2 đến x (đã bao gồm) (OEIS A280050 ).

Ví dụ (với x = 6):

  • Tìm tất cả các số nguyên từ 2 đến 6 (đã bao gồm): 2,3,4,5,6.

  • Nhận các ước số thích hợp của tất cả chúng và chọn các giá trị cao nhất từ ​​mỗi số:

    • 2 -> 1
    • 3 -> 1
    • 4 -> 1, 2
    • 5 -> 1
    • 6 -> 1, 2, 3 .
  • Tính tổng các ước số cao nhất : 1 + 1 + 2 + 1 + 3 = 8.

  • Kết quả cuối cùng là 8.

Các trường hợp thử nghiệm

Đầu vào | Đầu ra
------- + ---------
       |
 2 | 1
 4 | 4
 6 | số 8
 8 | 13
 15 | 41
 37 | 229
 100 | 1690
 1000 | 165279

Quy tắc



5
Nếu bạn đang đi đến hộp cát gì đó, hãy để nó ở đó trong hơn hai giờ.
Peter Taylor

@PeterTaylor Tôi chỉ sandbox bài đăng để nhận phản hồi, bởi vì đây là một thử thách rất đơn giản mà tôi thường không đăng trong hộp cát. Cảm ơn BTW đã chỉnh sửa.
Ông Xcoder

Câu trả lời:



5

Husk , 7 byte

ṁȯΠtptḣ

Hãy thử trực tuyến!

Giải trình

Husk không tích hợp sẵn để tính toán các ước số trực tiếp (chưa), vì vậy tôi đang sử dụng thừa số nguyên tố thay thế. Số chia đúng lớn nhất của một số là tích của các thừa số nguyên tố của nó trừ số nhỏ nhất. Tôi ánh xạ hàm này qua phạm vi từ 2 đến đầu vào và tính tổng kết quả.

ṁȯΠ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 byte

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

Điều này chậm và thậm chí không thể đối phó với đầu vào 15 trên TIO.

Hãy thử trực tuyến!

Tuy nhiên, ghi nhớ ( cảm ơn @ musicman523 ) có thể được sử dụng để xác minh tất cả các trường hợp thử nghiệm.

Hãy thử trực tuyến!

Phiên bản thay thế, 52 byte

Với chi phí là 2 byte, chúng ta có thể chọn tính toán f(n,k+1)hay 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))

Với một số mánh khóe, điều này hoạt động cho tất cả các trường hợp thử nghiệm, ngay cả trên TIO.

Hãy thử trực tuyến!


flà một hàm thuần túy , bạn có thể ghi nhớ nó để chạy các trường hợp lớn hơn trên TIO
musicman523

Phải, không thể sử dụng một trang trí đã ném tôi đi. Cảm ơn!
Dennis



4

JavaScript (ES6), 40 byte

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>

Một số bằng với tích của ước số thích hợp cao nhất của nó và hệ số nguyên tố nhỏ nhất của nó.


chồng tràn cho n>352(ít nhất là trong đoạn trích này, không biết đó có phải là phụ thuộc trình duyệt / máy của tôi không) trong khi bạn phải hỗ trợ ít nhất là tối đa n=1000.
chính thức

@officialaimm Nó hoạt động n=1000nếu bạn sử dụng, ví dụ node --stack_size=8000.
Neil

4

05AB1E , 9 8 byte

-1 Byte nhờ thủ thuật nhân tố chính của Leaky Nun trong câu trả lời Pyth của anh ấy

L¦vyÒ¦PO

Hãy thử trực tuyến!

Giải trình

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

Giải pháp thay thế 8 Byte (Điều đó không hoạt động trên TIO)

L¦vyѨθO    

và giải pháp thay thế 9 Byte (Hoạt động trên TIO)

L¦vyѨ®èO    

4

Võng mạc , 31 24 byte

7 byte nhờ Martin Ender.

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Regex /^(1+)\1+$/nắm bắt ước số thích hợp lớn nhất của một số nhất định được biểu thị bằng unary. Trong mã, \1+được chuyển thành một cú pháp tra cứu.




4

Python 2 (PyPy) , 73 71 70 byte

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

Không phải là câu trả lời Python ngắn nhất, nhưng điều này chỉ lướt qua các trường hợp thử nghiệm. TIO xử lý các đầu vào lên tới 30.000.000 mà không bị đổ mồ hôi; máy tính để bàn của tôi xử lý 300.000.000 trong một phút.

Với chi phí là 2 byte , điều kiệnn>d có thể được sử dụng để tăng tốc ~ 10%.

Cảm ơn @xnor cho r=[0]*ný tưởng, đã lưu 3 byte!

Hãy thử trực tuyến!


Buồn cười, tôi chỉ viết về cơ bản cùng một mã .
xnor

l=[0]*nnên cho phép bạn thoát khỏi -2. execkinda giết tốc độ, nhưng ngay cả một whilevòng lặp sẽ ngắn hơn cách tiếp cận của tôi.
Dennis

Điều này dường như là nhanh hơn so với phương pháp của tôi. Nếu tôi chỉnh sửa câu trả lời đó?
Dennis

Xin vui lòng, đi cho nó.
xnor

1
@ Mr.Xcoder Không có trong PyPy, nhưng vâng, các sàng làm tốt cho loại vấn đề này.
Dennis

4

Haskell, 48 46 43 byte

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

Hãy thử trực tuyến!

Chỉnh sửa: @rogaos đã lưu hai byte. Cảm ơn!

Chỉnh sửa II: ... và @xnor thêm 3 byte.


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

@rogaos: Cảm ơn! Tôi đã thử đệ quy rõ ràng, nhưng không xóa sum, vì vậy tôi nghĩ nó không ngắn hơn.
nimi

1
untiltiết kiệm thêm một số:until((<1).mod n)pred(n-1)+f(n-1)
xnor

4

Japt , 8 + 2 = 10 8 6 byte

òâ1 xo

Kiểm tra nó

  • Lưu 1 byte nhờ vào ETHproductions.

Giải trình

    :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

Lưu ý rằng -xtính là hai byte theo bài viết này . Tuy nhiên, tôi nghĩ bạn có thể lưu một byte bằng ò2_â1 o( âkhông bao gồm số gốc khi được đưa ra một đối số)
ETHproductions

Cảm ơn, @ETHproductions; Tôi đã bỏ lỡ cả những điều đó. Tôi tự hỏi điều đó có áp dụng hồi tố cho tất cả các giải pháp mà chúng tôi đã tính các cờ là 1 byte không? Tôi đã tìm ra một giải pháp thay thế mà không sử dụng cờ nào; chỉ ra âlập luận của tôi đã cho tôi sự tiết kiệm mà tôi đang tìm kiếm.
Xù xì

Tôi sẽ cho là như vậy, vì chúng ta không thực sự tuân theo sự đồng thuận trước đây. BTW, tôi đã chơi với õ Åtrước và tìm thấy một vài 8 và 9-byters: õ Åx_/k g, õ Åx_k Å×, õ Åx_â¬o. Và bằng cách kết hợp õÅvới xothủ thuật thiên tài của bạn , tôi đã tìm ra giải pháp 7 byte :-)
ETHproductions

3

MATL, 12 byte

q:Q"@Z\l_)vs

Dùng thử tại MATL Online

Giải trình

        % 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

Khối , 27 39 byte

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

Hãy thử trực tuyến!

Tạo khối

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

Xem nó chạy

  • 0IUThiết lập ngăn xếp với bộ tích lũy và số nguyên bắt đầu. Quay đầu vào vòng ngoài
  • :(? nhân đôi đỉnh hiện tại của ngăn xếp, giảm dần và kiểm tra
  • \pO@ Nếu không vòng lặp xung quanh khối lập phương đến một gương, lấy đáy của ngăn xếp, đầu ra và tạm dừng
  • %\! nếu tích cực, mod, chọn lại và kiểm tra.
    • u;.W nếu trung thực, quay đầu, loại bỏ kết quả mod và chuyển làn trở lại vào vòng trong
    • U;p+qu;;\(nếu falsey, u-Turn, loại bỏ kết quả mod, đưa bộ tích lũy lên trên cùng, thêm phép chia số nguyên (trên cùng) hiện tại xuống dưới và lần lượt u. Dọn dẹp ngăn xếp để có bộ tích lũy và số nguyên hiện tại, giảm số nguyên và nhập lại vòng lặp bên ngoài.

3

C # (.NET Core) , 74 72 byte

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

Hãy thử trực tuyến!

  • 2 byte được cạo nhờ Kevin Cruijssen.

1
Tôi biết nó được khoảng một năm, nhưng bạn có thể chơi golf breakđể j=0.
Kevin Cruijssen

@KevinCruijssen một thủ thuật rất đơn giản nhưng hiệu quả. Ý kiến ​​hay!
Charlie


2

Con trăn 3 , 78 75 73 71 byte

Thậm chí không gần với câu trả lời python của Leaky nun về số byte.

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

Hãy thử trực tuyến!


1
Bạn đang tiến gần đến phiên bản đầu tiên của câu trả lời của tôi ... bạn có thể kiểm tra lịch sử chỉnh sửa của tôi.
Rò rỉ Nun

Oh, haha ​​... Tôi thề tôi đã không ăn cắp nó ... :)
chính thức tuyên bố

2

Trăn 3 , 69 63 59 byte

4 byte nhờ Dennis.

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

Hãy thử trực tuyến!

Tôi đặt giới hạn đệ quy thành 2000 để làm việc cho 1000.


+1 Bạn có điểm brownie của tôi! Đó là giải pháp mà tôi đã nói đến khi nói "ngắn hơn 70 byte" ...
Ông Xcoder

Ngoài ra, điều này cũng hoạt động trong Python 2
Ông Xcoder

2

Than , 37 byte

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

Hãy thử trực tuyến!

Liên kết là phiên bản dài dòng. Tôi đã mất gần như cả ngày để tìm hiểu làm thế nào tôi có thể giải quyết một câu hỏi không liên quan đến nghệ thuật ASCII trong Char than, nhưng cuối cùng tôi đã hiểu và tôi rất tự hào về tôi. : -D

Vâng, tôi chắc chắn rằng điều này có thể được chơi golf rất nhiều. Tôi vừa dịch câu trả lời C # của mình và tôi chắc chắn mọi thứ có thể được thực hiện khác nhau trong Than. Ít nhất nó cũng giải quyết 1000vụ việc trong vài giây ...



2

Python 2 (PyPy) , 145 byte

Bởi vì biến các cuộc thi golf-code thành các cuộc thi mã nhanh nhất rất thú vị, đây là thuật toán O ( n ) mà trên TIO, giải quyết n = 5.000.000.000 trong 30 giây. ( Sàng của Dennis là 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)

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Chúng tôi đếm kích thước của bộ

S = {( a , b ) | 2 ≤ mộtn , 2 ≤ b ≤ lớn nhất thích hợp-ước ( một )},

bằng cách viết lại nó như là sự kết hợp, trên tất cả các số nguyên tố p ≤ n, của

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

và sử dụng nguyên tắc loại trừ lồng ghép :

| S | = ∑ (1) m - 1 | S p 1S p m | trên m 1 và số nguyên tố p 1 <⋯ < p m ≤ n,

Ở đâu

S p 1 ∩ ⋯ S p m = {( p 1p me , b ) | 1 ≤ en / ( p 1p m ), 2 ≤ bp 1p m - 1 e },
| S p 1S p m | = ⌊ n / ( p 1p m ) ⌋⋅ ( p 1 p m - 1 ⋅ (⌊ n / ( p 1p m ) ⌋ + 1) - 2) / 2.

Tổng có Cn ngữ khác không, nơi C hội tụ đến một số liên tục có lẽ 6⋅ (1 - ln 2) / π 2 ≈ 0,186544. Kết quả cuối cùng là | S | + n - 1.


Ôi, nhanh quá ...
Ông Xcoder

2

NewStack , 5 byte

May mắn thay, thực sự có một tích hợp.

Nᵢ;qΣ

Sự phá vỡ:

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.

Trong tiếng Anh thực tế:

Hãy chạy một ví dụ cho đầu vào là 8.

Nᵢ: Lập danh sách các số tự nhiên từ 1 mặc dù 8: 1, 2, 3, 4, 5, 6, 7, 8

;: Tính toán các yếu tố lớn nhất: 1, 1, 1, 2, 1, 3, 1, 4

q. Xóa phần tử đầu tiên:1, 1, 2, 1, 3, 1, 4

ΣVà lấy tổng: 1+1+2+1+3+1+4=13


1+1+2+1+3+1+4 = = 13 không 8. Ngoài ra: câu trả lời tuyệt vời như vậy +1.
Kevin Cruijssen

@KevinCruijssen Rất tiếc, cảm ơn vì đã nắm bắt điều đó!
Graviton

2

Java 8, 78 74 72 byte

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

Cổng câu trả lời C # của @CarlosAlejo .

Hãy thử nó ở đây.

Câu trả lời cũ (78 byte):

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

Hãy thử nó ở đây.

Giải thích (của câu trả lời cũ):

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

Xếp chồng , 31 byte

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

Hãy thử trực tuyến!(Tất cả các mẫu thử ngoại trừ 1000, vượt quá giới hạn thời gian trực tuyến 60 giây.)

Giải trình

[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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.