Copeland–Erdőの定数内の数値を見つける


17

バックグラウンド

コープランド-エルデシュ定数は「0」を連結したものです 順番に素数の10を基数とした表現。その値は

0.23571113171923293137414...

OEIS A033308も参照してください。

CopelandとErdősは、これが通常の数値であることを証明しました。これは、すべての自然数がコープランド・エルド定数の10進数展開のある時点で見つかることを意味します。

チャレンジ

正の整数を指定して、10を基数(先行ゼロなし)で表し、Copeland–Erdの定数の10進数のシーケンス内で最初に出現するインデックスを出力します。

合理的な入力および出力形式はすべて使用できますが、入力および出力は10を基数にする必要があります。特に、入力は文字列として読み取ることができます。そして、その場合、先行ゼロを含まないと見なすことができます。

出力は、定数の最初の10進数から始まる0ベースまたは1ベースです。

実際の結果は、データの種類、メモリ、または計算能力によって制限される場合があります。そのため、テストケースによってはプログラムが失敗する場合があります。だが:

  • どんな入力に対しても理論的に機能するはずです(つまり、これらの制限を考慮しない)。
  • 少なくとも最初の4つのケースで実際に機能し、それぞれのケースで結果が1分以内に生成されるはずです。

テストケース

ここでは、出力は1から始まります。

13       -->         7   # Any prime is of course easy to find
997      -->        44   # ... and seems to always appear at a position less than itself
999      -->      1013   # Of course some numbers do appear later than themselves
314      -->       219   # Approximations to pi are also present
31416    -->     67858   # ... although one may have to go deep to find them
33308    -->     16304   # Number of the referred OEIS sequence: check
36398    -->     39386   # My PPCG ID. Hey, the result is a permutation of the input!
1234567  -->  11047265   # This one may take a while to find


さて、それでは勝利の基準は何ですか?
-user8397947

I / Oに関する詳細なルールを考慮して、これはコードゴルフであると想定し、タグを適用します。これがあなたが念頭に置いていたことを願っています。
デニス

@デニスはい、すみません、忘れました。編集していただきありがとうございます
ルイスメンドー

回答:


6

05AB1E、14バイト

0インデックス付き出力を使用します。osabieの主な機能は非常に非効率的です。コード:

[NØJD¹å#]¹.Oð¢

説明:

[       ]        # Infinite loop...
 N               # Get the iteration value
  Ø              # Get the nth prime
   J             # Join the stack
    D            # Duplicate this value
     ¹å#         # If the input is in this string, break out of the loop
         ¹.O     # Overlap function (due to a bug, I couldn't use the index command)
            ð¢   # Count spaces and implicitly print

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


7

Python 2、64バイト

f=lambda n,k=2,m=1,s='':-~s.find(`n`)or f(n,k+1,m*k*k,s+m%k*`k`)

1から始まるインデックスを返します。Ideoneでテストします。


5

ゼリー、17 バイト

ÆRDFṡL}i
Ḥçßç?
çD

1から始まるインデックスを返します。オンラインでお試しください!または、ほとんどのテストケースを確認します。

最後のテストケースをローカルで検証しました。8分48秒かかりました。

使い方

çD        Main link. Argument: n (integer)

 D        Decimal; yield A, the array of base 10 digits of n.
ç         Call the second helper link with arguments n and A.


Ḥçßç?     Second helper link. Left argument: n. Right argument: A.

Ḥ         Unhalve; yield 2n.
    ?     If...
   ç        the first helper link called with 2n and A returns a non-zero integer:
 ç            Return that integer.
          Else:
  ß           Recursively call the second helper link with arguments 2n and A.


ÆRDFṡL}i  First helper link. Left argument: k. Right argument: A.

ÆR        Prime range; yield the array of all primes up to k.
  DF      Convert each prime to base 10 and flatten the resulting nested array.
     L}   Yield l, the length of A.
    ṡ     Split the flattened array into overlapping slices of length l.
       i  Find the 1-based index of A in the result (0 if not found).

代替バージョン、11バイト(非競合)

ÆRVw³
ḤÇßÇ?

wこのチャレンジが投稿された時に原子が存在しませんでした。オンラインでお試しください!

使い方

ḤÇßÇ?  Main link. Argument: n (integer)

