Slice สามเหลี่ยมของ Squared Pi


21

แรงบันดาลใจจากBake ชิ้นของ Pi

ท้าทาย

รับอินพุต3 <= n <= 100และ3 <= y <= nสร้างn x nเมทริกซ์ของส่วนทศนิยมของpi( 14159...) เริ่มต้นที่มุมซ้ายบน จากนั้นใช้สามเหลี่ยมขนาดขวาบนy x yและต่อกันเข้าด้วยกัน เอาท์พุทจำนวนผลลัพธ์

ตัวอย่างเช่นสำหรับการป้อนข้อมูลn = 5, y = 3, เมทริกซ์ต่อไปนี้ถูกสร้างขึ้น

14159
26535
89793
23846
26433

จากนั้น3 x 3สามเหลี่ยมมุมขวาบนจะเป็น

159
 35
  3

เพื่อให้159353เป็นเอาท์พุท

อินพุต

สองจำนวนเต็ม - nเป็นตัวแทนของขนาดของตารางเมทริกซ์ของตัวเลขของปี่และyเป็นตัวแทนของสามเหลี่ยมบนขวา - ในรูปแบบที่สะดวกใด

เอาท์พุต

  • จำนวนที่ตัดแล้วและตัดแบ่งผลลัพธ์ทั้งที่พิมพ์ / แสดงบนหน้าจอส่งคืนเป็นสตริงเป็นต้น
  • ช่องว่างต่อท้าย / นำหน้าเป็นตัวเลือกตราบใดที่ไม่มีช่องว่างในเอาต์พุต (เช่น159 35 3หรือสิ่งที่คล้ายกันไม่ถูกต้อง)
  • โปรดทราบว่าเนื่องจากเรากำลังค้นหาตัวเลขอย่างชัดเจนpiไม่ใช่การประมาณหรือการคำนวณทางคณิตศาสตร์คำตอบไม่ควรปัดเศษตัวเลขสุดท้ายของเมทริกซ์

กฎระเบียบ

  • นี่คือเพื่อให้ใช้กฎตามปกติสำหรับการเล่นกอล์ฟและรหัสที่สั้นที่สุด (เป็นไบต์) ชนะ
  • ยอมรับทั้งโปรแกรมหรือฟังก์ชั่นเต็มรูปแบบ
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม

ตัวอย่าง

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

ขอบคุณ นอกจากนี้ตัวเลขสุดท้ายสามารถปัดเศษได้หรือไม่ คำตอบบางอย่างดูเหมือนจะทำเช่นนั้นและอาจเป็นเรื่องยากที่จะหลีกเลี่ยงได้
หลุยส์เมนโด

1
@ LuisMendo นั่นเป็นจุดที่ดี ไม่ไม่ควรปัดเศษของหลักสุดท้ายเนื่องจากเรากำลังค้นหาตัวเลขจริงของ pi ไม่ใช่การประมาณหรือการคำนวณ ฉันจะอธิบายและตรวจสอบกับผู้ตอบ
AdmBorkBork

คำตอบ:


7

05AB1E , 19 ไบต์

ใช้การเข้ารหัสCP-1252

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

ลองออนไลน์!

คำอธิบาย

n=5, y=3 ใช้เป็นตัวอย่าง

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
ยินดีด้วยสำหรับ 10k!
Erik the Outgolfer

5

Python 2 (พร้อม sympy), 100 ไบต์

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)

ไม่มี sympy 260 246 244 233 231 218 ไบต์

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

สิ่งนี้ใช้"อัลกอริธึม Spigot สำหรับ Pi"ของ Stanley Rabinowitz และ Stan Wagon

อาร์กิวเมนต์มาตรฐานจะa,b,c,d,e,f=0,1,1,1,3,3ให้ผลเป็นตัวเลขแรกของ pi 3เนื่องจากไม่จำเป็นต้องใช้อัลกอริทึมจะเริ่มต้นที่จุดก่อนที่1จะให้ผลซึ่งจะช่วยประหยัดสองไบต์แม้ว่าจะนานกว่าaและbยาวกว่าเนื่องจากไม่ต้องการการแบ่งและiสามารถเริ่มต้นที่0-1มากกว่า

