Пи получил твой номер


30

Вызов :

Пи должен быть бесконечным. Это означает, что каждое число содержится внутри десятичной части числа pi. Ваша задача будет взять положительное целое число на входе и вернуть позицию этого числа в пи цифрах на выходе.

Например, если ввод 59, мы вернемся4

И вот почему: мы будем искать число 59в цифрах числа пи

3.14159265...
     ^^

Значение начинается с 4-й цифры, поэтому вывод будет 4.

Некоторые другие примеры:

input : 1      output : 1
input : 65     output : 7
input : 93993  output : 42
input : 3      output : 9

Правила:

  • Вам не нужно обрабатывать цифры, которых не существует в первых 200 цифрах
  • Стандартные лазейки, как всегда, запрещены.
  • Это , поэтому побеждает меньше байтов.

41
Числа с указанным вами свойством известны как нормальные числа . Бесконечное десятичное разложение, даже если оно непериодическое, не подразумевает нормальности. 0.101001000100001 ... контрпример.
— Деннис

38
И, безусловно, Пи не должен быть бесконечным. Это десятичное представление, однако, имеет бесконечные цифры.
— rafa11111

11
@Dennis Normal - гораздо более сильное условие (единообразный против все-существующего)
— user202729

6
Разрешено ли выводить nиндекс с индексом 0? Таким образом, текстовые случаи будут возвращаться 0, 6, 41, 8вместо 1, 7, 42, 9.
— Кевин Круйссен

7
@ rafa11111 Я согласен. Мы должны отказаться от целых чисел и использовать числа в base-PI. Тогда целые числа будут иметь бесконечные цифры.
— mbomb007

Ответы:


22

Python 2, 69 75 71 67 байт

Сохранено 4 байта из-за caird .

x=p=1333
while~-p:x=p/2*x/p+2*10**200;p-=2
print`x`.find(input(),1)

Не найдя 3на нулевой позиции стоимость 6 2 байта. Ввод дан в виде строки.

Попробуйте онлайн!


Неограниченная версия

Python 2, 224 байта

def g():
 q,r,t,i,j=1,0,1,0,1
 while True:
  i+=1;j+=2;q,r,t=q*i,(2*q+r)*j,t*j;n=(q+r)/t
  if n*t>4*q+r-t:yield n;q,r=10*q,10*(r-n*t)
a=input()
l=len(`a`)
s=z=10**l;i=1-l
p=g().next;p()
while s!=a:s=(s*10+p())%z;i+=1
print i

Использование неограниченного патрубка по той же формуле, что и выше.

Попробуйте онлайн!


Быстрая версия

from gmpy2 import mpz
def g():
  # Ramanujan 39, multi-digit
  q, r, s ,t = mpz(0), mpz(3528), mpz(1), mpz(0)
  i = 1
  z = mpz(10)**3511
  while True:
    n = (q+r)/(s+t)
    if n == (22583*i*q+r)/(22583*i*s+t):
      for d in digits(n, i>597 and 3511 or 1): yield d
      q, r = z*(q-n*s), z*(r-n*t)
    u, v, x = mpz(1), mpz(0), mpz(1)
    for k in range(596):
      c, d, f = i*(i*(i*32-48)+22)-3, 21460*i-20337, -i*i*i*24893568
      u, v, x = u*c, (u*d+v)*f, x*f
      i += 1
    q, r, s, t = q*u, q*v+r*x, s*u, s*v+t*x

def digits(x, n):
  o = []
  for k in range(n):
    x, r = divmod(x, 10)
    o.append(r)
  return reversed(o)

a=input()
l=len(`a`)
s=z=10**l;i=1-l
p=g().next;p()
while s!=a:s=(s*10+p())%z;i+=1
print i

Гораздо более быстрый неограниченный патрубок, основанный на Рамануджане № 39 .

Попробуйте онлайн!




2
@Dennis 31 должен соответствовать в 137: /
— primo

2
Какой алгоритм приближения это? Это один из перечисленных здесь? ru.wikipedia.org/wiki/Approximations_of_%CF%80
— Sphinxxx

4
@Sphinxxx - это результат применения преобразования Эйлера к ряду Лейбница. Я разместил вывод в предыдущем посте .
— Примо

19

Шелуха , 5 байт

€tİπd

Попробуйте онлайн!

объяснение

€tİπd                              59
    d  Convert to base-10 digits   [5,9]
  İπ     The digits of pi          [3,1,4,1,5,9..]
 t       Remove the first element  [1,4,1,5,9,2..]
€      Index of the sublist        4

1
Смешно - но я должен признать, что впечатлен.
— Floris