Ḥ      Unhalve; yield 2n.
    ?  If...
   Ç     the helper link called with argument 2n returns a non-zero integer:
 Ç         Return that integer.
       Else:
  ß      Recursively call the main link with argument 2n.


ÆRVw³  Helper link. Argument: k (integer)

ÆR     Prime range; yield the array of all primes up to k.
  V    Eval; concatenate all primes, forming a single integer.
    ³  Yield the first command-line argument (original value of n).
   w   Windowed index of; find the 1-based index of the digits of the result to
       the right in the digits of the result to the left (0 if not found).

4

実際には、19バイト

╗1`r♂Pεj╜@íu`;)╓i@ƒ

文字列を入力として受け取り、部分文字列の1から始まるインデックスを出力します

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

説明:

╗1`r♂Pεj╜@íu`;)╓i@ƒ
╗                    push input to register 0
  `r♂Pεj╜@íu`;)      push this function twice, moving one copy to the bottom of the stack:
   r♂Pεj               concatenate primes from 0 to n-1 (inclusive)
        ╜@íu           1-based index of input, 0 if not found
1              ╓     find first value of n (starting from n = 0) where the function returns a truthy value
                i@   flatten the list and move the other copy of the function on top
                  ƒ  call the function again to get the 1-based index

3

ジュリア、55バイト

\(n,s="$n",r=searchindex(n|>primes|>join,s))=r>0?r:3n\s

1から始まるインデックスを返します。すべてのテストケースを1秒以内に完了します。オンラインでお試しください!


素数3を、例えばではなく、上限でシフトする理由はあります2か?また、0より短い入力で動作するように拡張する方法はあり...=r>0?r:3(n+9)\sますか?
チャーリー

32私のテストよりもわずかに速く、バイトカウントは増加しませんでした。input では、代わりに0使用できます-~nが、はるかに遅くなります。
デニス

ありがとう、-~3n\s(== (3n+1)\s)で十分です。
チャーリー


2

J、37バイト

(0{":@[I.@E.[:;<@":@p:@i.@]) ::($:+:)

入力は基数10の整数として与えられ、出力はゼロベースのインデックスを使用します。

使用法

   f =: (0{":@[I.@E.[:;<@":@p:@i.@]) ::($:+:)
   f 1
4
   f 13
6
   f 31416
67857

説明

この最初の呼び出しは動詞をモナドとして扱いますが、後続の呼び出しは再帰的にそれをダイアドとして扱います。

0{":@[I.@E.[:;<@":@p:@i.@]  Input: n on LHS, k on RHS
                         ]  Get k
                      i.@   Get the range [0, 1, ..., k-1]
                   p:@      Get the kth prime of each
                ":@         Convert each to a string
              <@            Box each string
           [:;              Unbox each and concatenate to get a string of primes
     [                      Get n
  ":@                       Convert n to a string
      I.@E.                 Find the indices where the string n appears in
                            the string of primes
0{                          Take the first result and return it - This will cause an error
                            if there are no matches

(...) ::($:+:)  Input: n on RHS, k on LHS
(...)           Execute the above on n and k
      ::(    )  If there is an error, execute this instead
           +:   Double k
         $:     Call recursively on n and 2k

1
これが機能することを証明できますか?
リーキー修道女

@LeakyNunそうそう、技術的にはテストケースでのみ機能しますが、最初のn個の素数では見つからない可能性があります。
マイル

これは、n = 1の作業は、最初の素数は2ではありませんので、あなたは1の最初の出現を取得する最初の5つの素数を必要とする
マイル

1

PowerShell v2 +、90バイト

for($a="0.";!($b=$a.IndexOf($args)+1)){for(;'1'*++$i-match'^(?!(..+)\1+$)..'){$a+=$i}}$b-2

nを含むn番目の素数を印刷する素数生成メソッドと相まって、Champernowneの定数の答えの中のFind the numberのロジックを組み合わせます答え2適切にインデックスを出力するために減算します(つまり、0.開始時にカウントしません)。

入力を文字列として受け取ります。999私のマシンでは約7秒で1つが見つかりますが、33308かなり長くなります(編集-90分後にあきらめました)。これは.NET文字列の最大長であるため、インデックス[Int32]::Maxvalueaka までの任意の値に対して理論的に機能するはず2147483647です。ただし、それが発生するずっと前にメモリの問題が発生する可能性があります。

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