アリコットシリーズのシーケンスのn番目の桁を返します


20

0.定義

シーケンスは、番号のリストです。シリーズは、数字のリストの合計です。自然数 のセットには、すべての「ゼロより大きい非負の整数」が含まれます。自然数j除数(この文脈では)は自然数iでありj ÷ iも自然数です。



1.前文

このサイトの他のいくつかの質問では、アリコットの概念、またはaより小さい自然数aの約数のシーケンスに言及してます。友好的な数決定するには、これらの除数の合計を計算する必要があります。これは、アリコート合計またはアリコート系列と呼ばれます。すべての自然数には独自のアリコート合計がありますが、数値のアリコート合計の値は必ずしもその数に固有ではありません。(例gratia、すべての素数のアリコートの合計は1です。)

2.課題

自然数を指定するとnnアリコートの合計のシーケンスのth桁目を返します。1のシリーズから始まる、シーケンスの最初のいくつかのシリーズは次のとおりです。

{0, 1, 1, 3, 1, 6, 1, 7, 4, 8, 1, 16, 1, 10, 9, 15, 1, 21, 1, 22, 11, 14, 1, 36, 6, 16, 13}

連結すると、これらは次のようになります。

0113161748116110915121122111413661613

入力は、好みに応じて、インデックスがゼロまたは1になります。溶液は、10,000桁(入力まで戻ることができるプログラムまたは関数でなければならない9999か、10000)を。最短の作業ソリューションが勝ちます。

3.テストケース

正しい入出力のペアには、次のものが含まれますが、これらに限定されません。

   0 or     1    ->    0
   4 or     5    ->    1
  12 or    13    ->    6
9999 or 10000    ->    7

「または」の前の数字は0から始まります。次の番号は1から始まります。
リクエストに応じて、追加のテストケースが提供される場合があります。

4.参照

OEISには、数字のリストとそのアリコートの合計があります。


2
素敵な最初の挑戦、ところで。:)
マーティンエンダー

1
言語が1万文字の文字列を管理できない場合は?? (たとえば、ひどいOracle SQL 4kの制限)言語の制限であれば、答えは有効ですか?
ジャコモガラベッロ16

@MartinEnder、ありがとう!そして、そのリンクに感謝します。啓発的だった。制限のある言語で回答を処理する方法を説明するものはありますか?何も見つかりませんでしたが、それがそこにないわけではありません。:)
ジョー

私は完全に太っているかもしれませんが、そのシリーズの数字はどのように計算されますか?
トムカーペンター

@TomCarpenter:最初の要素について、1未満の1のすべての約数を取り、それらを加算します。(1は1の唯一の除数なので、最初の要素はゼロになります。)2番目の要素、2より小さい2の除数(1のみがこれに適合します)。3番目、3の約数(まだ1だけ)。等々。4の約数は{1、2}、および1 + 2 == 3であるため、4番目の要素は3です。それを理解するのにも時間がかかりました;)
ジョー

回答:


6

05AB1E14 11 10バイト

約15秒でn = 9999を計算します。コード:

ÌL€Ñ€¨OJ¹è

説明:

Ì           # Increment implicit input by 2
 L          # Generate the list [1 .. input + 2]
  ۄ        # For each, get the divisors
    ۬      # For each, pop the last one out
      O     # Sum all the arrays in the array
       J    # Join them all together
        ¹è  # Get the nth element

CP-1252エンコードを使用します。オンラインでお試しください!


6

Mathematica、51バイト

