数の約数を数える


26

前書き

これは非常に簡単な課題です。単に数の約数を数えるだけです。以前にも同様の、より複雑な課題がありましたが、私はこれをエントリーレベルにしようと考えています。

チャレンジ

1つの厳密に正の整数が与えられた場合N、1 またはを含む約数を出力または返すプログラムまたは関数を作成しますN

入力:1つの整数>0。数値は、言語のネイティブの数値型で表現できると仮定できます。

出力:1および数値自体を含む、正の整数除数の数。

提出はバイト単位で記録されます。あなたは見つけることがあり、このウェブサイトは、あなたのバイト数を生成するための合理的な方法を使用するかもしれませんが、便利。

これはなので、最低スコアが勝ちです!

編集: FryAmTheEggmanの5バイトのPythの答えが勝者のようです!ただし、新しい回答を送信してください。短くできる場合は、受け入れられる答えを変更します。

テストケース

ndiv(1) -> 1
ndiv(2) -> 2
ndiv(12) -> 6
ndiv(30) -> 8
ndiv(60) -> 12
ndiv(97) -> 2
ndiv(100) -> 9

リーダーボード

これは、通常のリーダーボードと言語ごとの勝者の概要の両方を生成するスタックスニペットです。

回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください。

# Language Name, N bytes

N提出物のサイズはどこですか。スコアを改善する場合、古いスコアを打つことで見出しに残すことができます。例えば:

# Ruby, <s>104</s> <s>101</s> 96 bytes

ヘッダーに複数の数字を含める場合(たとえば、スコアが2つのファイルの合計であるか、インタープリターフラグペナルティを個別にリストする場合)、実際のスコアがヘッダーの最後の数字であることを確認します。

# Perl, 43 + 2 (-p flag) = 45 bytes

言語名をリンクにして、リーダーボードスニペットに表示することもできます。

# [><>](http://esolangs.org/wiki/Fish), 121 bytes

回答:


19

Pyth、5

