Трикутний шматочок квадрата Пі


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представляють розмір квадратної матриці цифр 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
Поздравляємо за 10 к!
Erik the 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

Тут використовується "Алгоритм Спігота для Пі" Стенлі Рабіновіца та Стен Вагона.

Стандартні аргументи полягають у тому, 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
Я додав посилання, це не мій алгоритм!
Джонатан Аллан

... але якщо ви хочете "запам'ятати" Пі до мільйона цифр, це, мабуть, простіше
Джонатан Аллан

4

Математика, 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-та цифра pi, а 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 Ах! Я знав, що ми маємо для цього функцію, але не міг її знайти. Спасибі!
Сувевер

@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 О, ні! Гаразд, залиште це зі мною !! Якщо я просто вставте свої цифри пі, що потребуватиме 400+ більше байт, тому я думаю, що потрібен інший підхід ... :)
Піт Арден
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.