Pi hat deine Nummer


30

Herausforderung :

Pi soll unendlich sein. Das bedeutet, dass jede Zahl im Dezimalteil von pi enthalten ist. Ihre Aufgabe wird es sein, bei der Eingabe eine positive Ganzzahl zu verwenden und die Position dieser Zahl in pi-Ziffern bei der Ausgabe zurückzugeben.

Wenn die Eingabe beispielsweise lautet 59, werden wir zurückkehren4

Hier ist der Grund: Wir werden nach der Zahl 59in den Ziffern von pi suchen

3.14159265...
     ^^

Der Wert beginnt bei der 4. Stelle, die Ausgabe erfolgt also 4.

Einige andere Beispiele:

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

Regeln:

  • Sie müssen keine Ziffern verarbeiten, die nicht innerhalb der ersten 200 Ziffern vorhanden sind
  • Standardlücken sind wie immer verboten.
  • Das ist , also gewinnt die geringere Bytes.

41
Nummern mit der von Ihnen angegebenen Eigenschaft werden als normale Nummern bezeichnet . Eine unendliche Dezimalerweiterung, auch wenn sie nicht periodisch ist, impliziert keine Normalität. 0.101001000100001 ... ist ein Gegenbeispiel.
Dennis

38
Und absolut, Pi soll nicht unendlich sein. Die Dezimaldarstellung hat jedoch unendlich viele Stellen.
Rafa11111

11
@ Tennis Normal ist eine viel stärkere Bedingung (all-uniform vs all-exist)
user202729

6
Dürfen wir den nIndex 0 ausgeben ? So würden die Textfälle 0, 6, 41, 8anstelle von zurückkehren 1, 7, 42, 9.
Kevin Cruijssen

7
@ rafa11111 Ich stimme zu. Wir sollten Ganzzahlen aufgeben und Zahlen in base-PI verwenden. Dann haben Ganzzahlen stattdessen unendlich viele Stellen.
mbomb007

Antworten:


22

Python 2, 69 75 71 67 Bytes

4 Bytes wegen Caird Coinheringaahing gespeichert .

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

Nicht 3auf Position Null zu finden kostet 6 2 Bytes. Die Eingabe erfolgt als String.

Probieren Sie es online!


Ungebundene Version

Python 2, 224 Bytes

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

Verwendung eines unbegrenzten Zapfens, der auf der oben verwendeten Formel basiert.

Probieren Sie es online!


Schnellere Version

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

Ein viel schnellerer, unbegrenzter Zapfen, basierend auf Ramanujan Nr. 39 .

Probieren Sie es online!


Nizza, weder Hardcodes noch integrierte verwenden (weil Python keine hat)
user202729


2
@ Tennis 31 muss um 137 passen: /
Primo

2
Welcher Approximationsalgorithmus ist das? Ist es hier aufgelistet? en.wikipedia.org/wiki/Approximations_of_%CF%80
Sphinxxx

4
@Sphinxxx Es ist das Ergebnis der Anwendung der Euler-Transformation auf die Leibniz-Reihe. Ich habe eine Ableitung in einem vorherigen Beitrag gepostet .
Primo

19

Schale , 5 Bytes

€tİπd

Probieren Sie es online!

Erläuterung

€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
Lächerlich - aber ich muss zugeben, dass ich beeindruckt bin.
Floris

6
Bei Golfsprachen ist es normalerweise eine gute Idee, eine Erklärung hinzuzufügen, da jemand, der die Sprache nicht kennt, sie nicht lesen kann. Wenn ich richtig verstehe es ist: Nehmen Sie den Index ( ) mit dem ersten Punkt (die führenden 3) entfernt ( t) der Ziffern von PI ( İπ), wandelt es in Basis-10 ( d) und die Ausgabe an STDOUT (implizit).
Kevin Cruijssen

Einverstanden, ich habe keine Ahnung, was ich sehe.
JA Terroba

1
@gggg sieht aus wie es ist eine faule Darstellung Beispiel , Überprüfung
ASCII

1
@gggg İπist eine unendliche Liste von Ziffern, mit unbeschränktem Zapfen geschaffen Quelle
H.PWiz

18

Excel, 212 Bytes