l{yPQ

入力の素因数に対してサブセット演算を使用し、因子の一意のリストのみを保持して、このカウントを返します。

テストスイート

説明

25を例として使用して、サブセットリストがあまり長くならないようにします

l{yPQ     ## implicit:  Q = eval(input()) so Q == 25
   PQ     ## Prime factors of Q, giving [5, 5]
  y       ## All subsets, giving [[], [5], [5], [5, 5]]
 {        ## Unique-fiy, giving [[], [5], [5, 5]]
l         ## Length, print implicity

魅力的です。良いアプローチ
チョイス


11

LabVIEW、4938バイト

まあ、それは明らかにコードゴルフには向いていませんが、何であれ、私の最初の投稿とここでのlolzに行きます。 ここに画像の説明を入力してください


プログラミングパズルとコードゴルフへようこそ!あなたが私に尋ねても構わないなら、どのようにこれを採点しましたか?メタに関する先例が見つかりませんでした。
bkul

私はそれを保存し、そのサイズを取りました
Eumel

そして、それは4.938バイトでしたか?たとえば、キロバイトではありませんか?
bkul

正確さのために、kbカウントではなくバイトカウントを
取得しました-Eumel

4
@bkul混乱の原因はであると思いますが.、これは小数点ではなく1000の区切り文字であると確信しています(一部の言語では一般的です)。
マーティンエンダー

10

Haskell、28バイト

f n=sum[0^mod n i|i<-[1..n]]

ここでのトリックは、剰余がイン0ディケーター関数を使用しているかどうかをテストすること0^です。

0^0 = 1
0^_ = 0

これは、0の正の累乗が0であるのに対して機能しますが、0 ^ 0は組み合わせで1の空の積です。

これをフィルタリングと比較してください

f n=sum[1|i<-[1..n],mod n i<1]

7

Dyalog APL7 6 バイト

≢∘∪⊢∨⍳

¨次のように、各テストケースに名前を付けて再利用できる名前のない関数です。

      f ← ≢∘∪⊢∨⍳
      f¨ 1 2 12 30 60 97 100
1 2 6 8 12 2 9

説明:

 ┌─┴──┐  
 ∪  ┌─┼─┐
 ∘  │ ∨ │
 ̸≡  ⊢   ⍳

それ自体のGCD 一意の数と、各integers-untilを数えます。

バイトを保存してくれたngnに感謝します。


古いバージョン: +/0=⍳|⊢

これがどのように機能するかです:

  ┌─┴─┐      
  / ┌─┼───┐  
┌─┘ 0 = ┌─┼─┐
+       ⍳ | ⊢

⍳|⊢1から引数の除算剰余引数
0=0が除算の残りと等しい場合のブール値ブール値の
+/合計、つまり1のカウント。


6

Python 2、37バイト

f=lambda n,i=1:i/n or(n%i<1)+f(n,i+1)

再帰関数。iテストされている除数のオプション入力。この式は、除数の(と等しい)で除数を(n%i<1)テストします。結果はの正規表現に追加されます。場合、整数床分割達したと評価し、その値を占め、基本ケースとして返され、それ自体がの除数です。True1i+1i==ni/n1nn


38:

lambda n:sum(n%-~i<1for i in range(n))

匿名関数。1を通じてすべての可能な除数をテストしますn。これは、からシフトアップされ0n-1中にrange(n)使用して-~追加され、1。boolsを合計すると、Pythonの扱いその事実を使用していますTrue/ Falseとして1/を0


6

網膜、17バイト

(?<=(.+))(?=\1*$)

単項入力、 10進出力。

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

単一の正規表現で呼び出された場合、Retinaは単に一致をカウントします。正規表現自体は、その左側の単項数が入力全体の約数である位置と一致します。また、ルックアラウンドはアトミックであるという事実を利用しているため、^アンカーを使用する必要はありません。

最初のlookbehindsは、単にgroupのプレフィックス全体をキャプチャします1。これは決して失敗することはないので、後読みの後、それがグループ1にあることがわかり、変更されなくなります。

先読みは、キャプチャされた文字列(潜在的な除数)を0回以上繰り返すことで、文字列の最後に到達できるかどうかをチェックします。


6

J、10バイト

[:*/1+_&q:

これは名前のない単項動詞です。これは、計算σ 0(Πp K α KとしてΠ(α K + 1)

J.jsでオンラインで試してください。

使い方

[:*/1+_&q:    Right argument: y

      _&q:    Compute all exponents of the prime factorization of y.
    1+        Add 1 to each exponent.
[:*/          Reduce by mutiplication.

q:それが挑戦の本質的な部分を解決するので、私は許されるとは思わない。どうですか[:+/0=]|~1+i.
-FUZxxl

それはこの答えの複製でしょう。また、ビルトインはデフォルトでは禁止されておらず、チャレンジはそれらに言及していないようです。
デニス

チャレンジのすべて/ほとんどすべての仕事をするビルトインは通常禁止されていますが、私はあなたの理由に従うことができますq:
-FUZxxl

1
ではない。私は彼らがいたらいいのですが、そうではありません。
デニス

少し吸うHrmpf hrmpf。
FUZxxl

6

Golfscript、19 18 17 13バイト

MartinBüttnerに感謝します。

~.,\{\)%!}+,,

使い方

~               Evaluate the input, n
 .,             Duplicate the input, create array [0..n-1]
   \            Swap array and n
    {    }+     Add n to block == {n block}
     \          Swap n with i in array
      )         Increment i
       %        n mod i
        !       Logical not so that 1 if divisible by n else 0
           ,    Filter array using block for all i divisible by n
            ,   Get length of the filtered array, the answer

また

@Peterテイラーも13バイトで、。

~:X,{)X\%!},,

使い方

~               Evaluate the input
 :X             Store input in variable X
   ,            Create array [0..X-1]
    {     },    Filter array using the following block
     )          Increment i in array
      X\        Add X to stack, swap with i
        %       X mod i,
         !      Logical not so that 1 if divisible by n else 0
            ,   Get length of the filtered array, the answer

同じ長さの場合もあります~:X,{)X\%!},,
ピーターテイラー

4

J、13 12 11バイト

Jでの私の最初のゴルフ。私はまだそれを学んでいます。

デニスのおかげで1バイト節約できました。

randomraのおかげでもう1バイト節約できました。

1+/@,0=i.|]

説明:

1+/@,0=i.|]
       i.        the array 0 .. n-1
         |]      mod n
     0=          replace 0 by 1, and nonzero entries by 0
1   ,            prepend 1 to the array
 +/@             take the sum

3

Arcyóu、12バイト

さあ、パーティを始めよう!