6
Для языков игры в гольф, как правило, полезно добавить объяснение, поскольку тот, кто не знает языка, не сможет его прочитать. Если я правильно понимаю, это: Возьмите индекс ( €) с первым удаленным элементом (первые 3) ( t) из цифр PI ( İπ), преобразуйте его в base-10 ( d) и выведите в STDOUT (неявно).
— Кевин Круйссен,

Согласился, понятия не имею, на что смотрю.
— А.А. Терроба

1
@gggg выглядит как пример ленивого представления , проверка
— только ASCII

1
@gggg İπ- это бесконечный список цифр, созданный с неограниченным источником
— H.PWiz

18

Excel, 212 байт

=FIND(A1,"14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196")

Excel обрабатывает только 15 знаков после запятой, поэтому пи просто жестко запрограммирован. Это должно быть довольно слабой верхней границей для этой задачи.


4
Мне жаль комментировать мой собственный пост, но могут ли некоторые из пользователей сказать мне, почему им нравится этот ответ? Это игра в гольф, как это может быть в формуле Excel, но она очень длинная и совсем не умная.
— Инженер Тост

6
Мне это нравится, потому что он не опирается на языки игры в гольф, которые имеют встроенные функции для вычисления числа Пи до произвольного десятичного знака. Это может быть не креативно, но практично (здесь не важна практичность).
— Скотт

Поскольку вопрос не определяет , что входной или ответ должен быть базой 10, вы могли бы гольф это, используя CONCATи формулу ББПА для вычисления первых 200 цифр пи-base16 и поиска в шестнадцатеричном вместо этого? (У меня нет 365, поэтому не могу проверить)
— Хроноцидный

2
Только в Office 365: я использовал CONCAT, CODEи MIDя сократил строку PI с 202 символов (включая кавычки) до 143:CONCAT(CODE(MID(".ÜÁ£ÙÏ ¦®š«¦ Ï²œÔ“ÇŧÝËŠº”ᱬ»—‡ÑÀ†œ¾ˆãÖœƒ°™¢•‘†ÏÒŽÐÖ³ ÒžÂ¯‰¦¬¼ß²º–ŸÈµ»¨Ñœ°‹‘­‚ÔŠ›ÝÕ•Š·»À®–Þٶ݃Ñà",2*ROW(A1:A100)-1,2))-32)
— Chronocidal

1
Тестирование с Office365, похоже, что он выводит 14 независимо от ввода?
— Мэтью Шлахтер

9

Java 8, 615 217 202 184 182 166 165 байтов (вычислено 999 200 цифр)

n->{var t=java.math.BigInteger.TEN.pow(200);var r=t;for(int p=667;p-->1;)r=t.valueOf(p).multiply(r).divide(t.valueOf(p-~p)).add(t).add(t);return(r+"").indexOf(n,1);}

1-индексированных

Попробуйте онлайн.

Встроенная в Java Math.PIточность 15 десятичных значений, как и во многих других языках. Чтобы иметь больше цифр, вам придется вычислять их самостоятельно с помощью BigIntegersили BigDecimals. Это выше, способ сделать это .. Может быть, кто-то может сыграть в гольф ниже 211 байт, смеется.
РЕДАКТИРОВАТЬ: Создал порт ответа @primo Python 2 (убедитесь, что его голосовать!), Так что расчет будет короче, чем трудно закодирован уже не так надуманно Всего 7 байтов в гольфе, чтобы он был короче.

-15 байтов благодаря @Neil , что делает его короче, чем жестко закодированный ответ ниже!
-36 байт благодаря @primo .
-1 байт меняется java.math.BigInteger t=null,T=t.TEN.pow(200),r=T;на var T=java.math.BigInteger.TEN.pow(200);var r=T;, потому что varна 1 байт короче null(должен любить новую Java 10).

Объяснение:

n->{                            // Method with String parameter and integer return-type
  var t=java.math.BigInteger.TEN.pow(200);
                                //  Temp BigInteger with value 10^200
  var r=t;                      //  Result BigInteger, also starting at 10^200
  for(int p=667;                //  Index-integer, starting at 667
      p-->1;)                   //  Loop as long as this integer is still larger than 1
                                //  (decreasing `p` by 1 before every iteration with `p--`)
    r=                          //   Replace the Result BigInteger with:
      t.valueOf(p)              //    `p`
       .multiply(r)             //    multiplied by `r`,
       .divide(t.valueOf(p-~p)) //    divided by `2*p+1`
       .add(t).add(t);          //    And add 2*10^200
  return(r+"")                  //  Convert the BigInteger to a String
    .indexOf(n,                 //  And return the index of the input,
               1);}             //  skipping the 3 before the comma

