Eine dreieckige Scheibe quadratischen Pi

21

Inspiriert von Bake a Slice of Pi

Herausforderung

Bei Eingabe von 3 <= n <= 100und 3 <= y <= nwird eine n x nMatrix aus dem Dezimalteil von pi( 14159...) erstellt, beginnend oben links. Nehmen Sie dann das obere rechte Dreieck der Größe y x yund verknüpfen Sie es miteinander. Geben Sie die resultierende Nummer aus.

Beispielsweise für die Eingabe n = 5, y = 3wird die folgende Matrix konstruiert

14159
26535
89793
23846
26433

Dann wäre das obere rechte 3 x 3Dreieck

159
 35
  3

so 159353ist die Ausgabe.

Eingang

Zwei Ganzzahlen - ndie die Größe der quadratischen Matrix der Ziffern von pi und ydas obere rechte Dreieck darstellen - in einem beliebigen geeigneten Format .

Ausgabe

  • Die resultierende aufgeschnittene und verkettete Nummer, die entweder gedruckt oder auf dem Bildschirm angezeigt wird, als Zeichenfolge usw. zurückgegeben wird.
  • Das nachgestellte / führende Leerzeichen ist optional, solange in der Ausgabe kein Leerzeichen enthalten ist (dh, 159 35 3wenn es sich um ein ungültiges Leerzeichen handelt ).
  • Beachten Sie, dass piAntworten die letzte Ziffer der Matrix nicht runden sollten , da explizit nach den Ziffern und nicht nach einer Annäherung oder mathematischen Berechnung gesucht wird.

Regeln

  • Dies ist so dass alle üblichen Regeln für das Golfen gelten und der kürzeste Code (in Bytes) gewinnt.
  • Ein vollständiges Programm oder eine vollständige Funktion sind akzeptabel.
  • Standardlücken sind verboten.

Beispiele

 n  y  output
-------------
 3  3  141923
 5  3  159353
 6  4  1592589383
 6  6  141592535893238643794
20 12  358979323846950288419715820974944628620899211706792306647223172745025559196615
AdmBorkBork
quelle
Vielen Dank. Kann die letzte Ziffer auch gerundet werden? Einige Antworten scheinen das zu tun, und es könnte wirklich schwierig sein, es zu vermeiden
Luis Mendo
1
@ LuisMendo Das ist ein guter Punkt. Nein, es sollte keine Rundung der letzten Ziffer geben, da wir nach den tatsächlichen Ziffern von pi suchen, nicht nach einer Annäherung oder Berechnung. Ich werde das klären und mit den Antwortenden absprechen.
AdmBorkBork

Antworten:

7

05AB1E , 19 Bytes

Verwendet CP-1252- Codierung.

nžs¦¦¹ôI£íRvyN>£J}R

Probieren Sie es online!

Erläuterung

n=5, y=3 zum Beispiel verwendet

nžs                  # push pi to n^2 digits
                     # STACK: 3.1415926535897932384626433
   ¦¦                # remove the first 2 chars
                     # STACK: 1415926535897932384626433
     ¹ô              # split into n*n matrix
                     # STACK: ['14159', '26535', '89793', '23846', '26433']
       I£            # keep the first y rows
                     # STACK: ['14159', '26535', '89793']
         íR          # reverse the list of rows and each individual row
                     # STACK: ['39798', '53562', '95141']
           v     }   # for each y,N (row, index) in the list
            yN>£J    # keep the first index+1 digits of the row and join to string
                     # STACK: 353951
                  R  # reverse the string
                     # STACK: 159353
                     # implicit print
Emigna
quelle
1
Herzlichen Glückwunsch zu 10k!
Erik der Outgolfer
5

Python 2 (mit Sympy), 100 Bytes

from sympy import*
lambda n,y:''.join(c for i,c in enumerate(`pi.round(n*n+1)`[2:])if i%n-i/n>n-y-1)

Kein sympy, 260 246 244 233 231 218 Bytes

p=lambda n,y,a=-30,b=10,c=3,d=2,e=0,f=5,s='',i=0:i<n*n and p(n,y,*[((2*b+a)*f,b*d,c*f,d+1,(b*(7*d)+2+(a*f))/(c*f),f+2,s,i),(10*(a-e*c),10*b,c,d,((10*(3*b+a))/c)-10*e,f,s+(str(e)[:i%n-i/n>n-y-1]),i+1)][4*b+a-c<e*c])or s

Hierfür wird "The Spigot Algorithm For Pi" von Stanley Rabinowitz und Stan Wagon verwendet.

Das Standardargument wäre a,b,c,d,e,f=0,1,1,1,3,3, die erste Ziffer von pi zu liefern 3, da dies nicht erforderlich ist. Der Algorithmus wird bis zu dem Punkt initialisiert, an dem er 1ausgegeben wurde. Dies spart zwar zwei Bytes aund bist länger, da das Ergebnis kein Slicing und benötigti bei beginnen kann 0eher als -1.

Erreicht das Standard-Rekursionslimit für den letzten Testfall.
Wird //für die erste der Unterteilungen verwendet, sodass str(v)es durch ersetzt werden kann `v`(andernfalls würde es Llange dauern ).
repl.it


Eine nicht rekursive Version für 232 Bytes, die auch den letzten Testfall auswertet:

