Найти числа в константе Копеланда – Эрде


17

Фон

Константа Коупленда – Эрде является конкатенацией «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


Итак, каков критерий победы?
user8397947

Принимая во внимание подробные правила, касающиеся ввода / вывода, я собираюсь предположить, что это код гольф и применить тег. Я надеюсь, что это то, что вы имели в виду.
Деннис

@ Денис Да, извини, я забыл. Спасибо за редактирование
Луис Мендо

Ответы:


6

05AB1E , 14 байтов

Использует 0-индексированный вывод . Основные функции в Осабие очень неэффективны. Код:

[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 индекс. Завершает все тестовые случаи менее чем за секунду. Попробуйте онлайн!


Есть ли причина, по которой вы сдвигаете верхнюю границу простых чисел, 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
Можете ли вы доказать, что это работает?
Утренняя монахиня

@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

Объединяет логику my Find the number в константном ответе Champernowne , в сочетании с методом генерации простых чисел my Print nth prime, который содержит n ответов, затем вычитает, 2чтобы вывести индекс соответствующим образом (т. Е. Не считая 0.в начале).

Принимает ввод в виде строки. Находит 999один примерно через семь секунд на моей машине, но 33308один немного дольше ( редактировать - я сдался через 90 минут ). В случае , если теоретически работа для любого значения индекса до [Int32]::Maxvalueака 2147483647, а это длина максимум .NET строки. Однако, вероятно, возникнут проблемы с памятью задолго до того, как это произойдет.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.