Java 8, 211 байт (жестко запрограммированные 200 цифр)

"14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196"::indexOf

0 индексированные

Попробуйте онлайн.


1
!p.equals(t.ONE)возможно? Также indexOf(n,1)-1работает, я думаю. Или сохраните 2 байта и сделайте его 1-проиндексированным.
— Нейл

Не уверен, как я пропустил первое, но второе мне действительно нужно запомнить. Не знал, что есть indexOfметод, который пропускает первые mсимволы. ТИЛ, спасибо!
— Кевин Круйссен


1
Вы также можете уменьшить pна единицу каждый раз ( for(int p=667;p-->1;)), а затем умножить на pи разделить на p-~p.
— Примо

1
Начальное значение rможет буквально быть чем угодно, хотя крайние значения потребуют большего количества итераций. Лучшее семя (наименьшее количество итераций) на самом деле 4e200.
— Примо

6

05AB1E , 6 байтов

₁žs¦¹k

Попробуйте онлайн!

Как?

₁        push 256
 žs      push pi to 256 places
   ¦     remove the leading 3
    ¹    push the input
     k   index inside that string

Если я получу аналогичное 6-байтовое решение на том же языке, я удалю после вас мой ответ?
— nicael

@nicael обычно это не имеет значения, но ваше решение 3все равно не сработает
— Уриэль

О, действительно, спасибо
— Nicael

6

MATL , 16 15 байт

YP8WY$4L)jXfX<q

Попробуйте онлайн!

объяснение

YP     % Push pi as a double
8W     % Push 2^8, that is, 256
Y$     % Compute pi with 256 significant digits using variable-precision arithmetic
       % The result as a string
4L)    % Remove first character. This is to avoid finding '3' in the integer part
       % of pi
j      % Push input as a string
Xf     % Strfind: gives array of indices of occurrences of the input string in the
       % pi string
X<     % Mimimum
q      % Subtract 1. Implicitly display

Очень красиво и коротко! Можете ли вы объяснить, как это работает?
— Случайный парень

@Therandomguy Конечно, объяснение добавлено
— Луис Мендо

4

R + пакет номеров, 52 байта

regexec(scan(),substring(numbers::dropletPi(200),3))

Попробуйте онлайн!

dropletPiвычисляет первые 200 десятичных цифр, piно включает 3.в начале символ a , поэтому мы удаляем его с помощью, substringа затем сопоставляем regexec, что возвращает индекс совпадения вместе с некоторыми метаданными о совпадении.


Может быть regexpr(scan(),numbers::dropletPi(200))-2?
— Джурио

@djhurio, который не работает, потому что мы должны сопоставлять цифры после десятичной точки. Это была моя первая мысль, но этот случай разрушает ее. Может быть "if"?
— Джузеппе

Я не вижу здесь проблемы. Не входные данные будут содержать 3.(я предполагаю, что мы имеем дело с целыми числами, а не с реальными числами на входе). Тестовые примеры работают с этим.
— Джурио

3
@djhurio верно, но regexpr(3,numbers::dropletPi(200))-2возвращается, -1 когда он должен вернуться 9, попробуйте
— Giuseppe

3

Желе , 23 байта

⁵*⁹Ḥ;ȷḊ+J$¤×⁹:2¤:ɗ\SṾḊw

Монадическая ссылка, принимающая список символов (целое число для поиска) и возвращающая индекс. Работает для входных данных, содержащихся в первых 252 цифрах десятичной части числа π.

Попробуйте онлайн!

Как?

При этом используется формула Лейбница для π для вычисления первых 253 цифр, включая начальную 3(плюс четыре завершающих неверных цифры). Затем ведущий 3отбрасывается, и указывается входной индекс:

⁵*⁹Ḥ;ȷḊ+J$¤×⁹:2¤:ɗ\SṾḊw - Link: list of characters
⁵                       - literal ten
  ⁹                     - literal 256
 *                      - exponentiate = 10000...0 (256 zeros)
   Ḥ                    - double       = 20000...0
          ¤             - nilad followed by links as a nilad:
     ȷ                  -   literal 1000
      Ḋ                 -   dequeue -> [2,3,4,5,...,1000]
         $              -   last two links as a monad:
        J               -     range of length -> [1,2,3,4,...,999]
       +                -     addition (vectorises) -> [3,5,7,9,...,1999]
    ;                   -   concatenate -> [20000...0,3,5,7,9,...,1999]
                  \     - cumulative reduce with:
                 ɗ      -   last three links as a dyad:
               ¤        -     nilad followed by link(s) as a nilad:
            ⁹           -       chain's right argument (the right of the pair as we traverse the pairs in the list -- 3, 5, 7, 9, ...)
              2         -       literal two
             :          -       integer division (i.e. 1, 2, 3, ...)
           ×            -     multiply (the left of the pair, the "current value", by that)
                :       -   integer divide by the right argument (i.e. 3, 5, 7, 9, ...)
                   S    - sum up the values (i.e. 20000...0 + 66666...6 + 26666...6 + 11428...2 + ... + 0)
                    Ṿ   - un-evaluate (makes the integer become a list of characters)
                     Ḋ  - dequeue (drop the '3')
                      w - first (1-based) index of sublist matching the input

