Una fetta triangolare di Pi quadrata


21

Ispirato da Bake una fetta di Pi

Sfida

Dato input 3 <= n <= 100e 3 <= y <= n, costruisci una n x nmatrice della parte decimale di pi( 14159...), iniziando in alto a sinistra. Quindi, prendi il triangolo di dimensioni in alto a destra y x ye concatenalo insieme. Emette il numero risultante.

Ad esempio, per l'input n = 5, y = 3viene costruita la seguente matrice

14159
26535
89793
23846
26433

Quindi, il 3 x 3triangolo in alto a destra sarebbe

159
 35
  3

così 159353è l'output.

Ingresso

Due numeri interi - che nrappresentano le dimensioni della matrice quadrata delle cifre di pi e che yrappresentano il triangolo in alto a destra - in qualsiasi formato conveniente .

Produzione

  • Il numero suddiviso e concatenato risultante, stampato o visualizzato sullo schermo, restituito come stringa, ecc.
  • Trailing / spazi bianchi è opzionale, fino a quando non c'è spazio bianco in uscita (ad esempio, 159 35 3o simile sarebbe valido).
  • Si noti che poiché stiamo cercando esplicitamente le cifre di pi, e non un'approssimazione o un calcolo matematico, le risposte non dovrebbero arrotondare la cifra finale della matrice.

Regole

  • Questo è quindi si applicano tutte le regole abituali per il golf e vince il codice più breve (in byte).
  • È accettabile un programma o una funzione completi.
  • Sono vietate le scappatoie standard .

Esempi

 n  y  output
-------------
 3  3  141923
 5  3  159353
 6  4  1592589383
 6  6  141592535893238643794
20 12  358979323846950288419715820974944628620899211706792306647223172745025559196615

Grazie. Inoltre, è possibile arrotondare l'ultima cifra? Alcune risposte sembrano farlo, e potrebbe essere davvero difficile evitarlo
Luis Mendo,

1
@LuisMendo Questo è un buon punto. No, non dovrebbe esserci arrotondamento dell'ultima cifra, poiché stiamo cercando le cifre effettive di pi, non un'approssimazione o un calcolo. Chiarirò e verificherò con i rispondenti.
AdmBorkBork,

Risposte:


7

05AB1E , 19 byte

Utilizza la codifica CP-1252 .

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

Provalo online!

Spiegazione

n=5, y=3 usato per esempio

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

1
Complimenti per 10k!
Erik the Outgolfer,

5

Python 2 (con sympy), 100 byte

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)

Nessun sympy, 260 246 244 233 231 218 byte

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

Questo impiega "The Spigot Algorithm For Pi" di Stanley Rabinowitz e Stan Wagon.

Gli argomenti standard sarebbe a,b,c,d,e,f=0,1,1,1,3,3cedere la prima cifra di p, 3, dal momento che non è richiesto l'algoritmo viene inizializzato al punto prima 1viene ceduto, che salva due byte anche se ae bsono più come risultato non richiede affettamento e ipuò iniziare 0piuttosto che -1.

Colpisce il limite di ricorsione predefinito per l'ultimo caso di test
Utilizza //per la prima delle divisioni in modo che str(v)possa essere sostituito da `v`(altrimenti finirebbe Lper un lungo).
repl.it


Una versione non ricorsiva per 232 byte che valuta anche l'ultimo caso di test:

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 (il primo trattino è uno spazio, il secondo trattino è una scheda)


Quella versione "no sympy" è impressionante :)
Emigna,

1
Ho aggiunto un link, non è il mio algoritmo!
Jonathan Allan,

... ma se vuoi "memorizzare" Pi con un milione di cifre, questo è probabilmente più facile
Jonathan Allan,

4

Mathematica, 82 byte

Print@@Join@@Partition[RealDigits[Pi-3,10,#^2][[1]],#][[i,i-#2-1;;]]~Table~{i,#2}&

Puoi usare #&@@invece di [[1]].
Martin Ender,

@TimmyD Nope. Tronca. (n = 10, y = 10 indica 1415926535979323846433832798841971937510749448164899259; l'ultima 9è la 100a cifra di pi e la 101a cifra è 8- nessun arrotondamento)
JungHwan Min

3

MATL, 23 22 27 byte

1 byte salvato grazie a @Luis

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

Provalo online

Spiegazione

        % 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

@LuisMendo Ah! Sapevo che avevamo una funzione per quello, ma non riuscivo a trovarlo. Grazie!
Suever,

@TimmyD Grazie per avermelo notato. Aggiornato.
Suever,

2

Perl, 67 byte

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

Richiede l'opzione della riga di comando -nMbignum=bpi, conteggiata come 12. L'input viene preso dallo stdin.

Esempio di utilizzo

$ 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

0

C #, 232 byte 268 byte

Modificare:

Inizialmente ho usato una stringa costante per Pi al di fuori del metodo, ma sembra che questo fosse barare. Ho dovuto usare il valore Math.PI di C #, che ha solo 14 cifre decimali, quindi il mvalore più alto che posso usare è 3. Torna al tavolo da disegno ...

golfed:

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++;
          }
        }
      }

Non la risposta più breve, ma ero solo felice di aver risolto questo ...

Uscita di prova:

m   t   output
3   3   141923

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


1
Bella risposta! Sfortunatamente, se stai usando pe non è un built-in nella lingua (che sono abbastanza sicuro che non lo sia), dovrai includerlo nel tuo punteggio in byte.
AdmBorkBork,

@TimmyD Oh no! Ok, lascialo con me !! Se semplicemente incollo i miei numeri pi che richiederanno oltre 400 byte in più, quindi penso che sia richiesto un approccio diverso ... :)
Pete Arden
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.