Треугольный ломтик квадрата пи

21

Вдохновленный испечь кусочек пи

Вызов

С учетом входных данных 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
AdmBorkBork
источник
Спасибо. Кроме того, можно ли округлить последнюю цифру? Некоторые ответы, кажется, делают это, и может быть действительно трудно избежать этого
Луис Мендо
1
@ LuisMendo Это хороший момент. Нет, не должно быть округления последней цифры, так как мы ищем действительные цифры числа Пи, а не приближение или расчет. Я уточню это и уточню с ответчиками.
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
Emigna
источник
1
Поздравляю за 10к!
Эрик Outgolfer
5

Python 2 (с симпли), 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)

Без симптомов, 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 для Пи» Стенли Рабиновича и Стэна Вагона.

Стандартные аргументы должны были a,b,c,d,e,f=0,1,1,1,3,3бы дать первую цифру числа пи, 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 (первый отступ - один пробел, второй отступ - одна вкладка)

Джонатан Аллан
источник
Эта версия «без симпот» впечатляет :)
Emigna
1
Я добавил ссылку, это не мой алгоритм!
Джонатан Аллан
... но если вы хотите «запомнить» Пи до миллиона цифр, это, вероятно, проще
Джонатан Аллан
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- это 100-я цифра числа пи, а 101-я 8- без округления)
JungHwan Мин.
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
Suever
источник
@ LuisMendo Ах! Я знал, что у нас есть функция для этого, но не мог ее найти. Благодарность!
Suever
@TimmyD Спасибо, что заметили. Обновлено.
Suever
2

Perl, 67 байт

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

Требуется опция командной строки -nMbignum=bpi, считается 12. Вход берется из стандартного ввода.

Пример использования

$ 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. Вернуться к чертежной доске ...

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

Не самый короткий ответ, но я был просто счастлив, что решил этот ...

Тестовый вывод:

m   t   output
3   3   141923

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

Пит Арден
источник
1
Хороший ответ! К сожалению, если вы используете, pи это не является встроенным в язык (что я вполне уверен, что это не так), вам нужно будет включить это в свой счет байтов.
AdmBorkBork
@TimmyD О нет! Хорошо, оставь это мне! Если я просто вставлю свои числа Пи в это, мне потребуется более 400 байт, так что я думаю, что нужен другой подход ... :)
Пит Арден,