Знайдіть числа в постійній Копеленда — Ерда


17

Фон

Константа Copeland-Erdős є конкатенація «0.» з базою 10 подань простих чисел у порядку. Його цінність

0.23571113171923293137414...

Дивіться також OEIS A033308 .

Коупленд і Ерд довели, що це нормальне число . Це означає, що кожне натуральне число можна знайти в певний момент десяткового розширення постійної Копеленда-Ерда.

Змагання

Враховуючи додатне ціле число, виражіть його в базі 10 (без провідних нулів) і виведіть індекс його першого появи в послідовності десяткових цифр постійної Копеленда – Ерда.

Дозволений будь-який обґрунтований формат введення та виведення, але вхід і вихід повинні бути в базі 10. Зокрема, вхід можна читати як рядок; і в цьому випадку можна припустити, що він не містить провідних нулів.

Вихід може бути на основі 0 або 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


Гаразд, то який критерій виграш?
користувач8397947

Враховуючи детальні правила щодо вводу-виводу, я припускаю, що це код гольфу і застосувати тег. Я сподіваюся, що це ви мали на увазі.
Денніс

@Dennis Так, вибач, я забув. Дякую за редагування
Луїс Мендо

Відповіді:


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

The 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. Завершує всі тестові справи за секунду. Спробуйте в Інтернеті!


Чи є причина, чому ви зміщуєте праймес верхню межу, 3а не, наприклад, на 2? Крім того, чи є спосіб розширити його, щоб він працював 0на введення коротше ...=r>0?r:3(n+9)\s?
Чарлі

3був трохи швидше, ніж 2у моїх тестах, і не збільшував кількість байтів. Для введення 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
Чи можете ви довести, що це працює?
Leaky Nun

@LeakyNun О так, це правда, технічно це працює лише для тестових випадків, але це може бути не знайдено в перших n прайме.
миль

Це не працює при n = 1, оскільки перший прайм - 2, і вам потрібно перші п’ять простих, щоб отримати перше виникнення 1.
миль

1

PowerShell v2 +, 90 байт

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

Поєднує логіку мого знаходження числа в постійній відповіді Шамперновна , поєднаному з методом основного покоління моєї друку n-го простих, що містить n відповіді, а потім віднімає 2для відповідного виведення індексу (тобто, не рахуючи0. початку).

Вводиться як рядок. Виявляє той 999приблизно через сім секунд на моїй машині, але той, що 33308знаходиться дещо довше ( редагувати - я відмовився через 90 хвилин ). Теоретично повинен працювати для будь-якого значення до індексу [Int32]::Maxvalueaka 2147483647, оскільки це максимальна довжина рядків .NET. Однак, швидше за все, проблеми з пам’яттю трапляться задовго до того, як це станеться.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.