def p(n,y):
 a,b,c,d,e,f,i,s=-30,10,3,2,0,5,0,''
 while i<n*n:
    if 4*b+a-c<e*c:s+=`e`[:i%n-i/n>n-y-1];g=10*(a-e*c);e=((10*(3*b+a))//c)-10*e;b*=10;i+=1
    else:g=(2*b+a)*f;h=(b*(7*d)+2+(a*f))/(c*f);b*=d;c*=f;f+=2;d+=1;e=h
    a=g
 print s

repl.it (erster Einzug ist ein Leerzeichen, zweiter Einzug ist ein Tabulator)

Jonathan Allan
quelle
Diese "no sympy" -Version ist beeindruckend :)
Emigna
1
Ich habe einen Link hinzugefügt, das ist nicht mein Algorithmus!
Jonathan Allan
... aber wenn Sie Pi auf eine Million Stellen "auswendig lernen" möchten, ist dies wahrscheinlich einfacher
Jonathan Allan
4

Mathematica, 82 Bytes

Print@@Join@@Partition[RealDigits[Pi-3,10,#^2][[1]],#][[i,i-#2-1;;]]~Table~{i,#2}&
JungHwan min
quelle
Sie können #&@@anstelle von verwenden [[1]].
Martin Ender
@TimmyD Nein. Es schneidet ab. (n = 10, y = 10 ergibt 1415926535979323846433832798841971937510749448164899259; die letzte 9ist die 100. Stelle von pi und die 101. Stelle ist 8- keine Rundung)
JungHwan Min 14.10.16
3

MATL, 23 22 27 Bytes

1 Byte gespart dank @Luis

UtEYPwY$IbH+&:)GetGi-&R!g)!

Probieren Sie es online

Erläuterung

        % Implicitly grab input (n)
Ut      % Square n and duplicate
E       % Multiply n^2 by 2
YP      % Pi literal
w       % Flip the stack
Y$      % Compute the first 2 * (n^2) digits of pi (accounts for rounding)
IbH+&:) % Grab the first n^2 digits after the decimal
Ge      % Reshape it into an n x n matrix in row-major ordering
t       % Duplicate this matrix
Gi-     % Grab the second input (y) and compute the difference between n and y
&R!     % Get the upper diagonal part and transpose to convert to lower diagonal
g)      % Convert it to a logical array and use it to select the digits of interest
!       % Transpose the result and implicitly display
Suever
quelle
@ LuisMendo Ah! Ich wusste, dass wir eine Funktion dafür hatten, konnte sie aber nicht finden. Vielen Dank!
Suever
@TimmyD Danke, dass du es bemerkt hast. Aktualisiert.
Suever
2

Perl, 67 Bytes

s/ /bpi++$_**2/e;$%=$';$%-=print/(.{$%})$/ for/\d{$`}/g

Erfordert die Befehlszeilenoption -nMbignum=bpi, die als 12 gezählt wird. Die Eingabe erfolgt über stdin.

Beispielnutzung

$ echo 3 3 | perl -nMbignum=bpi primo-square-pi.pl
141923

$ echo 5 3 | perl -nMbignum=bpi primo-square-pi.pl
159353

$ echo 6 4 | perl -nMbignum=bpi primo-square-pi.pl
1592589383

$ echo 6 6 | perl -nMbignum=bpi primo-square-pi.pl
141592535893238643794

$ echo 20 12 | perl -nMbignum=bpi primo-square-pi.pl
358979323846950288419715820974944628620899211706792306647223172745025559196615
primo
quelle
0

C #, 232 Bytes 268 Bytes

Bearbeiten:

Ich habe ursprünglich eine konstante Zeichenfolge für Pi außerhalb der Methode verwendet, aber es scheint, dass dies ein Betrug war. Ich musste den C # Math.PI-Wert verwenden, der nur 14 Dezimalstellen hat, also die höchstem Wert, den ich verwenden kann, 3 ist. Zurück zum Zeichenbrett ...

Golf gespielt:

IEnumerable<string>f(int m,int t){var a=new string[m, m];var b=Math.PI.ToString().Replace("3.","").Substring(0,m*m).ToArray();var c=0;for(int i=0;i<m;i++){for(int j=0;j<m;j++){a[i, j]=b[c]+"";c++;}}c=0;while(t>0){for(int i=t;i>0;i--){yield return a[c,m-i];}t--;c++;}}}

Ungolfed:

  class ATriangularSliceOfSquaredPi
  {
    //http://www.piday.org/million/
    //const string p = "1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831";

    public IEnumerable<string> f(int m, int t)
        {
          var a = new string[m, m];

          //var b = p.Substring(0, m * m).ToArray();
          var b = Math.PI.ToString().Replace("3.", "").Substring(0, m * m).ToArray();

          var c = 0;

          for (int i = 0; i < m; i++)
          {
            for (int j = 0; j < m; j++)
            {
              a[i, j] = b[c] + "";
              c++;
            }
          }

          c = 0;

          while (t > 0)
          {
            for (int i = t; i > 0; i--)
            {
              yield return a[c, m - i];
            }
            t--;
            c++;
          }
        }
      }

Nicht die kürzeste Antwort, aber ich war froh, dass ich diese gelöst habe ...

Testausgang:

m   t   output
3   3   141923

5 3 159353
6 4 1592589383
6 6 141592535893238643794
20 12 358979323846950288419715820974944628620899211706792306647223172745025559196615

Pete Arden
quelle
1
Gute Antwort! Wenn Sie eine Sprache verwenden p, die nicht in die Sprache integriert ist (was ich ziemlich sicher nicht bin), müssen Sie diese leider in Ihren Bytewert aufnehmen.
AdmBorkBork
@TimmyD Oh nein! Ok, lass es bei mir !! Wenn ich einfach meine pi-Zahlen einfüge, werden mehr als 400 Bytes benötigt, also denke ich, dass ein anderer Ansatz erforderlich ist ... :)
Pete Arden