จำนวน จำกัด การเรียกซ้ำเริ่มต้นสำหรับกรณีทดสอบครั้งสุดท้าย
ใช้//สำหรับแผนกแรกเพื่อที่str(v)จะถูกแทนที่ด้วย`v`(มิฉะนั้นจะสิ้นสุดในLระยะเวลานาน)
repl.it


เวอร์ชันที่ไม่ใช่แบบเรียกซ้ำสำหรับ 232 ไบต์ซึ่งประเมินกรณีทดสอบล่าสุดเช่นกัน:

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 (เยื้องแรกคือหนึ่งช่องว่างเยื้องที่สองคือหนึ่งแท็บ)


เวอร์ชั่น "no sympy" นั้นน่าประทับใจ :)
Emigna

1
ฉันเพิ่มลิงค์มันไม่ใช่อัลกอริทึมของฉัน!
Jonathan Allan

... แต่ถ้าคุณต้องการ "จดจำ" Pi ถึงหนึ่งล้านหลักมันอาจจะง่ายกว่า
Jonathan Allan

4

Mathematica, 82 ไบต์

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

คุณสามารถใช้แทน#&@@ [[1]]
Martin Ender

@ TimmyD Nope มันตัดทอน (n = 10, y = 10 ให้1415926535979323846433832798841971937510749448164899259; สุดท้าย9คือหลักที่ 100 ของไพและหลักที่ 101 คือ8- ไม่มีการปัดเศษ)
JungHwan Min

3

MATL, 23 22 27 ไบต์

บันทึก 1 ไบต์ขอบคุณ @Luis

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

ลองออนไลน์

คำอธิบาย

        % 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! ฉันรู้ว่าเรามีฟังก์ชั่นสำหรับสิ่งนั้น แต่หาไม่เจอ ขอบคุณ!
Suever

@ TimmyD ขอบคุณที่สังเกต Updated
Suever

2

Perl, 67 ไบต์

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

ต้องใช้ตัวเลือกบรรทัดคำสั่ง-nMbignum=bpiซึ่งนับเป็น 12 อินพุตถูกนำมาจาก stdin

ตัวอย่างการใช้งาน

$ 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 ไบต์ 268 ไบต์

แก้ไข:

ตอนแรกฉันใช้สตริงคงที่สำหรับ Pi นอกวิธีการ แต่ดูเหมือนว่านี่เป็นการโกง ฉันต้องใช้ค่า C # Math.PI ซึ่งมีทศนิยม 14 ตำแหน่งเท่านั้นดังนั้นค่าสูงสุดmค่าฉันสามารถใช้ได้คือ 3 กลับไปที่กระดานวาดรูป ...

แข็งแรงเล่นกอล์ฟ:

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

ไม่ใช่คำตอบที่สั้นที่สุด แต่ฉันมีความสุขที่ฉันแก้ไขคำตอบนี้ ...

ทดสอบเอาท์พุท:

m   t   output
3   3   141923

5 3 159353
6 4 1592589383
6 6 141592535893238643794 20 12 3589793238469502884197158209749446286205999961170679 5 5 5 5 5 6 9 5 5 5 6 159 353 6 4 1592589383 6 6 141592535893238643794
20 12 35897932384695028841971582097494


1
คำตอบที่ดี! น่าเศร้าถ้าคุณกำลังใช้pและไม่ใช่ภาษาในตัว (ซึ่งฉันค่อนข้างแน่ใจว่าไม่ใช่) คุณจะต้องรวมไว้ในคะแนนไบต์ของคุณ
AdmBorkBork

@ TimmyD โอ้ไม่! ตกลงทิ้งไว้กับฉัน !! ถ้าฉันเพียงวางหมายเลข pi ของฉันในนั้นจะต้องมี 400 ไบต์ขึ้นไปดังนั้นฉันคิดว่าต้องใช้วิธีการอื่น ... :)
พีอาร์เดน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.