Если вы предпочитаете список цифр в качестве входных данных ⁵*⁹Ḥ;ȷḊ+J$¤×⁹:2¤:ɗ\SDḊw(также 23), тогда как если вы действительно хотите дать ему целочисленное использование ⁵*⁹Ḥ;ȷḊ+J$¤×⁹:2¤:ɗ\SDḊwD(для 24).


Вы имеете в виду преобразование Эйлера, примененное к формуле Лейбница. Вычисление 252 цифр по формуле Лейбница заняло бы чуть больше времени, чем большинство людей хотели бы ждать.
— Прим

Да, это заняло бы много времени в необработанном виде (я все еще "использую формулу Лейбница", я верю!)
— Джонатан Аллан

3

BASH (GNU / Linux), 75 67 66 байт

Благодаря Софии Лечнер сэкономил 1 байт, а благодаря шарлатанству Коровы - 7 байт.

a=`bc -l<<<"scale=999;4*a(1)"|tail -c+2|grep -ob $1`;echo ${a%%:*}

Это сценарий оболочки, который принимает один аргумент, который является числом. Тест с

$ bash <script-path> 59
4

Этот скрипт сначала выполняет конвейер из трех команд:

bc -l<<<"scale=999;4*a(1)"|    #produce pi with its first 999 fractional digits
tail -c+2|                     #cut off the "3."
grep -ob $1                    #compute the byte offsets of our argument in the string

Результат этого конвейера присваивается переменной оболочки a, которая затем выводится с чем угодно, кроме первого удаленного числа:

a=`...`;         #assign the result of the pipeline to a variable
echo ${a%%:*}    #cleave off the first : character and anything following it

К сожалению, bcимеет тенденцию разрывать выходные строки, когда они становятся слишком длинными. Это может привести к неверным результатам, если найденное число находится не в первой строке. Вы можете избежать этого, установив переменную окружения BC_LINE_LENGTH:

export BC_LINE_LENGTH=0

Это полностью отключает функцию разрыва строки.


Очевидно, что последние две команды могут быть опущены, если допускается другой вывод.
Это дает счет 48 байтов :

bc -l<<<"scale=999;4*a(1)"|tail -c+2|grep -ob $1

С полученным результатом:

$ bash <script-path> 59
4:59
61:59
143:59
179:59
213:59
355:59
413:59
415:59
731:59
782:59
799:59
806:59
901:59
923:59
940:59
987:59

Ницца! Вам не нужно это пространство между -lи <<<хотя.
— София Лехнер

Вы можете преобразовать в программу и использовать sed, чтобы сохранить несколько байтов, попробуйте онлайн!
— Критиси Литос

@ Cowsquack Разве мне не нужно включать строку байтов в число байтов?
— Мастер

Линии @cmaster shebang не учитываются при подсчете байтов ни для каких языков
— Kritixi Lithos,

@ Cowsquack Спасибо за предложение. Тем не менее, если вы разрешите дополнительный вывод, вы также можете не sedуказывать (см. Вторую часть моего ответа). Тем не менее, преобразование в программу дало мне 7 байтов, так что спасибо за это! Я также заменил tr/ headcombo на магическую переменную оболочки, чтобы сохранить еще один байт.
— cmaster

2

JavaScript, 197 187

-10: Спасибо, Нил !

x=>"50ood0hab15bq91k1j9wo6o2iro3by0h94bg3geu0dnnq5tcxz7lk62855h72el61sx7vzsm1thzibtd23br5tr3xu7wsekkpup10cek737o1gcr6t00p3qpccozbq0bfdtfmgk".replace(/.{9}/g,a=>parseInt(a,36)).search(x)+1

Принимает последовательность из девятизначных целых чисел с основанием 36, преобразует их в основание 10 и объединяет их для создания первых 200 цифр числа Пи.


Хорошо, вы провалили мои попытки кодирования данных из воды, ваш подход экономит 38 байтов на необработанных данных.
— Нить

