四角い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出力されます。

入力

2つの整数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

ありがとう。また、最後の桁を丸めることはできますか?いくつかの答えはそれをしているようで、それを避けるのは本当に難しいかもしれません
ルイスメンドー

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
おめでとうございます!
エリックアウトゴルファー

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のスピゴットアルゴリズム」を採用しています。

標準引数は次のようになりa,b,c,d,e,f=0,1,1,1,3,3、PIの最初の数字を生成する3ことは、アルゴリズムが前のポイントに初期化される必要がないため、12つのバイトであっても保存し得され、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(最初のインデントは1つのスペース、2番目のインデントは1つのタブ)


その「ノーシンピー」バージョンは印象的です:)
エミグナ

1
リンクを追加しましたが、それは私のアルゴリズムではありません!
ジョナサンアラン

...しかし、Piを100万桁に「記憶」したい場合、これはおそらく簡単です
ジョナサンアラン


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=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に定数文字列を使用していましたが、これは不正行為のようです。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バイト以上が必要になるため、別のアプローチが必要だと思います... :)
ピートアーデン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.