Pi的三角形切片


21

灵感来自烤一片Pi

挑战

给定输入3 <= n <= 1003 <= y <= n,从左上角开始构造()n x n小数部分的矩阵。然后,取右上角的三角形大小并将其连接在一起。输出结果编号。pi14159...y x y

例如,对于input n = 5y = 3构建以下矩阵

14159
26535
89793
23846
26433

然后,右上3 x 3三角形将是

159
 35
  3

159353输出也是如此。

输入项

任何方便的格式n表示的两个整数- 表示pi的数字的方矩阵的大小,并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,2016年

Answers:


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
恭喜,一万!
暴民埃里克

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的“ Pi的Spigot算法”

标准参数将a,b,c,d,e,f=0,1,1,1,3,3产生圆周率的第一位,3因为这不需要算法被初始化到前点1被产生,从而节省了两个字节,即使ab较长的结果不需要切片并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 '16

1
我添加了一个链接,这不是我的算法!
乔纳森·艾伦

...但是,如果您想将Pi“记忆”到一百万个数字,这可能会更容易
Jonathan Allan

4

Mathematica,82个字节

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

您可以使用#&@@代替[[1]]
马丁·恩德

@TimmyD不。它会截断。(n = 10,y = 10给出1415926535979323846433832798841971937510749448164899259;最后一个9是pi的第100位,而第101个位是8
不舍

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

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

取消高尔夫:

  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 358979323846950288419715820974944628620899211706792306647223172745025559196615


1
好答案!可悲的是,如果您使用p的不是它的内置语言(我敢肯定不是),则需要在字节分数中包含它。
AdmBorkBork

@TimmyD哦,不!好吧,把它留给我!如果我只是简单地粘贴我的pi编号,这将需要400多个字节,所以我认为需要使用其他方法... :)
Pete Arden
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.