Trójkątny kawałek kwadratu Pi

21

Zainspirowany przez Bake a kawałek Pi

Wyzwanie

Biorąc pod uwagę dane wejściowe 3 <= n <= 100i 3 <= y <= nkonstruuj n x nmacierz części dziesiętnej pi( 14159...), zaczynając od lewego górnego rogu. Następnie weź prawy górny trójkąt wielkości y x yi połącz go razem. Podaj wynikową liczbę.

Na przykład, do wprowadzania n = 5, y = 3następujący matryca jest wykonana

14159
26535
89793
23846
26433

Wówczas prawy górny 3 x 3trójkąt byłby

159
 35
  3

podobnie 159353jak wynik.

Wkład

Dwie liczby całkowite - nreprezentujące rozmiar kwadratowej matrycy cyfr pi i yreprezentujące prawy górny trójkąt - w dowolnym dogodnym formacie .

Wydajność

  • Wynikowa pocięta i połączona liczba, wydrukowana / wyświetlona na ekranie, zwrócona jako ciąg znaków itp.
  • Doczepiany / wiodącym spacje nie jest obowiązkowe, tak długo jak nie ma spacji w wyjściu (to znaczy, 159 35 3czy tym podobne byłyby nieważne).
  • Zauważ, że ponieważ wyraźnie szukamy cyfr pi, a nie przybliżenia lub obliczeń matematycznych, odpowiedzi nie powinny zaokrąglać ostatniej cyfry macierzy.

Zasady

  • To jest więc obowiązują wszystkie zwykłe zasady gry w golfa, a wygrywa najkrótszy kod (w bajtach).
  • Dopuszczalny jest pełny program lub funkcja.
  • Standardowe luki są zabronione.

Przykłady

 n  y  output
-------------
 3  3  141923
 5  3  159353
 6  4  1592589383
 6  6  141592535893238643794
20 12  358979323846950288419715820974944628620899211706792306647223172745025559196615
AdmBorkBork
źródło
Dzięki. Czy można także zaokrąglić ostatnią cyfrę? Wydaje się, że niektóre odpowiedzi to robią i może być bardzo trudno tego uniknąć
Luis Mendo
1
@LuisMendo To dobra uwaga. Nie, nie powinno być zaokrąglania ostatniej cyfry, ponieważ szukamy rzeczywistych cyfr pi, a nie przybliżenia ani obliczeń. Wyjaśnię to i zweryfikuję z osobami udzielającymi odpowiedzi.
AdmBorkBork,

Odpowiedzi:

7

05AB1E , 19 bajtów

Wykorzystuje kodowanie CP-1252 .

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

Wypróbuj online!

Wyjaśnienie

n=5, y=3 używane na przykład

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
źródło
1
Gratulacje za 10k!
Erik the Outgolfer
5

Python 2 (z sympią), 100 bajtów

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)

Brak sympii, 260 246 244 233 231 218 bajtów

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

Wykorzystuje to „The Spigot Algorytm For Pi” Stanleya Rabinowitza i Stan Wagon.

Standardowymi argumentami byłoby a,b,c,d,e,f=0,1,1,1,3,3uzyskanie pierwszej cyfry pi, 3ponieważ nie jest to wymagane, algorytm jest inicjalizowany do punktu przed 1uzyskaniem, co oszczędza dwa bajty ai bjest dłuższy, ponieważ wynik nie wymaga krojenia i imoże zaczynać się od 0raczej niż -1.

Trafia w domyślny limit rekurencji dla ostatniego przypadku testowego.
Używa //pierwszego z działów, aby str(v)można je było zastąpić `v`(w przeciwnym razie trwałoby Lto długo).
repl.it


Nierekurencyjna wersja dla 232 bajtów, która ocenia również ostatni przypadek testowy:

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 (pierwsze wcięcie to jedna spacja, drugie wcięcie to jedna tabulacja)

Jonathan Allan
źródło
Ta wersja „bez sympii” robi wrażenie :)
Emigna,
1
Dodałem link, to nie mój algorytm!
Jonathan Allan
... ale jeśli chcesz „zapamiętać” Pi do miliona cyfr, jest to prawdopodobnie łatwiejsze
Jonathan Allan,
4

Mathematica, 82 bajty

Print@@Join@@Partition[RealDigits[Pi-3,10,#^2][[1]],#][[i,i-#2-1;;]]~Table~{i,#2}&
JungHwan Min
źródło
Możesz użyć #&@@zamiast [[1]].
Martin Ender
@TimmyD Nie. Obcina się. (n = 10, y = 10 daje 1415926535979323846433832798841971937510749448164899259; ostatnia 9to setna cyfra pi, a 101 cyfra to 8- bez zaokrąglania)
JungHwan Min 14.10.16
3

MATL, 23 22 27 bajtów

1 bajt zapisany dzięki @Luis

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

Wypróbuj online

Wyjaśnienie

        % 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
źródło
@LuisMendo Ah! Wiedziałem, że mamy do tego funkcję, ale nie mogłem jej znaleźć. Dzięki!
Suever,
@ TimmyD Dzięki za zauważenie. Zaktualizowano
Suever,
2

Perl, 67 bajtów

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

Wymaga opcji wiersza poleceń -nMbignum=bpi, liczonej jako 12. Dane wejściowe są pobierane ze standardowego wejścia.

Przykładowe użycie

$ 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
źródło
0

C #, 232 bajty 268 bajtów

Edytować:

Pierwotnie użyłem stałego ciągu dla Pi poza metodą, ale wygląda na to, że to oszustwo. Musiałem użyć wartości C # Math.PI, która ma tylko 14 miejsc po przecinku, więc najwyższą mwartością, której mogę użyć, jest 3. Powrót do tablicy kreślarskiej ...

Gra w golfa:

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

Nie golfowany:

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

Nie jest to najkrótsza odpowiedź, ale byłam szczęśliwa, że ​​rozwiązałam tę ...

Wyjście testowe:

m   t   output
3   3   141923

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

Pete Arden
źródło
1
Niezła odpowiedź! Niestety, jeśli używasz pi nie jest to wbudowane w język (czego jestem pewien, że tak nie jest), musisz uwzględnić to w wyniku bajtu.
AdmBorkBork
@TimmyD O nie! Ok, zostaw to ze mną !! Jeśli po prostu wkleję moje liczby pi, będzie to wymagało ponad 400 bajtów więcej, więc myślę, że wymagane jest inne podejście ... :)
Pete Arden