+1 - я собирался опубликовать точно такой же подход.
— darrylyeo

Используйте x=>'50...'.replace(/.{9}/g,a=>parseInt(a,36)).search(x)+1для сохранения 10 байтов.
— Нил

2

Первый раз занимаюсь гольфом. Используйте делегаты и лямбда-выражения, чтобы уменьшить количество вызовов функций. V2 сокращает имя класса до одного байта.

[C #], 361 355 байт

using System;class P{static void Main(){Func<string,int>F=f=>"14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196".IndexOf(f)+1;Action<int>w=Console.WriteLine;w(F("1"));w(F("65"));w(F("93993"));w(F("3"));}}

Отформатированная версия:

using System;

class P
{
    static void Main()
    {
        Func<string,int>F=f=>"14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196".IndexOf(f)+1;
        Action<int>w=Console.WriteLine;
        w(F("1"));
        w(F("65"));
        w(F("93993"));
        w(F("3"));
    }
}

Ideone!

NB.Я пропустил первую версию. Это было 361 байт, а не 363 байт.

[C #], tio версия 218 байт

f=>"14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196".IndexOf(f)+1

Попробуйте онлайн!


Вам не нужно включать тестовые сценарии в ваш код, и вы можете просто использовать лямбда-функцию (анонимную) вместо полной программы
— Zac Faragher

Hyarus предлагается using System;f=>"14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196".IndexOf(f)+1;в качестве правки.
— овс

Я новичок здесь, и я подумал, что должен включить полную программу, включая контрольный пример. Кажется, что люди используют tio.run для демонстрации вместо ideone. Я вижу, что tio.run делит код на части.
— Хан

2

Haskell , 208 120 байтов

a=1333
x=tail$show$foldr(\p x->p`div`2*x`div`p+2*10^200)a[3,5..a]
x!n|take(length n)x==n=0|1<2=1+tail x!n
f n=1+x!show n

Попробуйте онлайн!

Большое спасибо Джонатану Аллану за его предложения!

Старая версия (208 байт)

(+1).((tail$g(1,0,1,1,3,3))!)
g(q,r,t,k,n,l)=([n:g(10*q,10*(r-n*t),t,k,div(10*(3*q+r))t-10*n,l)|4*q+r-t<n*t]++[g(q*k,(2*q+r)*l,t*l,k+1,div(q*(7*k+2)+r*l)(t*l),l+2)])!!0
x!n|take(length n)x==n=0|1<2=1+tail x!n

Я на самом деле не знаю, как работает код выше; Я взял это из этой статьи, и все, что я реализовал, это часть поиска. g(1,0,1,1,3,3)возвращает цифры числа pi и удивительно эффективен (он вычисляет 10 000 цифр на tio.run менее чем за 4 секунды).

Входные данные представляют собой список, состоящий из цифр числа, которое будет найдено.

Попробуйте онлайн!


Я предполагаю, что формула Лейбница будет намного короче.
— Джонатан Аллан

@JonathanAllan Спасибо! Я дам ему попробовать. Я очень люблю этот сайт! Я так много узнал от вас, ребята! :)
— Кристиан Лупаску

@JonathanAllan Я пытался аппроксимировать пи, используя l=4*sum[((-1)**x/(2*x+1))|x<-[0..1e6]], но для запуска требуется 5 с, а 7-я цифра уже неверна. Таким образом, может оказаться невозможным вычислить 200 цифр. В любом случае, это было интересное упражнение, так что спасибо!
— Кристиан Лупаску

1
Вы бы хотели использовать преобразование Эйлера (см. Мой ответ на Jelly или ответ на языке Python для primo)
— Джонатан Аллан

1
Что касается статьи, на которую вы ссылаетесь, вас может заинтересовать этот пост , в котором я повторно реализую код, найденный в этой статье, без «преднамеренного запутывания». Это также немного проще (короче) в результате. См. Метод g1_refв разделе « Быстрые неограниченные генераторы» . Код является питоном.
— Примо

2

Haskell, 230 байт

Использование лени, чтобы найти номер где-нибудь в бесконечных цифрах числа Пи, а не только в первых 200 цифрах. Ах да, и он возвращает вам каждый (бесконечно много?) Экземпляров номера, а не только первый.

p=g(1,0,1,1,3,3)where g(q,r,t,k,n,l)=if 4*q+r-t<n*t then n:g(10*q,10*(r-n*t),t,k,div(10*(3*q+r))t-10*n,l) else g(q*k,(2*q+r)*l,t*l,k+1,div(q*(7*k+2)+r*l)(t*l),l+2)
z n=[(i,take n$drop i p)|i<-[1..]]
f l=[n|(n,m)<-z$length l,m==l]

Примеры из задачи

>  take 10 $ f [1]
[1,3,37,40,49,68,94,95,103,110]
>  take 10 $ f [6,5]
[7,108,212,239,378,410,514,672,870,1013]
>  take 1 $ f [9,3,9,9,3]
[42]
>  take 10 $ f [3]
[9,15,17,24,25,27,43,46,64,86]

кредиты

'p' - это бесконечный поток цифр пи, взятый из https://rosettacode.org/wiki/Pi#Haskell

> take 20 p
[3,1,4,1,5,9,2,6,5,3,5,8,9,7,9,3,2,3,8,4]

Я думаю, вы уже знаете это, но вам нужно вывести только первое число в вашей последовательности ...
— Timtech

Просто думал, что
— приму

2

SmileBASIC, 179 164 байта

INPUT I$FOR I=0TO 103Q$=Q$+STR$(ASC("\A#YO &.+& O2TGE']KiRa1,;N(>VYb>P0*uCb0V3 RB/]T._2:H5;(Q0oJ2)&4n7;@.^Y6]&"[I]))NEXT?INSTR(Q$,I$)+1

Цифры пи жестко закодированы и упакованы в значения символов ascii. 14 -> CHR$(14), 15 -> CHR$(15), 92 -> \, 65 -> A, 35 -> #.

Строка содержит непечатаемые символы, поэтому здесь представлены байты, записанные в шестнадцатеричном формате: 0E 0F 5C 41 23 59 4F 20 26 2E 1A 2B 26 20 4F 32 1C 54 13 47 45 27 5D 4B 69 52 00 61 31 2C 3B 17 00 4E 10 28 3E 56 14 59 62 3E 50 03 30 19 03 2A 75 00 43 62 15 30 00 56 33 20 52 1E 42 2F 00 5D 54 2E 00 5F 32 3A 16 1F 48 35 3B 28 51 1C 30 6F 4A 32 1C 29 00 1B 00 13 26 34 6E 37 3B 40 2E 16 5E 59 36 5D 00 26 13 06

В десятичном виде вы можете увидеть цифры числа пи: 14 15 92 65 35 89 79 32 38 46 26 43 38 32 79 50 28 84 19 71 69 39 93 75 105 82 0 97 49 44 59 23 0 78 16 40 62 86 20 89 98 62 80 3 48 25 3 42 117 0 67 98 21 48 0 86 51 32 82 30 66 47 0 93 84 46 0 95 50 58 22 31 72 53 59 40 81 28 48 111 74 50 28 41 0 27 0 19 38 52 110 55 59 64 46 22 94 89 54 93 0 38 19 6


Если вы разместите полный код, вам будет проще проверить ваш ответ.
— Прим

1
Я не могу опубликовать это, потому что есть недопустимые символы, которые удалены / не отображаются. Я думаю, что я могу опубликовать коды ASCII, хотя.
— 12Me21

Вы можете опубликовать hexdump, используя, например, xxd.
— Натаниэль

2

Рубин , 37 35 байт

p"#{BigMath::PI 200}"[3..-3]=~/#$_/

Попробуйте онлайн!

Ничего особенного, просто демонстрация встроенной библиотеки. Вывод 0 проиндексирован. Строка Pi отформатирована как 0.31415...e1, поэтому нам нужно убрать первые 3 символа. e1Часть в конце концов , на самом деле не причинит никакого вреда, но он снял тоже, как нам нужно в любом случае , чтобы обеспечить конечный диапазон (или длину среза) значение.


коротко и читабельно!
— PJS

2

Древесный уголь , 27 15 байт

I⊖∨⌕I▷N⟦≕Piφ⟧θχ

Попробуйте онлайн! Ссылка на подробную версию кода. Работает почти до 1000 цифр. Объяснение:

        ≕Pi     Get variable `Pi`
           φ    Predefined variable 1000
     ▷N⟦    ⟧   Evaluate variable to specified precision
    I           Cast to string
             θ  First input
   ⌕            Find
              χ Predefined variable 10
   ∨             Logical OR
  ⊖              Decrement
 I               Cast to string
                 Implicitly print

исправлено 13 байт . примечание стороны: это кажется очень обманчивым: P
— ASCII-only

фактически исправлено, 13 байтов . использует неявный ввод. (не предполагаемое поведение, но оно кажется более полезным, чем любой другой способ). также не могли бы вы дать ссылку на пример ошибки заполнения?
— Только для ASCII

@ ASCII-only Заполнить странность - почему курсор оказывается там?
— Нил

: | о, я понятия не имею, что я должен исправить это как можно скорее
— только ASCII

Н.В.М. Я идиот , преданный делу.
— Только для ASCII,

2

Japt , 186 177 байт

`nqnrvosrpruvtvpopuqsosqppÕÝvr¶uuqnvtnsvpvvptrnmruomvtqvqqrvopmÉæqÛàÑ$vvÔàmpqupqm¡vuqum«rnpopmssqtmvpuqqsmvrrmruoopÌÊprvqÛ$uqunnqr¶uqn¶tmnvpÔnmrrrvsqqsoovquvrqvpmpunvs`®c -#mÃbU

Поскольку Japt разделяет 15-значное ограничение Pi в Javascript и shoco , кодировка, используемая Japt, не кодирует числа, некоторые махинации требуются для сжатия.

Кратко объясним, начало - строка ниже в закодированной форме:

"nqnrvosrpruvtvpopuqsosqppupotvrmouuqnvtnsvpvvptrnmruomvtqvqqrvopmtunsqmsousomuvvusoumpquorpqonntmstvuonqumusrnpouopmssqtmvpuqqsmvrrmruoopntorprvqmunouqunnntqrmouqnmotmnvpuronnmrrrvsqqsoovquvrqvpmpunvs"

Который является строкой, где каждая буква 'm' + corresponding digit of pi. Я проверил весь алфавит, и эта буква дает лучшее сжатие на несколько байтов.

Обратные метки говорят Japt, чтобы расшифровать строку. Все остальное довольно просто:

®c -#mÃbU
®          // Given the above string, map each letter
 c         // and return its charcode
   -#m     // minus the charcode of 'm', 109.
      Ã    // When that's done,
        bU // find the index of the implicit input U.

Выводит индекс на основе 0 соответствующего фрагмента.
Побрил еще два байта благодаря Оливеру .

Попробуйте онлайн!


1
Умная идея! Вы можете заменить £Xна ®и } сÃ
— Оливер