=FIND(A1,"14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196")

Excel verarbeitet nur 15 Dezimalstellen, daher ist pi nur hartcodiert. Dies sollte eine ziemlich schwache Obergrenze für diese Herausforderung sein.


4
Es tut mir leid, meinen eigenen Beitrag zu kommentieren, aber können mir einige der Upvoter sagen, warum sie diese Antwort mögen? Es ist so gut wie es in einer Excel-Formel sein kann, aber es ist sehr lang und überhaupt nicht klug.
Ingenieur Toast

6
Ich mag das, weil es nicht auf Golf-Sprachen beruht, die eingebaute haben, um pi auf eine beliebige Dezimalstelle zu berechnen. Es mag nicht kreativ sein, aber es ist praktisch (nicht, dass Praktikabilität hier von Bedeutung ist).
Scott

Da die Frage nicht an, dass die Eingabe oder Antwort hat Basis 10 sein, könnten Sie Golf dies durch den Einsatz CONCATund eine BBP Formel , die ersten 200 Stellen von π-Base16 zu berechnen und stattdessen in Hexadezimal suchen? (Ich habe kein 365, kann also nicht testen)
Chronocidal

2
Office 365 nur: mit CONCAT, CODEund MIDich reduzierte das PI - String von 202 Zeichen (inkl Anführungszeichen) bis 143:CONCAT(CODE(MID(".ÜÁ£ÙÏ ¦®š«¦ Ï²œÔ“ÇŧÝËŠº”ᱬ»—‡ÑÀ†œ¾ˆãÖœƒ°™¢•‘†ÏÒŽÐÖ³ ÒžÂ¯‰¦¬¼ß²º–ŸÈµ»¨Ñœ°‹‘­‚ÔŠ›ÝÕ•Š·»À®–Þٶ݃Ñà",2*ROW(A1:A100)-1,2))-32)
Chronocidal

1
Beim Testen mit Office365 sieht es so aus, als würde es 14 unabhängig von der Eingabe ausgeben.
Matthew Schlachter

9

Java 8, 615 217 202 184 182 166 165 Bytes (berechnet 999 200 Stellen)

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-indiziert

Probieren Sie es online aus.

Math.PIWie viele andere Sprachen hat auch Java eine Genauigkeit von 15 Dezimalwerten. Um mehr Ziffern zu haben, müssen Sie diese mit BigIntegersoder selbst berechnen BigDecimals. Das oben genannte ist eine Möglichkeit , es zu tun .. Vielleicht Golf jemand kann dies unter 211 Bytes, lol ..
EDIT: einen Hafen Erstellt @primo ‚s Python 2 Antwort (stellen Sie sicher , ihn upvote!), So die Berechnung kürzer ist als hart -coded ist nicht mehr so ​​weit hergeholt. Nur noch 7 Bytes zum Golfen, damit es kürzer wird.

-15 Bytes dank @Neil , was es kürzer macht als die hartcodierte Antwort unten!
-36 Bytes dank @primo .
-1 Byte wechselt java.math.BigInteger t=null,T=t.TEN.pow(200),r=T;zu var T=java.math.BigInteger.TEN.pow(200);var r=T;, weil var1 Byte kürzer ist als null(ich muss das neue Java 10 lieben).

Erläuterung:

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 Bytes (200 Ziffern fest codiert)

"14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196"::indexOf

0-indiziert

Probieren Sie es online aus.


1
!p.equals(t.ONE)vielleicht? Auch indexOf(n,1)-1funktioniert denke ich. Oder speichere 2 Bytes und mache es 1-indiziert.
Neil

Ich bin nicht sicher, wie ich den ersten verpasst habe, aber den zweiten muss ich mir wirklich merken. Wusste nicht, dass es eine indexOfMethode gibt, die die ersten mZeichen überspringt . Bis, danke!
Kevin Cruijssen


1
Sie können auch pjedes Mal um eins dekrementieren ( for(int p=667;p-->1;)) und dann mit multiplizieren pund durch dividieren p-~p.
Primo

1
Der Anfangswert von rkann buchstäblich alles sein, obwohl extreme Werte mehr Iterationen erfordern. Der beste Startwert (wenige Iterationen) ist tatsächlich 4e200.
Primo

