적절한 제수 매시업


20

적절한 제수 A는 제수 숫자의 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
 1000 | 165279

규칙



5
샌드 박스를 만들려면 2 시간 이상 그대로 두십시오.
피터 테일러

@PeterTaylor 피드백을 받기 위해서만 게시물을 샌드 박스에 넣었습니다. 이것은 보통 샌드 박스에 전혀 게시하지 않는 매우 간단한 문제이기 때문입니다. 편집 해 주셔서 감사합니다.
Mr. Xcoder 2016 년

답변:



5

껍질 , 7 바이트

ṁȯΠtptḣ

온라인으로 사용해보십시오!

설명

Husk에는 제수를 직접 계산할 수있는 기본 제공 기능이 없으므로 대신 소인수 분해를 사용하고 있습니다. 숫자의 가장 큰 제수는 가장 작은 것을 제외한 주요 요소의 곱입니다. 이 함수를 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

파이썬 2 , 50 바이트

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

이것은 느리고 TIO의 입력 15 에 대처할 수 없습니다 .

온라인으로 사용해보십시오!

그러나 모든 테스트 사례를 확인하는 데 메모 ( @ 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에서도 모든 테스트 사례에 적용됩니다.

온라인으로 사용해보십시오!


이후 fA는 순수 기능 , 당신은에 더 큰 경우 실행을 memoize 수 TIO을
musicman523

맞아, 데코레이터를 사용할 수 없다는 것은 나를 버렸다. 감사!
Dennis



4

자바 스크립트 (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적어도 upto 지원 해야하는 동안 스택 오버플로 (적어도이 스 니펫에서는 내 브라우저 / 컴퓨터 종속성인지 알지 못합니다) n=1000.
officialaimm

@officialaimm n=1000예를 들어 사용하면 작동합니다 node --stack_size=8000.
Neil

4

05AB1E , 9 8 바이트

Pyth 답변에서 Leaky Nun 의 주요 요인 트릭 덕분에 -1 바이트

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 바이트 솔루션 (TIO에서 작동)

L¦vyѨ®èO    

4

망막 , 31 24 바이트

Martin Ender 덕분에 7 바이트.

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

온라인으로 사용해보십시오!

작동 원리

정규식 /^(1+)\1+$/은 단항으로 표시되는 특정 숫자의 가장 큰 제수를 캡처합니다. 코드에서는 \1+미리보기 구문으로 바뀝니다.




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 개의 입력을 처리합니다 . 내 데스크탑 컴퓨터는 1 분에 300,000,000 을 처리합니다 .

2 바이트 의 비용으로 n>d~ 10 % 속도 향상을 위해 조건 을 사용할 수 있습니다.

r=[0]*n3 바이트를 절약 한 아이디어에 대한 @xnor 덕분에 !

온라인으로 사용해보십시오!



l=[0]*n를 제거 할 수 있어야합니다 -2. exec좀 속도를 죽이지 만 while루프 조차 내 접근 방식보다 짧을 것입니다.
Dennis

이것은 내 접근 방식보다 약간 빠릅니다. 내 답변으로 편집해도 될까요?
Dennis

제발 가십시오
xnor

1
@ Mr.Xcoder PyPy에는 없지만 이러한 종류의 문제에는 체가 좋습니다.
Dennis

4

하스켈, 48 46 43 바이트

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

온라인으로 사용해보십시오!

편집 : @rogaos는 2 바이트를 저장했습니다. 감사!

편집 II : ... 및 @xnor 다른 3 바이트.


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

@rogaos: Thanks! I've tried the explicit recursion myself, but didn't remove sum, so I thought it isn't shorter.
nimi

1
until saves some more: until((<1).mod n)pred(n-1)+f(n-1)
xnor

4

Japt, 8+2=10 8 6 bytes

òâ1 xo

Test it

  • 1 byte saved thanks to ETHproductions.

Explanation

    :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 바이트로 계산 한 모든 솔루션에 소급 적용되는지 궁금합니다. 어쨌든 플래그를 사용하지 않은 대체 솔루션을 개발하고있었습니다. â의 주장을 지적하면 내가 찾고있는 저축을 얻었습니다.
얽히고 설킨

I would assume so, since we weren't really following a consensus before. BTW, I had been playing with õ Å before and found a couple 8- and 9-byters: õ Åx_/k g, õ Åx_k Å×, õ Åx_â¬o. And by combining õ and Å with your genius xo trick I found a 7-byte solution :-)
ETHproductions

3

MATL, 12 bytes

q:Q"@Z\l_)vs

Try it at MATL Online

Explanation

        % 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 bytes

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

Try it online!

Cubified

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

Watch It Run

  • 0IU Set up the stack with an accumulator, and the starting integer. U-turn into the outer loop
  • :(? duplicate the current top of stack, decrement and test
  • \pO@ if zero loop around the cube to a mirror, grab the bottom of stack, output and halt
  • %\! if positive, mod, relect and test.
    • u;.W if truthy, u-turn, remove mod result and lane change back into inner loop
    • U;p+qu;;\( if falsey, u-turn, remove mod result, bring accumulator to top, add current integer (top) divisor push to bottom and u-turn. Clean up the stack to have just accumulator and current integer, decrement the integer and enter the outer loop again.

3

C# (.NET Core), 74 72 bytes

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

Try it online!

  • 2 bytes shaved thanks to Kevin Cruijssen.

1
I know it's been about a year, but you can golf break to j=0.
Kevin Cruijssen

@KevinCruijssen a very simple but effective trick. Nice idea!
Charlie


2

Python 3, 78 75 73 71 bytes

Not even close to Leaky nun's python answer in byte count.

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

Try it online!


1
You're getting close to the first revision of my answer... you can check my editing history.
Leaky Nun

Oh, haha... I swear I did not steal it... :)
officialaimm

2

Python 3, 69 63 59 bytes

4 bytes thanks to Dennis.

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

Try it online!

I set the recursion limit to 2000 for this to work for 1000.


+1 You have my brownie points! That's the solution I was talking about when saying "shorter than 70 bytes"...
Mr. Xcoder

Also, this works in Python 2 as well
Mr. Xcoder

2

Charcoal, 37 bytes

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

Try it online!

Link is to the verbose version. It took me almost all day to figure out how could I solve a non-ASCII-art-related question in Charcoal, but finally I got it and I am very proud of me. :-D

Yes, I am sure this can be golfed a lot. I just translated my C# answer and I am sure things can be done differently in Charcoal. At least it solves the 1000 case in a couple of seconds...



2

Python 2 (PyPy), 145 bytes

Because turning code-golf competitions into fastest-code competitions is fun, here is an O(n) algorithm that, on TIO, solves n = 5,000,000,000 in 30 seconds. (Dennis’s sieve is 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)

Try it online!

How it works

We count the size of the set

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.