@ Оливер Большое спасибо за это, я все еще учу Джапта, поэтому вся помощь очень ценится.
— Нить

1
Вы отлично справляетесь до сих пор! Мне было любопытно посмотреть, было ли лучшее смещение, чем 109. Я сделал брутфорсер , и оказалось, что 109 является оптимальным. Отлично сделано :)
— Оливер

@Oliver Спасибо за это, я просто попробовал весь диапазон az вручную, так как это не было слишком много работы. : P
— Nit

1

AWK -M, 131 119 117 байт

Использует -Mфлаг для вычислений произвольной точности. Добавлено p=k=0(5 байт) к ссылке TIO, чтобы разрешить многострочный ввод

{CONVFMT="%.999f";PREC=1e3;for(p=k=0;k<1e3;)p+=(4/(8*k+1)-2/(8*k+4)-1/(8*k+5)-1/(8*k+6))/16^k++;$0=$1==3?9:index(p,$1)-2}1

Попробуйте онлайн!

Объяснение:

{CONVFMT="%.999f";  # Allows 999 decimal digits to be used when numbers are convert to strings
PREC=1e3;           # Digits of precision to use for calculations
for(;k<1e3;)p+=(4/(8*k+1)-2/(8*k+4)-1/(8*k+5)-1/(8*k+6))/16^k++; # The most concise numerical calculation I could find. It doesn't converge  extremely rapidly, but it seems to work OK
$0=$1==3?9:index(p,$1)-2}  # Replace input line with either 9 or index-2
                           # since indices will either be 1 (meaning 3 was input) or >= 3
