Sepotong Segitiga Pi Kuadrat

21

Terinspirasi oleh Bake sepotong Pi

Tantangan

Diberikan masukan 3 <= n <= 100dan 3 <= y <= n, buat n x nmatriks dari bagian desimal dari pi( 14159...), dimulai dari kiri atas. Kemudian, ambil segitiga kanan atas ukuran y x ydan menyatukannya. Keluarkan nomor yang dihasilkan.

Misalnya, untuk input n = 5,, y = 3matriks berikut dibuat

14159
26535
89793
23846
26433

Kemudian, 3 x 3segitiga kanan atas akan menjadi

159
 35
  3

begitu 159353juga output.

Memasukkan

Dua bilangan bulat - nmewakili ukuran matriks kuadrat dari digit pi, dan ymewakili segitiga kanan atas - dalam format apa pun yang nyaman .

Keluaran

  • Hasilnya berupa irisan dan gabungan angka, baik dicetak / ditampilkan ke layar, dikembalikan sebagai string, dll.
  • Trailing / leading whitespace adalah opsional, asalkan tidak ada spasi putih di output (yaitu, 159 35 3atau sejenisnya akan tidak valid).
  • Perhatikan bahwa karena kita secara eksplisit mencari angka pi, dan bukan perkiraan atau perhitungan matematis, jawaban tidak boleh membulatkan angka akhir dari matriks.

Aturan

  • Ini adalah sehingga semua aturan biasa untuk bermain golf berlaku, dan kode terpendek (dalam byte) menang.
  • Program atau fungsi lengkap dapat diterima.
  • Celah standar dilarang.

Contohnya

 n  y  output
-------------
 3  3  141923
 5  3  159353
 6  4  1592589383
 6  6  141592535893238643794
20 12  358979323846950288419715820974944628620899211706792306647223172745025559196615
AdmBorkBork
sumber
Terima kasih. Juga, dapatkah angka terakhir dibulatkan? Beberapa jawaban tampaknya melakukan itu, dan itu bisa sangat sulit untuk menghindarinya
Luis Mendo
1
@LuisMendo Itu poin bagus. Tidak, tidak boleh ada pembulatan digit terakhir, karena kami sedang mencari digit pi yang sebenarnya, bukan perkiraan atau perhitungan. Saya akan mengklarifikasi dan memverifikasi dengan penjawab.
AdmBorkBork

Jawaban:

7

05AB1E , 19 byte

Menggunakan pengodean CP-1252 .

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

Cobalah online!

Penjelasan

n=5, y=3 digunakan misalnya

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
sumber
1
Selamat untuk 10rb!
Erik the Outgolfer
5

Python 2 (dengan 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)

Tidak ada 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

Ini mempekerjakan "Algoritma Keran Untuk Pi" dari Stanley Rabinowitz dan Stan Wagon.

Argumen standar adalah a,b,c,d,e,f=0,1,1,1,3,3untuk menghasilkan digit pertama pi, 3karena tidak diperlukan algoritma diinisialisasi ke titik sebelum 1dihasilkan, yang menyimpan dua byte meskipun adan blebih lama karena hasilnya tidak memerlukan slicing dan idapat mulai dari 0bukannya -1.

Hit batas rekursi default untuk test case terakhir
Gunakan //untuk yang pertama dari divisi sehingga str(v)dapat diganti dengan `v`(kalau tidak akan berakhir Llama).
repl.it


Versi non-rekursif untuk 232 byte yang mengevaluasi kasus uji terakhir juga:

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 (indentasi pertama adalah satu spasi, indentasi kedua adalah satu tab)

Jonathan Allan
sumber
Versi "no sympy" itu mengesankan :)
Emigna
1
Saya menambahkan tautan, itu bukan algoritme saya!
Jonathan Allan
... tetapi jika Anda ingin "menghafal" Pi hingga sejuta digit, ini mungkin lebih mudah
Jonathan Allan
4

Mathematica, 82 byte

Print@@Join@@Partition[RealDigits[Pi-3,10,#^2][[1]],#][[i,i-#2-1;;]]~Table~{i,#2}&
JungHwan Min
sumber
Anda bisa menggunakan #&@@bukan [[1]].
Martin Ender
@TimmyD Tidak. Ini terpotong. (n = 10, y = 10 memberi 1415926535979323846433832798841971937510749448164899259; yang terakhir 9adalah digit ke-100 pi, dan digit ke-101 adalah 8- tanpa pembulatan)
JungHwan Min
3

MATL, 23 22 27 byte

1 Byte disimpan berkat @Luis

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

Cobalah secara Online

Penjelasan

        % 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
sumber
@LuisMendo Ah! Saya tahu kami memiliki fungsi untuk itu tetapi tidak dapat menemukannya. Terima kasih!
Suever
@TimmyD Terima kasih telah memperhatikan. Diperbarui.
Suever
2

Perl, 67 byte

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

Membutuhkan opsi baris perintah -nMbignum=bpi, dihitung sebagai 12. Input diambil dari stdin.

Contoh Penggunaan

$ 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
sumber
0

C #, 232 byte 268 byte

Edit:

Saya awalnya menggunakan string konstan untuk Pi di luar metode, tetapi sepertinya ini curang. Saya harus menggunakan nilai C # Math.PI, yang hanya memiliki 14 tempat desimal, sehingga nilai tertinggi yang mdapat saya gunakan adalah 3. Kembali ke papan gambar ...

Golf:

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

Tidak Disatukan:

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

Bukan jawaban terpendek, tapi saya senang saya menyelesaikan yang ini ...

Hasil tes:

m   t   output
3   3   141923

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

Pete Arden
sumber
1
Jawaban bagus! Sayangnya, jika Anda menggunakan pdan itu bukan built-in dalam bahasa (yang saya yakin tidak), Anda harus memasukkannya dalam skor byte Anda.
AdmBorkBork
@TimmyD Oh tidak! Ok, serahkan padaku !! Jika saya cukup menempelkan nomor pi saya di yang akan membutuhkan 400 lebih byte, jadi saya pikir pendekatan yang berbeda diperlukan ... :)
Pete Arden