6

05AB1E , 6 Bytes

₁žs¦¹k

Probieren Sie es online!

Wie?

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

Wenn ich nach Ihnen eine ähnliche 6-Byte-Lösung in derselben Sprache erhalte, lösche ich meine Antwort?
nicael

@nicael normalerweise spielt es keine Rolle, aber Ihre Lösung schlägt 3trotzdem fehl
Uriel

Oh, ja, thnks
nicael

6

MATL , 16 15 Bytes

YP8WY$4L)jXfX<q

Probieren Sie es online!

Erläuterung

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

Sehr schön und kurz! Kannst du erklären, wie es funktioniert?
Der zufällige Kerl

@ Therandomguy Sicher, Erklärung hinzugefügt
Luis Mendo

4

R + Nummernpaket, 52 Bytes

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

Probieren Sie es online!

dropletPiBerechnet die ersten 200 Dezimalstellen von pi, enthält aber 3.am Anfang ein, so dass wir das mit entfernen substringund dann mit abgleichen regexec, wodurch der Index der Übereinstimmung zusammen mit einigen Metadaten über die Übereinstimmung zurückgegeben wird.


Vielleicht regexpr(scan(),numbers::dropletPi(200))-2?
Djhurio

@ Djhurio, das funktioniert nicht, weil wir in den Ziffern nach dem Komma übereinstimmen müssen. Das war auch mein erster Gedanke, aber dieser Fall ruiniert ihn. Vielleicht ein "if"?
Giuseppe

Ich sehe hier kein Problem. Nicht die Eingabe wird enthalten 3.(ich nehme an, wir beschäftigen uns mit Ganzzahlen, die keine reellen Eingaben sind). Die Testbeispiele arbeiten damit.
Djhurio

3
@ Djhurio Recht, aber regexpr(3,numbers::dropletPi(200))-2kehrt zurück, -1 wenn es zurückkehren sollte 9, versuchen Sie es
Giuseppe

3

Jelly , 23 Bytes

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

Ein monadischer Link, der eine Liste von Zeichen (die zu suchende Ganzzahl) akzeptiert und den Index zurückgibt. Funktioniert für Eingaben innerhalb der ersten 252 Stellen des Dezimalteils von π.

Probieren Sie es online!

Wie?

Hierbei werden nach der Leibniz-Formel für π die ersten 253 Stellen einschließlich der führenden 3(plus vier nachgestellten falschen Stellen) berechnet . Der führende Punkt 3wird dann gelöscht und der Index der Eingabe gefunden:

⁵*⁹Ḥ;ȷḊ+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

Wenn Sie eine Liste von Ziffern als Eingabe bevorzugen, verwenden Sie ⁵*⁹Ḥ;ȷḊ+J$¤×⁹:2¤:ɗ\SDḊw(auch 23), während Sie der Liste eine ganzzahlige Verwendung geben möchten ⁵*⁹Ḥ;ȷḊ+J$¤×⁹:2¤:ɗ\SDḊwD(für 24).


Sie meinen die Euler-Transformation, die auf die Leibniz-Formel angewendet wird. Das Berechnen von 252 Stellen mit der Leibniz-Formel würde ein bisschen länger dauern, als die meisten Menschen warten würden.
Primo

Ja, es würde eine lange Zeit in roher Form dauern (ich glaube immer noch "nach der Leibniz-Formel"!)
Jonathan Allan

3

BASH (GNU / Linux), 75 67 66 Bytes

Dank Sophia Lechner 1 Byte und dank Cows Quack 7 Byte eingespart.

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

Dies ist ein Shell-Skript, das ein einziges Argument verwendet, nämlich die Zahl. Testen Sie mit

$ bash <script-path> 59
4

Dieses Skript führt zunächst eine Pipeline mit drei Befehlen aus:

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

Das Ergebnis dieser Pipeline wird der Shell-Variablen zugewiesen a, die dann mit Ausnahme der ersten entfernten Zahl als Echo ausgegeben wird:

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

