Squared Pi Üçgen Dilim


21

Esinlenerek Bake Pi bir dilim

Meydan okuma

Verilen girdi 3 <= n <= 100ve 3 <= y <= nbir yapı n x nondalık kısmı matrisi pi( 14159...sol üst başlayarak). Ardından, sağ üst boyut üçgenini alın y x yve bir araya getirin. Ortaya çıkan numarayı verin.

Örneğin, giriş için n = 5, y = 3aşağıdaki matris oluşturulur

14159
26535
89793
23846
26433

Sonra, sağ üst 3 x 3üçgen olacak

159
 35
  3

böylece 159353üretilir.

Giriş

İki tamsayı - npi basamağının kare matrisinin boyutunu ve ysağ üst üçgeni temsil eden - herhangi bir uygun formatta .

Çıktı

  • Ortaya çıkan dilimlenmiş ve birleştirilmiş sayı, ekrana yazdırılan / görüntülenen, bir dize olarak vb. Döndürülür.
  • Firar / önündeki boşluğun çok uzun hiçbir boşluk yoktur gibi isteğe bağlıdır içinde çıkışa (yani 159 35 3veya geçersiz olacak gibi).
  • Açıkça piyaklaşık bir sayı veya matematiksel hesaplama yapamadığımız rakamları aradığımızdan , cevapların matrisin son rakamını geçmemesi gerektiğini unutmayın.

kurallar

  • Bu bu nedenle golf oynamak için normal kurallar geçerlidir ve en kısa kod (bayt cinsinden) kazanır.
  • Ya tam bir program ya da işlev kabul edilebilir.
  • Standart boşluklar yasaktır.

Örnekler

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

Teşekkürler. Ayrıca, son hane yuvarlanabilir mi? Bazı cevaplar bunu yapıyor gibi görünüyor ve bundan kaçınmak gerçekten zor olabilir
Luis Mendo

1
@LuisMendo Bu iyi bir nokta. Hayır, son rakamın yuvarlanması olmamalıdır, çünkü yaklaşık bir sayı veya hesaplama değil, fiili pi rakamlarını arıyoruz. Bunu açıklığa kavuşturacağım ve cevaplayıcılarla doğrulayacağım.
AdmBorkBork,

Yanıtlar:


7

05AB1E , 19 bayt

CP-1252 kodlamasını kullanır .

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

Çevrimiçi deneyin!

açıklama

n=5, y=3 örneğin kullanılır

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
10 bin için tebrikler!
Outgolfer Erik,

5

Python 2 (semptomlu), 100 bayt

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)

Belirti yok, 260 246 244 233 231 218 bayt

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

Bu , Stanley Rabinowitz ve Stan Wagon'un "Pi İçin Spigot Algoritması" nı kullanıyor .

Standart argümanlar olurdu a,b,c,d,e,f=0,1,1,1,3,3, pi ilk rakamını elde etmek 3o algoritma önce noktaya başlatıldığını gerekli değildir, çünkü 1iki bayt olsa kaydeder vermiştir edilir ave bdaha uzun sonuç dilimleme gerektirmez ve gibidir ibaşlayabilir 0yerine -1.

Geçen test durumu için Hit varsayılan yineleme sınırına
Kullanımı //bölümlerin birincisi için böylece str(v)tarafından değiştirilebilir `v`(aksi takdirde de sona ereceğini Luzun için).
repl.it


Son test durumunu da değerlendiren, 232 bayt için yinelemeli olmayan bir sürüm:

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 (ilk girinti bir boşluk, ikinci girinti bir sekmedir)


Bu "hiçbir semptom" versiyonu etkileyici :)
Emigna 13:16

1
Bir link ekledim, bu benim algoritmam değil!
Jonathan Allan,

... fakat Pi'yi bir milyon haneye "ezberlemek" istiyorsanız, bu muhtemelen daha kolay
Jonathan Allan

4

Mathematica, 82 bayt

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

Sen kullanabilirsiniz #&@@yerine [[1]].
Martin Ender,

@TimmyD Hayır. Kesiliyor. (n = 10, y = 10 verir 1415926535979323846433832798841971937510749448164899259; son 9pi'nin 100'üncü basamağı ve 8
101'inci

3

Matl, 23 22 27 bayt

@Luis sayesinde 1 Bayt kaydedildi

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

Çevrimiçi Deneyin

açıklama

        % 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! Bunun için bir fonksiyonumuz olduğunu biliyordum ama bulamadık. Teşekkürler!
Suever

@TimmyD Fark ettiğiniz için teşekkürler. Güncellenmiş.
Suever

2

Perl, 67 bayt

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

-nMbignum=bpi12 olarak sayılan komut satırı seçeneğini gerektirir . Girdi stdin'den alınır.

Örnek Kullanım

$ 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 bayt 268 bayt

Düzenle:

Ben aslında metodun dışında Pi için sabit bir dize kullandım, fakat bu hile yapıyor gibi görünüyor. Sadece 14 ondalık basamağı olan C # Math.PI değerini kullanmak zorunda kaldım, bu yüzden kullanabileceğim en yüksek mdeğer 3'tür.

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

En kısa cevap değil, ama bunu çözdüğüm için mutluydum ...

Test Çıkışı:

m   t   output
3   3   141923

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


1
Güzel cevap! Ne yazık ki, kullanıyorsanız pve bir dilde yerleşik değilse (ki öyle olmadığından eminim), bunu bayt puanınıza eklemeniz gerekir.
AdmBorkBork,

@TimmyD Oh hayır! Tamam, benimle bırak !! Eğer sadece pi sayılarımı 400'den fazla bayt gerektirecek şekilde yapıştırırsam, farklı bir yaklaşımın gerekli olduğunu düşünüyorum ... :)
Pete Arden
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.