チャレンジ
正の整数を指定すると、それ自体を含む除数の積を返します。
これは、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なので、各言語で最短の答えが勝ちです!
回答:
â
と×
、この答えを書くとき
(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と入力値の間のすべての値をループし、現在のカウンター値が入力の約数であるかどうかを確認します。そうである場合、それを実行中の合計製品に乗算します。
非ゴルフアセンブリ言語のニーモニック:
; 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
命令が配当のためにハードコードされたオペランドを使用するという事実は私のスタイルを少しcr屈にしますが、これは組み込みではなく基本的な算術と条件分岐を持つ言語にはかなり良いと思います!
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 Grayのおかげで-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)
。
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)
ですか?(ただし、これはバイトを保存しません。)
.
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;}
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