Leider bchat die Tendenz, Ausgangsleitungen zu unterbrechen, wenn sie zu lang werden. Dies kann zu falschen Ergebnissen führen, wenn die zu findende Nummer nicht in der ersten Zeile steht. Sie können dies vermeiden, indem Sie die Umgebungsvariable festlegen BC_LINE_LENGTH:

export BC_LINE_LENGTH=0

Dadurch wird die Zeilenumbruchfunktion vollständig deaktiviert.


Offensichtlich können die letzten beiden Befehle weggelassen werden, wenn eine andere Ausgabe toleriert wird.
Dies ergibt eine Anzahl von 48 Bytes :

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

Mit der resultierenden Ausgabe:

$ 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

Nett! Sie brauchen diesen Abstand zwischen -lund nicht <<<.
Sophia Lechner

Sie können in ein Programm konvertieren und sed verwenden, um einige Bytes zu speichern. Probieren Sie es online aus!
Kritixi Lithos

@Cowsquack Müsste ich dann nicht eine Shebang-Zeile in die Byteanzahl aufnehmen?
CMASTER

@ cmaster shebang Zeilen sind nicht in der Anzahl der Bytes für alle Sprachen enthalten
Kritixi Lithos

@Cowsquack Danke für den Vorschlag. Wenn Sie jedoch zusätzliche Ausgaben zulassen, können Sie diese auch weglassen sed(siehe den zweiten Teil meiner Antwort). Das Umwandeln in ein Programm gab mir trotzdem 7 Bytes, also danke dafür! Ich habe auch die tr/ headcombo durch Shell Variable Magic ersetzt, um ein weiteres Byte zu speichern.
CMASTER

2

JavaScript 197, 187

-10: Danke, Neil !

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

Nimmt eine Reihe von neunstelligen Ganzzahlen zur Basis 36, konvertiert sie zur Basis 10 und verknüpft sie, um die ersten 200 Stellen von pi zu erstellen.


Schön, dass Sie meine Versuche, die Daten aus dem Wasser zu kodieren, zunichte machen. Ihr Ansatz spart 38 Bytes an den Rohdaten.
Nit

+1 - Ich wollte genau den gleichen Ansatz posten.
darrylyeo

Verwenden Sie x=>'50...'.replace(/.{9}/g,a=>parseInt(a,36)).search(x)+110 Byte zu speichern.
Neil

2

Zum ersten Mal Code Golf spielen. Verwenden Sie Delegaten und Lambda-Ausdrücke, um die Funktionsaufrufe zu reduzieren. V2 verkürzt den Klassennamen in ein einzelnes Byte.

[C #], 361 355 Bytes

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"));}}

Formatierte Version:

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!

Ich habe die erste Version falsch gezählt. Es waren 361 Bytes, nicht 363 Bytes.

[C #], Version 218 Bytes

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

Probieren Sie es online!


Sie müssen die Testfälle nicht in Ihren Code aufnehmen und können statt eines vollständigen Programms auch eine Lambda-Funktion (anonym) verwenden
Zac Faragher,

Hyarus schlug using System;f=>"14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196".IndexOf(f)+1;als redaktion vor .
Ovs

Ich bin neu hier und dachte, ich muss ein vollständiges Programm einschließlich des Testfalls einschließen. Es scheint, dass die Leute tio.run für Demonstrationen anstelle von ideone verwenden. Ich sehe, dass tio.run den Code in Teile aufteilt.
Han

2

Haskell , 208, 120 Bytes

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

Probieren Sie es online!

Vielen Dank an Jonathan Allan für seine Vorschläge!

Alte Version (208 Bytes)

(+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

Ich weiß eigentlich nicht, wie der obige Code funktioniert; Ich habe es diesem Artikel entnommen und alles, was ich implementiert habe, war das Nachschlagen. g(1,0,1,1,3,3)gibt die Stellen von pi zurück und ist überraschend effizient (es berechnet 10 000 Stellen bei tio.run in weniger als 4s).

Die Eingabe ist eine Liste, die aus den Ziffern der zu findenden Nummer besteht.

Probieren Sie es online!


Ich vermute, dass die Leibniz-Formel viel kürzer sein wird.
Jonathan Allan

@ JonathanAllan Danke! Ich werde es versuchen. Ich liebe diese Seite! Ich habe so viel von dir gelernt , Jungs! :)
Cristian Lupascu

@ JonathanAllan Ich habe versucht, pi mit zu approximieren l=4*sum[((-1)**x/(2*x+1))|x<-[0..1e6]], aber das dauert 5s und die 7. Ziffer ist bereits falsch. Daher ist es möglicherweise nicht möglich, 200 Stellen zu berechnen. Es war trotzdem eine interessante Übung, also danke!
Cristian Lupascu

1
Sie möchten die Euler-Transformation verwenden (siehe meine Gelee-Antwort oder die Python-Antwort von Primo)
Jonathan Allan

1
In Bezug auf den Artikel, den Sie verlinkt haben, könnte Sie das interessieren dieser Beitrag , in dem ich den in diesem Dokument enthaltenen Code ohne "absichtliche Verschleierung" erneut implementiere. Dadurch ist es auch viel einfacher (kürzer). Siehe Methode g1_refim Abschnitt Schnellere, unbegrenzte Generatoren . Der Code ist Python.
Primo

2

Haskell, 230 Bytes

Verwenden Sie Faulheit, um die Zahl irgendwo in den unendlichen Stellen von pi zu finden, nicht nur in den ersten 200 Stellen. Oh ja, und es gibt Ihnen jede (unendlich viele?) Instanz (en) der Nummer zurück, nicht nur die erste.

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]

Beispiele aus der Herausforderung

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

Credits

'p' ist der unendliche Strom von pi-Ziffern, entnommen aus 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]