1                   # Print the "new" input line

Моя первая попытка sprintfполучить десятичные дроби. Использование CONVFMTопределенно чище.
— Роберт Бенсон


Хорошо знать. Я полагаю, что мне следует больше времени уделять мета ... свободному времени. :)
— Роберт Бенсон

1

Желе , 24 байта

ȷ*
ȷR×¢:Ḥ‘$ƲU×:¢+¢ʋ/ḤṾḊw

Попробуйте онлайн!

Используйте мачиноподобную формулу , а именно 1/4 pi == tan -1 (1/2) + tan -1 (1/3).

Используйте формулу pi / 2 == 1 + 1/3 × (1 + 2/5 × (1 + 3/7 × (1 + 4/9 × (...))))


Есть ли способ получить цифры из ØPM?
— Дилнан

@ Dylnan В некотором смысле , но М - не желе.
— user202729

Я знаю, что они разные. Не могу поверить, что я не думал floor. Имейте в виду, если я использую это, чтобы отправить как ответ в М?
— Дилнан,

Не берите в голову. Не работает выше 104 цифр ...
— dylnan

1

Python 2 239 238 229 214 байт

-9 байт из-за @primo

from bigfloat import*;a=s=n=10**10**5;b=k=0
while a:k+=1;a*=k*(k*(108-72*k)-46)+5;a/=k**3*(640320**3/24);s+=a;b+=k*a
with precision(10**7):print`(426880*sqrt(10005*n)*n)/(13591409*s+545140134*b)`.find(input())-16

