도전
양의 정수가 주어지면 자신을 포함한 제수의 곱을 반환하십시오.
이것은 OEIS의 시퀀스 A007955입니다 .
테스트 사례
1 : 1 2 : 2 3 : 3 4 : 8 5 : 5 6:36 7 : 7 8:64 9:27 10 : 100 12 : 1728 14 : 196 24 : 331776 25 : 125 28 : 21952 30 : 810000
채점
이것은 code-golf 이므로 각 언어에서 가장 짧은 답변이 이깁니다!
양의 정수가 주어지면 자신을 포함한 제수의 곱을 반환하십시오.
이것은 OEIS의 시퀀스 A007955입니다 .
1 : 1 2 : 2 3 : 3 4 : 8 5 : 5 6:36 7 : 7 8:64 9:27 10 : 100 12 : 1728 14 : 196 24 : 331776 25 : 125 28 : 21952 30 : 810000
이것은 code-golf 이므로 각 언어에서 가장 짧은 답변이 이깁니다!
답변:
â ×
â × // implicit integer input
â // get integer divisors
× // get product of array
â
와 제가이 ×
답변을 쓸 때
(1,k)[i%k<1]
에 해당합니다k**(i%k<1)
/o
\i@/Bdt&*
이것은 10 진 I / O의 일반적인 프레임 워크입니다.
/o
\i@/...
그런 다음 프로그램은 다음과 같습니다
B Get all divisors of the input.
dt Get the stack depth minus 1.
&* Multiply the top two stack elements that many times, folding multiplication
over the stack.
31 C9 8D 71 01 89 F8 FF C1 99 F7 F9 85 D2 75 03 0F AF F1 39 F9 7C EE 89 F0 C3
위의 코드는 EDI
( Gnu / Unix에서 사용되는 System V AMD64 호출 규칙에 따라 ) 단일 매개 변수 (입력 값, 양의 정수)를 취하고 에서 단일 결과 (제수의 곱)를 반환하는 함수를 정의합니다 EAX
.
내부적으로 이것은 pizzapants184의 C 제출 과 비슷한 (매우 비효율적 인) 반복 알고리즘을 사용하여 제수의 곱을 계산합니다 . 기본적으로 카운터를 사용하여 1과 입력 값 사이의 모든 값 을 반복 하여 현재 카운터 값이 입력의 제수인지 확인합니다. 그렇다면,이를 누적 총 제품에 곱합니다.
Ungolfed 어셈블리 언어 니모닉 :
; Parameter is passed in EDI (a positive integer)
ComputeProductOfDivisors:
xor ecx, ecx ; ECX <= 0 (our counter)
lea esi, [rcx + 1] ; ESI <= 1 (our running total)
.CheckCounter:
mov eax, edi ; put input value (parameter) in EAX
inc ecx ; increment counter
cdq ; sign-extend EAX to EDX:EAX
idiv ecx ; divide EDX:EAX by ECX
test edx, edx ; check the remainder to see if divided evenly
jnz .SkipThisOne ; if remainder!=0, skip the next instruction
imul esi, ecx ; if remainder==0, multiply running total by counter
.SkipThisOne:
cmp ecx, edi ; are we done yet? compare counter to input value
jl .CheckCounter ; if counter hasn't yet reached input value, keep looping
mov eax, esi ; put our running total in EAX so it gets returned
ret
IDIV
명령이 배당 경련에 대해 하드 코딩 된 피연산자를 사용 한다는 사실 은 약간의 스타일이지만 기본적으로 산술 및 조건 분기가없는 언어에는 이것이 좋습니다.
Prompt X
1
For(A,1,X
If not(remainder(X,A
AAns
End
전체 프로그램 : 사용자에게 입력을 요구합니다. (기본적으로) 계산 된 최신 값을 저장 Ans
하는 특수 변수 인 출력을로 반환합니다 .
설명:
Prompt X # 3 bytes, Prompt user for input, store in X
1 # 2 bytes, store 1 in Ans for use later
For(A,1,X # 7 bytes, for each value of A from 1 to X
If not(remainder(X,A # 8 bytes, If X is divisible by A...
AAns # 3 bytes, ...store (A * Ans) in Ans
End # 1 byte, end For( loop
p,a;f(x){for(p=1,a=x;a;a--)p*=x%a?1:a;return p;}
Cody Grey 덕분에 -4 바이트
정수를 받아서 그 제수의 곱을 반환하는 함수입니다.
언 골프 드 :
int proddiv(int input) {
int total = 1, loopvar;
for(loopvar = input; loopvar > 0; --loopvar) {
// for loopvar from input down to 1...
total *= (input % loopvar) ? 1 : loopvar;
// ...If the loopvar is a divisor of the input, multiply the total by loopvar;
}
return total;
}
p*=
식 주위의 괄호를 제거 하고 (3) for
루프 본문에 문장을 넣어 쉼표를 삭제하여 4 바이트를 절약 할 수 있습니다 . 또한 매개 변수를 추가하는 대신 전역 변수를 사용하고 싶습니다. 이것은 바이트 비용을 들이지 않고 정의되지 않은 동작을 피합니다. 최종 버전 :p,a;f(x){for(p=1,a=x;a;--a)p*=x%a?1:a;return p;}
return p;
하여 p=p;
저장할 수 있습니다 .
p,a;f(x)
와 함께 f(x,p,a)
.
return p;
하고 5 바이트가 아닌 9 바이트를 저장할 수도 있습니다. ( TIO )
n=>g=(i=n)=>i?i**!(n%i)*g(i-1):1
음악가의 Python 솔루션 에 대한 Leaky의 팁을 빌려 몇 바이트를 절약했습니다 .
o.innerText=(f=
n=>g=(i=n)=>i?i**!(n%i)*g(i-1):1
)(i.value=1)();oninput=_=>o.innerText=f(+i.value)()
<input id=i type=number><pre id=o>
n=>g=(i=n)=>i?(n%i?1:i)*g(i-1):1
(n%i?1:i)
않습니까? (그러나 이것은 바이트를 저장하지 않습니다.)
lirtosiast 덕분에 1 바이트 절약
:√(Ans^sum(not(fPart(Ans/randIntNoRep(1,Ans
int(
합니까?
.
Ajax,.
Puck,.
Page,.
Act I:.
Scene I:.
[Enter Ajax and Puck]
Ajax:
You cat
Puck:
Listen to thy heart
[Exit Ajax]
[Enter Page]
Scene II:.
Puck:
You sum you cat
Page:
Is Ajax nicer I?If so, is remainder of the quotient Ajax I nicer zero?If not, you product you I.Is Ajax nicer I?If so, let us return to scene II
Scene III:.
Page:
Open thy heart
[Exeunt]
언 골프 버전 :
The Tragedy of the Product of a Moor's Factors in Venice.
Othello, a numerical man.
Desdemona, a product of his imagination.
Brabantio, a senator, possibly in charge of one Othello's factories.
Act I: In which tragedy occurs.
Scene I: Wherein Othello and Desdemona have an enlightened discussion.
[Enter Othello and Desdemona]
Othello:
Thou art an angel!
Desdemona:
Listen to thy heart.
[Exit Othello]
[Enter Brabantio]
Scene II: Wherein Brabantio expresses his internal monologue to Desdemona.
Desdemona:
Thou art the sum of thyself and the wind!
Brabantio:
Is Othello jollier than me?
If so, is the remainder of the quotient of Othello and I better than nothing?
If not, thou art the product of thyself and me.
IS Othello jollier than me?
If so, let us return to scene II!
Scene III: An Epilogue.
Brabantio:
Open thy heart!
[Exeunt]
이 SPL 컴파일러를 사용 하고 있습니다 를 하여 프로그램을 실행하고 있습니다.
로 실행 :
$ python splc.py product-of-divisors.spl > product-of-divisors.c
$ gcc product-of-divisors.c -o pod.exe
$ echo 30 | ./pod
810000
lambda _:_**(sum(_%-~i<1for i in range(_))/2)
방해 x
숫자로 . 모두 y
와 z
의 약수 될 것입니다 x
경우 y * z = x
. 따라서 y = x / z
. 하자의 숫자라고 d
인해 제수가 될 것이 관찰로, 6 divisiors이있다 a
, b
, c
, d / a
, d / b
, d / b
. 이 모든 수 (퍼즐의 점)를 곱하면을 얻습니다 d * d * d = d ^ 3
. 일반적으로, e
다수의 f
제수의 경우, 상기 제수의 곱은 e ^ (f / 2)
람다가하는 것입니다.
n->{int r=n,d=0;for(;++d<n;)r*=n%d<1?d:1;return r;}
1 바이트를 절약 해 주셔서 감사합니다 LeakyNun!
n->{int r=n,d=0;for(;++d<n;)r*=n%d<1?d:1;return r;}
m*=n%i>0 or i
i=n=input()
m=1
while i:m*=n%i>0 or i;i-=1
print m
function l(k)
n=0
l=1
do while(n<k)
n=n+1
if(MODULO(k,n)==0)then
l=l*n
end if
end do
end
언 골프 드 :
integer function l(k)
implicit none
integer :: n, k
n=0
l=1
do while (n<k)
n=n+1
if (MODULO(k,n) == 0) then
l=l*n
end if
end do
end function l