除数の積


21

チャレンジ

正の整数を指定すると、それ自体を含む除数の積を返します。

これは、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

得点

これはなので、各言語で最短の答えが勝ちです!


2
興味深いメモ(おそらく、このチャレンジにはそれほど有用ではありませんが):nのすべての約数の積は常にn ^((nの約数の数)/ 2)です。
-Wojowu

回答:



7

Japt、3バイト

â ×

オンラインでお試しください!

説明

â ×  // implicit integer input

â    // get integer divisors
  ×  // get product of array

くそー、どうやって私を忍者にしたの?!:p私がコンピューターに着いたとき(それがあるかもしれないときはいつでも)私のものを削除します。
シャギー

@Shaggy私はちょうど両方を知ったことから、驚いているâ×、この答えを書くとき
ジャスティン・マリナー

私はその分遅くなった。キャラクター制限!
シャギー







3

3
私は答えをスクロールします:プレーンモノスペースコード、プレーンモノスペースコード、プレーン...太字、セリフコード?:-P
ETHproductions

@ETHproductionsへへ。
Okx

4
@ETHproductions私は実際にiOSでこの答えをコーディングしました。つまり、実際にキャラクターを見ることができません。
Okx

それは...非常に印象的です。
-ETHproductions

2
@MamaFunRoll今では長い間聞いたことのない名前です...
;


2

x86-64マシンコード、26バイト

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屈にしますが、これは組み込みではなく基本的な算術と条件分岐を持つ言語にはかなり良いと思います!


2

TI-Basic(TI-84 Plus CE)、24バイト

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

2
実際にはバイトカウントを含めていません。
エリックアウトゴルファー

@EriktheOutgolferおっと!一定。
-pizzapants184

2

C(gcc)、52 48バイト

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

(1)逆方向にカウントする、(2)p*=式の括弧を削除する、(3)forコンマを削除するためにループの本体にステートメントを挿入することにより、4バイトを節約できます。また、追加のパラメーターを追加するのではなく、グローバル変数を使用することも好きです。これにより、バイトを犠牲にすることなく、未定義の動作を回避できます。最終バージョン:p,a;f(x){for(p=1,a=x;a;--a)p*=x%a?1:a;return p;}
コーディグレイ

5バイトに置き換えreturn p;p=p;保存できます。
ジョナサンフレッチ

別のバイトを保存するには、置き換えることができp,a;f(x)f(x,p,a)
ジョナサンフレッチ

グローバル変数の代わりにローカル変数を使用すると、全体return p;を削除して、5バイトではなく9バイトを節約することもできます。(TIO
ジョナサンフレッチ

2

JavaScript(ES7)、32バイト

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>


代替(ES6)、32バイト

n=>g=(i=n)=>i?(n%i?1:i)*g(i-1):1

1
ES6と互換性があるのはなぜ(n%i?1:i)ですか?(ただし、これはバイトを保存しません。)
アーナルド

@Arnauld:ハーフ6は明らかにゴルフの早朝には早すぎるからです!:DIは、Leakyのヒントを見つけたときに、3項を逆転させました!
シャギー

2

TI-Basic、24 14 13バイト

lirtosiastのおかげで1バイト節約

:√(Ans^sum(not(fPart(Ans/randIntNoRep(1,Ans

1
あなたは必要int(ですか?
リトシアスト

1

QBIC、22バイト

[:|~b/a=b'\`a|q=q*a}?q

説明

[:|           FOR a  = 1; a <= input (b); a++
 b/a=b'\`a    'a' is a proper divisor if integer division == float division
~         |   IF that's true
q=q*a         THEN multiply running total q (starts as 1) by that divsor
}             NEXT
?q            Print q



1

Mathematica、17バイト

削除された回答(DavidCの回答)を表示できない人のために、これは@MartinEnderの助けを借りたMathematicaのコードです

1##&@@Divisors@#&

1

シェークスピアプログラミング言語、353バイト

.
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

1

Python 3、45バイト

lambda _:_**(sum(_%-~i<1for i in range(_))/2)

してみましょうx数で。両方yzの約数になりますx場合y * z = x。したがって、y = x / z。さんは数が言ってみましょうd。この観察のために6 divisiors、除数はなりを持っていますabcd / ad / bd / b。これらすべての数字(パズルのポイント)を掛けると、が得られd * d * d = d ^ 3ます。一般に、e多くのf除数の場合、上記の除数の積はになりe ^ (f / 2)、これがラムダの機能です。

オンラインでお試しください!


1

MY、4バイト

六角:

1A 3A 54 27

説明:

1A - Input as an integer
3A - Factors
54 - Product
27 - Output (with newline)








0

公理、23バイト

h(x)==x^(#divisors x/2)

これは、alephalphaソリューションの公理の翻訳です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.