ИСПОЛЬЗУЕТ Чудновский-Ramanujan алгоритма для нахождения первой 1 миллиона цифры от 50000 цифр n (изменения 10**10**5в 10**10**6течение более, но он принимает возрасты , чтобы бежать) , а затем ищут в них нужной строке.


Я пытался подтвердить результат, но он не заканчивается ( n=10**10**5занимает около 10 секунд).
— Прим

@ primo Я никогда не говорил, что это быстро! 10**10**6занимает около 7 минут на моей машине .. Чтобы быть честным, 10**10**5дает первые 50000 цифр, так что я думаю, что это не так уж и плохо :)
— DividedByZero

@primo Я изменил библиотеку произвольной точности на bigfloat, теперь она работает намного быстрее.
— DividedByZero

Сейчас это намного быстрее, я собирался предложить переключиться на него gmpy2, но bigfloatэкономит дюжину или около того байтов. Назначение kможно объединить, k=b=0если вы перейдете k+=1к началу итерации. -(6*k-5)*(2*k-1)*(6*k-1)может быть написано более кратко, как k*(k*(108-72*k)-46)+5. Если вы объявляете Python 2, //целочисленные деления можно заменить на /, а также скобки не нужны print. Пространство также может быть удалено в import*. Подтверждает только до 50000 цифр, кстати.
— прима

nВ , sqrt(10005*n)кажется, проблема; он перемещает десятичную точку на 50000-е место. Если вам интересно, вот моя собственная реализация Чудновского: попробуйте онлайн!
— прима

1

Visual Basic - 114 байт

Хорошо, первая подача. Полегче со мной!

    Dim s,p As String
    s=Console.Readline()
    p=Math.PI
    Console.Write((p.IndexOf(s,2)-1))

Обратная связь приветствуется!

Я не ограничился первыми 256 частями PI, так как в вопросе написано «Вы не должны», а не «Вы не должны». Надеюсь, я делаю это правильно :)


Я не очень разбираюсь в virtual basic, но, думаю, вы можете сэкономить несколько байтов, удалив все пробелы. Вы также должны иметь возможность хранить свой код в функции и возвращать значение вместо «console.log» (я думаю, вы получите несколько таких байтов). О, и вы должны ввести значение, а не жестко его кодировать.
— Случайный парень

Спасибо. Удалены пробелы и удалено жестко закодированное значение в пользу ввода. Увеличивает счет до 114! Будет ли функция возврата значения не включена в число байтов? Я предполагаю, что это сделало бы это дольше, если так.
— user9338709

Добро пожаловать на сайт! Похоже, что это работает ( попробуйте онлайн! ), Но похоже, что это фрагмент кода, и представления должны быть либо полной программой, либо функцией.
— Дом Гастингс

Нечто подобное может сработать, но, возможно, есть лучшие способы сделать это! Проверьте меню ссылок в верхней части этой страницы для шаблона, который используют многие материалы!
— Дом Гастингс

На самом деле, похоже, что константа не имеет 200 цифр :( Попробуйте онлайн! - это должно вернуть 197.
— Dom Hastings

0

Javascript 217 байт (200 в жестком коде)

a=>"14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196".search(a)+1

0

PHP, 27 байт

Не очень серьезный ответ, он требует изменения настроек php.ini, так как по умолчанию pi () - 14 цифр, а не 200, но на этот раз решение PHP довольно элегантно:

<?=strpos(pi(),$_GET[n])-1;

Я не думаю, что это на самом деле будет работать. precisionтег в php.ini только изменяет точность отображения, и фактически не увеличивает точность определенных констант. свидетель
— прим

0

Юлия 0.6 , 53 байта

setprecision(9^6)
x->searchindex("$(big(π))","$x",3)

Установите точность для BigFloats достаточно высокой, затем конвертируйте piв строку и выполните поиск. Точность 9^6ручек 159980 цифр.

Попробуйте онлайн!



0

Perl 5 с -MMath::BigFloat+bpiа -n, 20 байтов

bpi($>)=~/.$_/;say@-

Попробуйте онлайн!

Я не уверен, где используется $>стенды, так как он не EFFECTIVE_USER_IDявляется переносимым, но на TIO это 1000 и соответствует нашему требованию, для -1 байт против 200.


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