Ich nehme an, Sie wissen das bereits, aber Sie müssen nur die erste Nummer in Ihrer Sequenz
ausgeben

Ich dachte nur, ich würde die Unendlichkeit umarmen: D
Tombop

2

SmileBASIC, 179 164 Bytes

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

Ziffern von pi werden fest codiert und in die ASCII-Werte von Zeichen gepackt. 14 ->CHR$(14) , 15 -> CHR$(15), 92 -> \, 65 -> A, 35 -> #.

Die Zeichenfolge enthält nicht druckbare Zeichen. Die folgenden Bytes sind hexadezimal geschrieben: 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

In Dezimalschrift sehen Sie die Ziffern von pi: 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


Wenn Sie den vollständigen Code posten, wird es einfacher, Ihre Antwort zu überprüfen.
Primo

1
Ich kann es nicht posten, da ungültige Zeichen entfernt / nicht angezeigt werden. Ich schätze, ich kann die ASCII-Codes trotzdem posten.
12. Mai,

Sie könnten einen Hexdump posten, zum Beispiel mit xxd.
Nathaniel

2

Rubin , 37-35 Bytes

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

Probieren Sie es online!

Nichts Besonderes, nur die eingebaute Bibliothek. Der Ausgang ist 0-indiziert. Die Pi-Zeichenfolge ist wie folgt formatiert: 0.31415...e1Die ersten drei Zeichen müssen entfernt werden. Der e1Teil am Ende schadet nicht wirklich, wird aber ebenfalls entfernt, da wir ohnehin einen Wert für das Bereichsende (oder die Slice-Länge) angeben müssen.


kurz UND lesbar!
pjs

2

Kohle , 27 15 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Funktioniert bis zu fast 1000 Stellen. Erläuterung:

        ≕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

fest, 13 Bytes . Randnotiz: das fühlt sich wirklich schummelig an: P
Nur ASCII

tatsächlich behoben, 13 Bytes . Verwendet implizite Eingaben. (nicht beabsichtigtes Verhalten, aber es scheint nützlicher als jede andere Möglichkeit). Könnten Sie auch ein Beispiel für den Füllfehler verlinken?
Nur ASCII

@ Nur ASCII Verrücktheit füllen - warum landet der Cursor dort?
Neil

: | Oh, ich habe keine Ahnung, dass ich das so schnell wie möglich beheben sollte
ASCII

nvm Ich bin ein Idiot , engagierte Verlegenheit.
Nur ASCII

2

Japt , 186 177 Bytes

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

Da Japt die 15-stellige Pi-Einschränkung und das Shoco von Javascript verwendet, codiert die von Japt verwendete Codierung keine Zahlen. Für die Komprimierung sind einige Spielereien erforderlich.