(F(x)(_(d/ x

これは組み込み関数を使用しますd/。組み込みのないバージョン(27バイト)は次のとおりです。

(F(x)(](+(f i(_ 1 x)(‰ x i

説明:

(F(x)              ; Anonymous function with one parameter x
  (]               ; Increment
    (+             ; Sum
      (f i(_ 1 x)  ; For i in range from 1 to x-1 inclusive:
        (‰ x i     ; x divisible by i

3

CJam、11バイト

ri_,:)f%0e=

ここでテストしてください。

説明

CJamにはこの機能が組み込まれていないため、トライアル部門を行っています。

ri  e# Read input and convert to integer N.
_,  e# Duplicate and turn into range [0 1 ... N-1]
:)  e# Increment each element in the range to get [1 2 ... N]
f%  e# Take N modulo each of the list elements.
0e= e# Count the zeroes.

ボーナス

12バイトの興味深いソリューションを次に示します(Jのような言語では最短になると思われます)。

ri_)2m*::*e=

結果はnn x n乗算表に表示される回数と等しくなります。

ri  e# Read input and convert to integer N.
_)  e# Duplicate and increment.
2m* e# Take Cartesian product of [0 1 ... N] with itself.
::* e# Compute the product of each pair.
e=  e# Count the occurrences of N.

3

Matlab、20バイト

k mod neveryごとk = 1,...,nに実行し、実行してnot(すべてのnonzerをゼロに、すべてのゼロを1に変える)、それらの値をすべて合計します。

@(n)sum(~mod(n,1:n))

これも私のアプローチでした!
ルイスメンドー

これがと同じ長さであることは興味深いlength(divisors(n))
累積

@Acccumulationを追加し@(n)て、有効なサブミッションとして使用する必要があります
flawr

3

ジュリア、20バイト

n->sum(i->n%i<1,1:n)

これは、次のように機能する無名関数です。1から入力までの各整数について、整数を法とする入力がゼロかどうかをテストします。その場合、値はになりtrueますfalse。暗黙的に整数にキャストされるブール値を合計して、除数の数を求めます。


完全を期すために含まれている、はるかにクールな(ただし非常に長い)ソリューションは、

n->prod(collect(values(factor(n))).+1)

これは、の正準因数分解を取得します。nつまり\prod_{i=1}^k p_i^e_i、除数関数をとして計算しτ(n) = \prod_{i=1}^k e_i + 1ます。




2

ルビー、27バイト

->n{(1..n).count{|i|n%i<1}}

サンプル実行:

2.1.5 :001 > ->n{(1..n).count{|i|n%i<1}}[100]
 => 9 


2

正規表現(.NET)、33バイト

^((?=.*$(?<=^\2*(.+?(?>\2?)))).)+

入力と出力が単項であり、出力が正規表現の主要な一致から取得されると仮定します。

正規表現の内訳:

  • .*$ 入力x全体が一方向になるように、ポインタを文字列の末尾に設定します。
  • (?<=^\2*(.+?(?>\2?))) 右から左に一致し、xから0にループして除数をチェックします。
    • (.+?(?>\2?)) は、最初の反復で1から始まり、前の反復での数値から継続し、xまでループする「変数」です。
    • ^\2* xが「変数」の倍数かどうかを確認します。

基本的には、CalcのPhi(Piではない)に対する答えと同じ考えです。チェックのみが異なります。

RegexStormで正規表現をテストします




2

Javascript(ES6)、60 57 42 40 39 37バイト

これはおそらくより良くゴルフできるでしょう。

n=>{for(d=i=n;i;n%i--&&d--);return d}

編集1:私は正しかった。forループの後の括弧を削除しました。

編集2:おかげで40バイトにGolfed manatworkマーティンBüttner

編集3:上記のCの回答に基づいて関数を作成してバイトを保存します

編集4:ןnɟuɐɯɹɐןoɯNeilに感謝しますが、評価を得ることができません。

編集5:評価を削除するのを忘れました。

テスト

n = <input type="number" oninput='result.innerHTML=(

n=>{for(d=i=n;i;n%i--&&d--);return d}

)(+this.value)' /><pre id="result"></pre>


2
良い習慣を放棄します。varキーワードを削除します。でより多くのヒントをJavaScriptでゴルフをするためのヒントはECMAScript 6でゴルフのためのヒント
マナトワーク

2
また、悪い習慣を放棄します:++iとの間の選択肢があるi++場合、前者を選択します(これはゴルフとは関係ありません)。またn%i<1、バイトを保存する必要があります。
マーティンエンダー

2
簡単なテストのみ:n=>{for(d=i=0;i<n;)n%++i<1&&d++;return d}
マナトワーク

1
38:n => eval( 'for(d = 0、i = n; i; d + = n%i-<1); d')
ママファンロール

1
@manatworkどうしてn%++i||++d
ニール

2

PowerShell、34バイト

param($x)(1..$x|?{!($x%$_)}).Count

e.g. 

PS C:\temp> .\divisors-of-x.ps1 97
2
  • 1からxまでの数字のリストを作成し、それらをパイプラインに送ります |
  • モジュロの結果をブール値として暗黙的にキャストし、それを使用し!て反転することにより、パイプラインを(x%item == 0)でフィルターします。組み込みのエイリアス?を使用するWhere-Object
  • 集める().Countどのように多くの項目は、フィルタを介して得ました

非常にうまくハッキングされました!
bkul


2

タクシー、2143バイト

Go to Post Office:w 1 l 1 r 1 l.Pickup a passenger going to The Babelfishery.Go to The Babelfishery:s 1 l 1 r.Pickup a passenger going to Cyclone.Go to Cyclone:n 1 l 1 l 2 r.Pickup a passenger going to Cyclone.Pickup a passenger going to Sunny Skies Park.Go to Sunny Skies Park:n 1 r.Go to Cyclone:n 1 l.Pickup a passenger going to Firemouth Grill.Pickup a passenger going to Joyless Park.Go to Firemouth Grill:s 1 l 2 l 1 r.Go to Joyless Park:e 1 l 3 r.[i][Check next value n-i]Go to Zoom Zoom:w 1 r 2 l 2 r.Go to Sunny Skies Park:w 2 l.Pickup a passenger going to Cyclone.Go to Cyclone:n 1 l.Pickup a passenger going to Divide and Conquer.Pickup a passenger going to Sunny Skies Park.Go to Joyless Park:n 2 r 2 r 2 l.Pickup a passenger going to Cyclone.Go to Sunny Skies Park:w 1 r 2 l 2 l 1 l.Go to Cyclone:n 1 l.Pickup a passenger going to Joyless Park.Pickup a passenger going to Divide and Conquer.Go to Divide and Conquer:n 2 r 2 r 1 r.Pickup a passenger going to Cyclone.Go to Cyclone:e 1 l 1 l 2 l.Pickup a passenger going to Trunkers.Pickup a passenger going to Equal's Corner.Go to Trunkers:s 1 l.Pickup a passenger going to Equal's Corner.Go to Equal's Corner:w 1 l.Switch to plan "F" if no one is waiting.Pickup a passenger going to Knots Landing.Go to Firemouth Grill:n 3 r 1 l 1 r.Pickup a passenger going to The Underground.Go to The Underground:e 1 l.Pickup a passenger going to Firemouth Grill.Go to Knots Landing:n 2 r.Go to Firemouth Grill:w 1 l 2 r.Go to Joyless Park:e 1 l 3 r.Switch to plan "N".[F][Value not a divisor]Go to Joyless Park:n 3 r 1 r 2 l 4 r.[N]Pickup a passenger going to The Underground.Go to The Underground:w 1 l.Switch to plan "E" if no one is waiting.Pickup a passenger going to Joyless Park.Go to Joyless Park:n 1 r.Switch to plan "i".[E]Go to Sunny Skies Park:n 3 l 2 l 1 l.Pickup a passenger going to What's The Difference.Go to Firemouth Grill:s 1 l 1 l 1 r.Pickup a passenger going to What's The Difference.Go to What's The Difference:w 1 l 1 r 2 r 1 l.Pickup a passenger going to The Babelfishery.Go to The Babelfishery:e 3 r.Pickup a passenger going to Post Office.Go to Post Office:n 1 l 1 r.

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

ゴルフをしていない:

Go to Post Office: west 1st left 1st right 1st left.
Pickup a passenger going to The Babelfishery.
Go to The Babelfishery: south 1st left 1st right.
Pickup a passenger going to Cyclone.
Go to Cyclone: north 1st left 1st left 2nd right.
Pickup a passenger going to Cyclone.
Pickup a passenger going to Sunny Skies Park.
Go to Sunny Skies Park: north 1st right.
Go to Cyclone: north 1st left.
Pickup a passenger going to Firemouth Grill.
Pickup a passenger going to Joyless Park.
Go to Firemouth Grill: south 1st left 2nd left 1st right.
Go to Joyless Park: east 1st left 3rd right.
[i]
[Check next value n-i]
Go to Zoom Zoom: west 1st right 2nd left 2nd right.
Go to Sunny Skies Park: west 2nd left.
Pickup a passenger going to Cyclone.
Go to Cyclone: north 1st left.
Pickup a passenger going to Divide and Conquer.
Pickup a passenger going to Sunny Skies Park.
Go to Joyless Park: north 2nd right 2nd right 2nd left.
Pickup a passenger going to Cyclone.
Go to Sunny Skies Park: west 1st right 2nd left 2nd left 1st left.
Go to Cyclone: north 1st left.
Pickup a passenger going to Joyless Park.
Pickup a passenger going to Divide and Conquer.
Go to Divide and Conquer: north 2nd right 2nd right 1st right.
Pickup a passenger going to Cyclone.
Go to Cyclone: east 1st left 1st left 2nd left.
Pickup a passenger going to Trunkers.
Pickup a passenger going to Equal's Corner.
Go to Trunkers: south 1st left.
Pickup a passenger going to Equal's Corner.
Go to Equal's Corner: west 1st left.
Switch to plan "F" if no one is waiting.
Pickup a passenger going to Knots Landing.
Go to Firemouth Grill: north 3rd right 1st left 1st right.
Pickup a passenger going to The Underground.
Go to The Underground: east 1st left.
Pickup a passenger going to Firemouth Grill.
Go to Knots Landing: north 2nd right.
Go to Firemouth Grill: west 1st left 2nd right.
Go to Joyless Park: east 1st left 3rd right.
Switch to plan "N".
[F]
[Value not a divisor]
Go to Joyless Park: north 3rd right 1st right 2nd left 4th right.
[N]
Pickup a passenger going to The Underground.
Go to The Underground: west 1st left.
Switch to plan "E" if no one is waiting.
Pickup a passenger going to Joyless Park.
Go to Joyless Park: north 1st right.
Switch to plan "i".
[E]
Go to Sunny Skies Park: north 3rd left 2nd left 1st left.
Pickup a passenger going to What's The Difference.
Go to Firemouth Grill: south 1st left 1st left 1st right.
Pickup a passenger going to What's The Difference.
Go to What's The Difference: west 1st left 1st right 2nd right 1st left.
Pickup a passenger going to The Babelfishery.
Go to The Babelfishery: east 3rd right.
Pickup a passenger going to Post Office.
Go to Post Office: north 1st left 1st right.

説明:

Convert stdin to a number and store it in three locations for three purposes:
   Original (Sunny Skies Park)
   Counter for tested values (Joyless Park)
   Counter for divisors found (Firemouth Grill)
Divide the original by each Joyless Park value in turn.
If the division result equals the truncated division result, then it's a divisor.
When a divisor is found, subtract one from Firemouth Grill.
Repeat until Joyless Park hits zero.
Pickup the original from Sunny Skies Park and subtract the value from Firemouth Grill.
Convert the result to a string and print to stdout.


2

Excelの数式、42 28バイト

編集:INDIRECT14バイトを節約するために、使用する必要がないことに気付きました!

配列数式として次を入力する必要があります(Ctrl+ Shift+ Enter):

=SUM(--NOT(MOD(N,ROW(1:N))))

Nはテストする番号です。

例:

{SUM(--NOT(MOD(32,ROW(1:32))))}
Result: 6
{SUM(--NOT(MOD(144,ROW(1:144))))}
Result: 15

説明:

SUM(--NOT(MOD(N,ROW(1:N))))       Full formula

                ROW(1:N)          Generates an array of row numbers e.g {1;2;3;4;...N}
          MOD(N,ROW(1:N))         Does N MOD {1;2;3;4;,...N}
      NOT(MOD(N,ROW(1:N)))        Coerces zeros to ones, so that they may be counted, but actually returns an array of TRUE;FALSE;FALSE;...
    --NOT(MOD(N,ROW(1:N)))        Coerces the TRUEs to 1s and FALSEs to 0s.
SUM(--NOT(MOD(N,ROW(1:N))))       Sum the ones for the result.



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