Temukan angka dalam konstanta Copeland – Erd


17

Latar Belakang

The Copeland-Erdös konstan adalah gabungan dari "0" dengan basis 10 representasi dari bilangan prima secara berurutan. Nilainya adalah

0.23571113171923293137414...

Lihat juga OEIS A033308 .

Copeland dan Erd membuktikan bahwa ini adalah angka normal . Ini menyiratkan bahwa setiap bilangan alami dapat ditemukan di beberapa titik dalam ekspansi desimal konstanta Copeland-Erd.

Tantangan

Diberikan bilangan bulat positif, ungkapkan dalam basis 10 (tanpa nol di depan) dan hasilkan indeks penampilan pertama dalam urutan angka desimal konstanta Copeland-Erd.

Setiap input dan output format yang masuk akal diperbolehkan, tetapi input dan output harus dalam basis 10. Secara khusus, input dapat dibaca sebagai string; dan dalam hal ini dapat diasumsikan tidak mengandung nol di depan.

Output mungkin berbasis 0 atau berbasis 1, dimulai dari desimal pertama konstanta.

Hasil aktual mungkin dibatasi oleh tipe data, memori atau daya komputasi, dan dengan demikian program mungkin gagal untuk beberapa kasus uji. Tapi:

  • Ini harus bekerja secara teori (yaitu tidak memperhitungkan batasan-batasan itu) untuk masukan apa pun.
  • Ini harus bekerja dalam praktek untuk setidaknya empat kasus pertama, dan untuk masing-masing hasilnya harus dihasilkan dalam waktu kurang dari satu menit.

Uji kasus

Output di sini diberikan sebagai berbasis-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


Oke, jadi apa kriteria yang menang?
user8397947

Mengingat aturan terperinci tentang I / O, saya akan menganggap ini adalah kode golf dan menerapkan tag. Saya harap ini yang ada dalam pikiran Anda.
Dennis

@ Dennis Ya, maaf, saya lupa. Terima kasih telah mengedit
Luis Mendo

Jawaban:


6

05AB1E , 14 byte

Menggunakan output yang diindeks 0 . Fungsi utama di osabie sangat tidak efisien. Kode:

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

Penjelasan:

[       ]        # 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

Menggunakan pengkodean CP-1252 . Cobalah online! .


7

Python 2, 64 byte

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

Mengembalikan indeks berbasis 1. Uji di Ideone .


5

Jelly , 17 byte

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

Mengembalikan indeks berbasis 1. Cobalah online! atau verifikasi sebagian besar kasus uji .

Saya telah memverifikasi kasus uji terakhir secara lokal; butuh 8 menit dan 48 detik.

Bagaimana itu bekerja

ç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).

Versi alternatif, 11 byte (tidak bersaing)

ÆRVw³
ḤÇßÇ?

The watom tidak ada ketika tantangan ini telah diposting. Cobalah online!

Bagaimana itu bekerja

ḤÇßÇ?  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

Sebenarnya, 19 byte

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

Mengambil string sebagai input dan output indeks substring berbasis 1

Cobalah online!

Penjelasan:

╗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

Julia, 55 byte

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

Mengembalikan indeks berbasis 1. Selesaikan semua kasus uji dalam waktu kurang dari satu detik. Cobalah online!


Apakah ada alasan mengapa Anda menggeser bilangan prima yang diikat oleh 3dan bukan dengan 2? Juga, apakah ada cara untuk memperpanjangnya agar bekerja 0pada input yang lebih pendek daripada ...=r>0?r:3(n+9)\s?
charlie

3sedikit lebih cepat daripada 2dalam pengujian saya dan tidak meningkatkan jumlah byte. Untuk input 0, Anda bisa menggunakannya -~nsebagai gantinya, tetapi itu akan jauh lebih lambat.
Dennis

Terima kasih, -~3n\s(== (3n+1)\s) sudah cukup baik.
charlie


2

J , 37 byte

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

Input diberikan sebagai basis 10 integer dan output menggunakan pengindeksan berbasis nol.

Pemakaian

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

Penjelasan

Panggilan pertama ini memperlakukan kata kerja sebagai monad, namun panggilan selanjutnya yang mungkin terjadi secara berulang memperlakukannya sebagai angka dua.

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
Bisakah Anda membuktikan bahwa ini berhasil?
Leaky Nun

@ LeakyNun Oh ya itu benar, secara teknis hanya berfungsi untuk kasus uji tetapi mungkin tidak ditemukan di n primes pertama .
mil

Ini tidak bekerja untuk n = 1 karena bilangan prima pertama adalah 2 dan Anda memerlukan lima bilangan prima pertama untuk mendapatkan kemunculan pertama dari 1.
miles

1

PowerShell v2 +, 90 byte

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

Menggabungkan logika dari saya Temukan nomor dalam jawaban konstan Champernowne , ditambah dengan metode generasi utama dari saya Mencetak perdana ke-n yang berisi n jawaban, kemudian mengurangi 2untuk menampilkan indeks dengan tepat (yaitu, tidak menghitung 0.di awal).

Mengambil input sebagai string. Menemukan 999satu dalam waktu sekitar tujuh detik pada mesin saya, tetapi yang 33308dalam sedikit lebih lama ( sunting - saya menyerah setelah 90 menit ). Secara teoritis harus bekerja untuk nilai apa pun hingga indeks [Int32]::Maxvaluealias 2147483647, karena itulah panjang maksimum string .NET. Akan tetapi, kemungkinan akan mengalami masalah memori jauh sebelum itu terjadi.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.