Kurz erklärt, der Anfang ist die folgende Zeichenfolge in codierter Form:

"nqnrvosrpruvtvpopuqsosqppupotvrmouuqnvtnsvpvvptrnmruomvtqvqqrvopmtunsqmsousomuvvusoumpquorpqonntmstvuonqumusrnpouopmssqtmvpuqqsmvrrmruoopntorprvqmunouqunnntqrmouqnmotmnvpuronnmrrrvsqqsoovquvrqvpmpunvs"

Welches ist eine Zeichenfolge, in der jeder Buchstabe ist 'm' + corresponding digit of pi. Ich habe das gesamte Alphabet getestet und dieser Buchstabe bietet die beste Komprimierung um einige Bytes.

Backticks weisen Japt an, den String zu dekodieren. Der Rest ist ziemlich einfach:

®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.

Gibt den 0-basierten Index des übereinstimmenden Fragments aus.
Noch zwei Bytes weniger dank Oliver .

Probieren Sie es online!


1
Clevere Idee! Sie können £Xmit ®und } mit ersetzenÃ
Oliver

@ Oliver Vielen Dank für diese, ich lerne immer noch Japt, so dass jede Hilfe sehr geschätzt wird.
Nit

1
Sie haben sich bisher sehr gut geschlagen! Ich war gespannt, ob es einen besseren Versatz als 109 gibt. Ich habe einen Bruteforcer gemacht , und es stellt sich heraus, dass 109 optimal ist. Schön gemacht :)
Oliver

@Oliver Danke dafür, ich habe einfach den gesamten az-Bereich manuell ausprobiert, da es nicht zu viel Arbeit war. : P
Nit

1

AWK- M, 131 119 117 Bytes

Verwendet -MFlag für willkürliche Präzisionsberechnungen. Dem p=k=0TIO-Link wurden (5 Byte) hinzugefügt , um eine mehrzeilige Eingabe zu ermöglichen

{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

Probieren Sie es online!

Erläuterung:

{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

Mein erster Versuch war es sprintf, die Dezimalstellen zu ermitteln. Verwenden CONVFMTist auf jeden Fall sauberer.
Robert Benson

2
Keine Notwendigkeit, die Flagge zu verwenden: Metakonsens ist, dies als eine von AWK verschiedene Sprache zu betrachten , "AWK mit -MFlagge"
Giuseppe

Gut zu wissen. Ich denke, ich sollte mehr Zeit mit Meta verbringen ... mit meiner ganzen Menge Freizeit. :)
Robert Benson

1

Gelee , 24 Bytes

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

Probieren Sie es online!

Verwenden Sie eine Machin-ähnliche Formel , insbesondere 1/4 pi == tan -1 (1/2) + tan -1 (1/3).

Verwenden Sie die Formel pi / 2 == 1 + 1/3 × (1 + 2/5 × (1 + 3/7 × (1 + 4/9 × (...)))


Gibt es eine Möglichkeit, Ziffern aus ØPM zu erhalten?
Dylnan

@ Dylnan Etwas , aber M ist nicht Jelly.
user202729

Ich weiß, dass sie unterschiedlich sind. Ich kann nicht glauben, dass ich nicht daran gedacht habe floor. Stört es mich, wenn ich das benutze, um als Antwort in M ​​zu posten?
Dylnan


1

Python 2 239 238 229 214 Bytes

-9 Bytes aufgrund von @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

Verwendet den Chudnovsky-Ramanujan - Algorithmus und finden Sie die ersten 1 Million Ziffern 50000 Stellen von π (Änderung 10**10**5an 10**10**6für mehr, aber es dauert ewig zu laufen) , und dann sucht sie für die gewünschte Zeichenfolge.


Ich habe versucht, das Ergebnis zu bestätigen, aber es scheint nicht zu terminieren ( n=10**10**5dauert ungefähr 10s).
Primo

@primo Ich habe nie gesagt, dass es schnell war! 10**10**6dauert ungefähr 7 Minuten auf meinem Computer. Um fair zu sein, 10**10**5gibt es die ersten 50000 Ziffern, also denke ich, ist es auch nicht so schlimm :)
DividedByZero

@primo Ich habe die beliebige Präzisionsbibliothek in bigfloat geändert, sie läuft jetzt viel schneller.
DividedByZero

Es ist jetzt viel schneller, ich wollte vorschlagen, zu wechseln gmpy2, bigfloatspart aber etwa ein Dutzend Bytes. Die Zuordnung von kkann zusammengeführt werden, k=b=0wenn Sie k+=1zum Start der Iteration wechseln . -(6*k-5)*(2*k-1)*(6*k-1)kann prägnanter als geschrieben werden k*(k*(108-72*k)-46)+5. Wenn Sie Python 2 deklarieren, können die //Ganzzahlunterteilungen durch ersetzt werden /, und auch Klammern sind für nicht erforderlich print. Leerzeichen können auch in entfernt werden import*. Gültig nur für 50000 Stellen, übrigens.
Primo

Das nin sqrt(10005*n)scheint das Problem zu sein; Es verschiebt den Dezimalpunkt auf die 50000. Stelle. Falls Sie interessiert sind, hier ist meine eigene Chudnovsky-Implementierung: Probieren Sie es online aus!
Primo

1

Visual Basic - 114 Bytes

Okay, erste Vorlage. Sei nicht zu streng mit mir!

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

Feedback erwünscht!

Ich habe mich nicht auf die ersten 256 Teile von PI beschränkt, da die Frage "Das musst du nicht" und nicht "Das solltest du nicht" lautet. Hoffe, ich mache das richtig :)


