제곱 Pi의 삼각 조각


21

파이 한 조각을 굽는에서 영감을

도전

입력 3 <= n <= 100과가 주어지면 왼쪽 상단에서 시작하여 ( ) 의 소수 부분으로 3 <= y <= n구성된 n x n행렬을 구성하십시오 . 그런 다음 오른쪽 위 삼각형의 크기를 취해 서로 연결하십시오. 결과 숫자를 출력합니다.pi14159...y x y

예를 들어, 입력 n = 5, y = 3다음 행렬이 구성된다

14159
26535
89793
23846
26433

그러면 오른쪽 위 3 x 3삼각형은

159
 35
  3

159353출력도 마찬가지 입니다.

입력

npi 자리수의 정사각 행렬 크기를 y나타내고 오른쪽 위 삼각형을 나타내는 두 개의 정수 는 편리한 형식으로 나타납니다 .

산출

  • 결과적으로 슬라이스 및 연결된 숫자는 화면에 인쇄 / 표시되어 문자열로 반환됩니다.
  • 후행 / 선행 공백이 너무 오래에는 공백이 없습니다로, 선택적 으로 출력 (즉, 159 35 3또는 유효하지 않은 것처럼).
  • pi근사 또는 수학 계산이 아닌 의 숫자를 명시 적으로 찾고 있으므로 답은 행렬의 마지막 숫자를 반올림해서는 안됩니다.

규칙

  • 이것은 이므로 대한 모든 일반적인 규칙이 적용되고 가장 짧은 코드 (바이트)가 이깁니다.
  • 전체 프로그램 또는 기능이 허용됩니다.
  • 표준 허점 은 금지되어 있습니다.

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

감사. 또한 마지막 숫자를 반올림 할 수 있습니까? 일부 답변은 그렇게하는 것으로 보이며,이를 피하는 것이 정말 어려울 수 있습니다.
Luis Mendo

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 축하합니다!
Outgolfer Erik

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

이것은 Stanley Rabinowitz와 Stan Wagon의 "Spigot Algorithm For Pi" 를 사용합니다.

표준 인수는 것 a,b,c,d,e,f=0,1,1,1,3,3, 파이의 첫 번째 숫자를 산출하기 위해 3그 알고리즘은 이전의 시점에 초기화되어 필요하지 않기 때문에, 1두 바이트에도 불구하고 저장 산출되고, a그리고 b더 이상 결과가 슬라이스를 필요로하지 않으며 같다 i에서 시작할 수 있습니다 0오히려 -1.

마지막으로 테스트 케이스에 대한 조회수 기본 재귀 제한
용도 //분열의 첫 번째에 해당이 있도록 str(v)로 대체 될 수있다 `v`(그렇지 않으면 끝나는 것이 L긴 경우).
반복


마지막 테스트 사례도 평가하는 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 (첫 번째 들여 쓰기는 한 , 두 번째 들여 쓰기는 한 )


그 "교향 없음"버전은 인상적입니다 :)
Emigna

1
링크를 추가했는데 알고리즘이 아닙니다!
Jonathan Allan

...하지만 Pi를 백만 자릿수로 "기억"하려면 더 쉬울 것입니다.
Jonathan Allan

4

수학, 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은 pi의 100 번째 자리, 101 번째는 8-반올림 없음)
JungHwan Min

3

MATL, 23 22 27 바이트

@Luis 덕분에 1 바이트 절약

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 아! 나는 우리가 그 기능을 가지고 있지만 그것을 찾을 수 없다는 것을 알았습니다. 감사!
Suever

@TimmyD 알려 주셔서 감사합니다. 업데이트되었습니다.
Suever

2

펄, 67 바이트

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

-nMbignum=bpi12로 계산 된 명령 행 옵션이 필요합니다 . 입력은 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에 상수 문자열을 사용했지만 이것이 속이는 것 같습니다. 소수점 이하 14 자리 만있는 C # Math.PI 값을 사용해야했기 때문에 사용할 수있는 가장 높은 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++;}}}

언 골프 드 :

  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 1592589383
6 6 141592535893238643794
20 12 358979323846950288419715820974944628620899211706792306647223172745025559196615


1
좋은 대답입니다! 슬프게도, 사용 p하고 있고 언어에 내장되어 있지 않은 경우 (확실하지는 않습니다) 바이트 점수에 포함시켜야합니다.
AdmBorkBork

@TimmyD 오 아니! 알았어요 내 파이 번호를 붙여 넣으면 400 + 더 많은 바이트가 필요하므로 다른 접근법이 필요하다고 생각합니다 ... :)
Pete Arden
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.