Array[##&@@IntegerDigits[Tr@Divisors@#-#]&,#][[#]]&

整数を取り戻し、1ベースのインデックスを使用する名前のない関数。入力を10000即座に処理します。

説明

これは定義の非常に簡単な実装であり、最初のn除数の合計が常にnth桁を決定するのに十分であるという事実を利用しています。いつものように、ゴルフをしたMathematicaの読み順は少しおかしいです:

Array[...&,#]...&

これは、すべての値に左の無名の関数を適用したすべての結果とリスト生成iから1n包括的に。

...Tr@Divisors@#-#...

の除数を計算することから始め、iそれらを合計し、それ自体Trを減算iして、それが未満の除数の合計になるようにしiます。

...IntegerDigits[...]...

これにより、結果が10進数のリストになります。

##&@@...

これにより、「リスト」の頭が削除され、すべての数字リストがの結果に自動的に連結されArrayます。仕組みの詳細については、この投稿の##「引数のシーケンス」セクションを参照してください。

...[[#]]

最後に、n結果からth桁目を選択します。


4

Brachylog、40バイト

:2-I,?:?:1yrc:Im.;0.
:1e:2f+.
>.>0,?:.%0

これは1から始まり、で約0.15秒、N = 100で15秒かかりN = 1000ます。現在のためN = 10000に実行していますが、終了したら実行時間を報告します(推定が正しければ、約8時間かかります)

編集:Brachylogの早すぎる制約伝播を修正することにより、現在(3バイト長いコードで)約2.5数分かかり10000ますが、out of global stackエラーを返します。

説明

  • 主な述語: Input = N

    :2-I,                 I = N - 2
         ?:?:1y           Find the N first valid outputs of predicate 1 with input N
               rc         Reverse and concatenate into a single number
                 :Im.     Output is the Ith digit of that number
                     ;    Or (I strictly less than 0)
                      0.  Output is 0
    
  • 述語1:約数の合計を計算します

    :1e                   Get a number between N and 1
       :2f                Find all valid outputs of predicate 2 with that number as input
          +.              Output is the sum of those outputs
    
  • 述語2:入力の除数で出力を統合します

    >.>0,                 Output is a number between Input and 0
         ?:.%0            Input is divisible by Output
    

1
この-Gオプションを使用して、より多くのグローバルスタックを割り当てることができます。デフォルトはのみ128Mです。たとえば、次swipl -G2Gを使用できます。2GOを使用します。
マット

4

Pyth、26 21 20 15バイト

@sm`sf!%dTtUdSh

オンラインでお試しください。 テストスイート。

0ベースのインデックスを使用します。プログラムはO(n²)で、2008年のマシンでは約14分でn = 9999で完了します。


複雑な除数の検索はどうなっていますか?f!%dTr1dずっと短い(しかし遅い)
ジャクベ

@Jakube whoops、20バイトソリューションの間違ったバージョンを変更しました。
-PurkkaKoodari

f!%TYtUT私が持っていたものです。
-PurkkaKoodari

@ジャクベそれに変えました。n = 9999の間、まだ実行されており、5分以上経過しています:\
PurkkaKoodari

4

ゼリー、13 11 10バイト

@Adnanに2バイト、@ Dennisにさらに1バイト。

ÆDṖSDµ€Fị@

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

1ベースのインデックスを使用します。オンラインで2秒未満でn = 10000 完了します。


ÆDṖSDµ€Fị@バイトを保存します。
デニス

@Dennisそれは最初のチェーン全体に適用されますか?
PurkkaKoodari

@ Pietu1998:はい、正確に:一般に、解析時に、に適用されchain.pop() if chain else chains.pop()ます。新しく開始されたチェーンは空なので、最後に終了したチェーンが代わりに使用されます。
リン

3

PHP、90バイト

0インデックス付き

<?php for(;strlen($s)<=$a=$argv[1];$s.=$n)for($n=0,$j=++$i;--$j;)$i%$j||$n+=$j;echo$s[$a];

絶対に微妙ではない、または巧妙にアプローチする方法はまったくありません。
また、通常どおり、無視される3つの通知を生成します。


3

J、34バイト

{[:;1<@":@(-~>:@#.~/.~&.q:)@+i.@>:

これはゼロインデックスであり、以下の式を使用して除数の合計を計算します。

式

説明

{[:;1<@":@(-~>:@#.~/.~&.q:)@+i.@>:  Input: n
                                >:  Increment n
                             i.@    Create the range [0, 1, ..., n]
    1                       +       Add one to each to get [1, 2, ..., n+1]
          (               )@        For each value
                        q:            Get the prime factors
                   /.~&.              For each group of equal prime factors
                #.~                     Raise the first to the first power, the second
                                        squared and so on, and sum them
             >:@                        Increment that sum
                      &.q:            Reduce the groups using multiplication
           -~                         Subtract the initial value from that sum
       ":@                            Convert each to a string
     <@                               Box each
 [:;                                Unbox each and concatenate the strings
{                                   Select the character from that string at index n
                                    and return it

2

MATL16 15バイト

:"@@q:\~fsV]vG)

インデックスは1ベースです。

オンラインコンパイラでは最後のテストケースがタイムアウトしますが、オフラインコンパイラでは約15秒で正しい結果が得られます。

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

:         % Take input n. Push [1 2 ... n]
"         % For each k in [1 2 ... n]
  @       %   Push k
  @q:     %   Push [1 2 ... k-1]
  \       %   Modulo. Zero values correspond to divisors
  ~f      %   Indices of zeros. These are the divisors
  s       %   Sum
  V       %   Convert to string
]         % End for each
v         % Concatenate all stack contents vertically
G)        % Take n-th digit. Implicitly display

2

Haskell、52バイト

(([1..]>>= \n->show$sum[m|m<-[1..n-1],mod n m<1])!!)

使用例:(([1..]>>= \n->show$sum[m|m<-[1..n-1],mod n m<1])!!) 12-> 6

定義の直接実装です。foreach n合計は除数であり、文字列に変換します。そのようなすべての文字列を連結し、要求されたインデックスで要素を選択します。Haskellの遅延はn、無限リスト[1..]から必要なだけsを取ります。


1

Python 3.5、103 93 92バイト:

R=range;A=lambda f:''.join([str(sum([j for j in R(1,i)if i/j%1==0]))for i in R(1,f+1)])[f-1]

ポストで説明されているメソッドのかなり簡単な実装。

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

オンラインコンパイラでinput 10000に割り当てられた5秒以内に完全には終了しませんが、約8.5秒以内に同じ入力でマシン上で終了します。


1

オクターブ、71バイト

これはオクターブのみです。MATLABでは機能しません。1のインデックス番号で機能する仮想関数が作成されます。おそらくもう少し単純化できます。今晩見てください。

@(x)c((c=num2str(arrayfun(@(n)sum(b(~rem(n,b=(1:n-1)))),1:x)))~=' ')(x)

こちらからオンライン試すことができます

上記のコマンドを、接頭辞などを付けてa=(複数回使用できるように)実行してから、doを実行しますa(10000)。10000桁目が7であると計算するには約7秒かかります。


1

Java 8、220バイト

import java.util.stream.IntStream;
char a(int n){return IntStream.range(1,n+2).map(i->IntStream.range(1,i).filter(k->i%k==0).sum()).mapToObj(Integer::toString).collect(java.util.stream.Collectors.joining("")).charAt(n);}

まあ、少なくとも高速です。私のマシンで9999/10000番目の要素を取得するのに平均0.3秒です。指定したインデックスと同数のアリコート合計のみが生成されます。つまり、一部のアリコートの合計は2桁以上であるため、ほとんどの場合、文字列はインデックスよりわずかに長くなりますが、ほとんどの場合、必要な長さの文字列のみを生成します。

使用法:

public static void main(String[] args) {
    System.out.println(a(0));
    System.out.println(a(4));
    System.out.println(a(12));
    System.out.println(a(9999));
}

ゴルフをしていない:

public static void main(String[] args) {
    System.out.println(all(0));
    System.out.println(all(4));
    System.out.println(all(12));
    System.out.println(all(9999));
}

static int aliquotSum(int n) {
    return IntStream.range(1, n).filter(k -> n % k == 0).sum();
}

static IntStream sums(int n) {
    return IntStream.range(1, n + 2).map(i -> aliquotSum(i));
}

static String arraycat(IntStream a) {
    return a.mapToObj(Integer::toString).collect(java.util.stream.Collectors.joining(""));
}

static char all(int index) {
    return arraycat(sums(index)).charAt(index);
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.