Ich weiß nicht viel über Virtual Basic, aber ich denke, Sie können einige Bytes sparen, indem Sie alle Leerzeichen entfernen. Sie sollten auch in der Lage sein, Ihren Code in einer Funktion zu speichern und den Wert anstelle von "console.log" zurückzugeben (ich denke, Sie würden so einige Bytes gewinnen). Oh, und Sie müssen den Wert eingeben und nicht fest codieren.
Der zufällige Kerl

Vielen Dank. Leerzeichen entfernt und der fest codierte Wert zugunsten der Eingabe entfernt. Erhöht die Anzahl auf 114! Wäre die Funktion zur Rückgabe des Wertes nicht in der Byteanzahl enthalten? Ich stelle mir vor, das würde es länger machen, wenn ja.
user9338709

Willkommen auf der Seite! Das sieht so aus, als ob es funktioniert ( versuchen Sie es online! ), Aber es scheint ein Ausschnitt zu sein und Einreichungen müssen entweder ein vollständiges Programm oder eine Funktion sein.
Dom Hastings

So etwas könnte funktionieren, aber es gibt wahrscheinlich bessere Möglichkeiten, um die Dinge zu tun! Im Link-Menü oben auf dieser Seite finden Sie die Vorlage, die von vielen Einsendungen verwendet wird.
Dom Hastings

Eigentlich sieht es so aus, als hätte die Konstante keine 200 Stellen :( Probieren Sie es online aus! - dies sollte 197 ergeben.
Dom Hastings

0

Javascript 217 Bytes (200 fest codiert)

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

0

PHP, 27 Bytes

Keine sehr serielle Antwort, es erfordert eine Änderung der php.ini-Einstellungen, da pi () standardmäßig 14 Stellen hat, nicht 200, aber ausnahmsweise ist die PHP-Lösung ziemlich elegant:

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

Ich glaube nicht, dass das wirklich funktionieren wird. Das precisionTag in der php.ini ändert nur die Anzeigegenauigkeit und erhöht die Genauigkeit definierter Konstanten nicht. Zeuge
Primo

0

Julia 0,6 , 53 Bytes

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

Stellen Sie die Genauigkeit für BigFloats hoch genug ein, konvertieren Sie dann piin einen String und suchen Sie. Präzision der 9^6Griffe 159980 Stellen.

Probieren Sie es online!



0

Perl 5 mit -MMath::BigFloat+bpiund -n, 20 Bytes

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

Probieren Sie es online!

Ich bin nicht sicher , wo der Gebrauch von $>Ständen, da es das ist , EFFECTIVE_USER_IDdie nicht tragbar ist, sondern auf TIO ist dies 1000 und erfüllt unsere Anforderung, für -1 Byte vs. 200.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.