Uma fatia triangular de Pi ao quadrado


21

Inspirado por Bake uma fatia de Pi

Desafio

Dada a entrada 3 <= n <= 100e 3 <= y <= n, construa uma n x nmatriz da parte decimal de pi( 14159...), começando no canto superior esquerdo. Em seguida, pegue o triângulo superior direito do tamanho y x ye concatene-o juntos. Envie o número resultante.

Por exemplo, para a entrada n = 5, y = 3a seguinte matriz é construída

14159
26535
89793
23846
26433

Então, o 3 x 3triângulo superior direito seria

159
 35
  3

assim 159353é a saída.

Entrada

Dois números inteiros - nrepresentando o tamanho da matriz quadrada dos dígitos de pi e yrepresentando o triângulo superior direito - em qualquer formato conveniente .

Saída

  • O número fatiado e concatenado resultante, impresso / exibido na tela, retornado como uma sequência, etc.
  • O espaço em branco à direita / à direita é opcional, desde que não haja espaço em branco na saída (ou seja, 159 35 3o equivalente seria inválido).
  • Observe que, como procuramos explicitamente os dígitos pi, e não uma aproximação ou cálculo matemático, as respostas não devem arredondar o dígito final da matriz.

Regras

  • Isso é portanto todas as regras usuais para golfe se aplicam e o código mais curto (em bytes) vence.
  • Um programa ou função completo são aceitáveis.
  • As brechas padrão são proibidas.

Exemplos

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

Obrigado. Além disso, o último dígito pode ser arredondado? Algumas respostas parecem fazer isso, e que poderia ser muito difícil evitá-lo
Luis Mendo

11
@LuisMendo Esse é um bom ponto. Não, não deve haver arredondamento do último dígito, pois estamos procurando os dígitos reais de pi, não uma aproximação ou cálculo. Vou esclarecer isso e verificar com os respondentes.
AdmBorkBork 14/10

Respostas:


7

05AB1E , 19 bytes

Usa a codificação CP-1252 .

nžs¦¦¹ôI£íRvyN>£J}R

Experimente online!

Explicação

n=5, y=3 usado por exemplo

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

11
Parabéns por 10k!
Erik the Outgolfer

5

Python 2 (com sympy), 100 bytes

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)

Sem sympy, 260 246 244 233 231 218 bytes

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

Isso emprega "O algoritmo de torneira para Pi" de Stanley Rabinowitz e Stan Wagon.

Os argumentos padrão seriam a,b,c,d,e,f=0,1,1,1,3,3produzir o primeiro dígito de pi, 3já que isso não é necessário, o algoritmo é inicializado no ponto anterior a 1ser produzido, o que economiza dois bytes ae bé mais longo, pois o resultado não requer fatiamento e ipode começar em 0ao invés de -1.

Atinge o limite de recursão padrão para o último caso de teste
Utiliza //a primeira das divisões para que str(v)possa ser substituída por `v`(caso contrário, terminaria Lpor um longo tempo).
repl.it


Uma versão não recursiva para 232 bytes que também avalia o último caso de teste:

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 (o primeiro travessão é um espaço, o segundo travessão é uma guia)


Essa versão "não SymPy" é impressionante :)
Emigna

11
Eu adicionei um link, não é o meu algoritmo!
Jonathan Allan

... mas se você quiser "memorizar" Pi de um milhão de dígitos, esta é provavelmente mais fácil
Jonathan Allan

4

Mathematica, 82 bytes

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

Você pode usar em #&@@vez de [[1]].
Martin Ender

@TimmyD Nope. Isso trunca. (n = 10, y = 10 dá 1415926535979323846433832798841971937510749448164899259; o último 9é o dígito de 100 pi, e o dígito 101th é 8- nenhum arredondamento)
JungHwan min

3

MATL, 23 22 27 bytes

1 byte salvo graças a @Luis

UtEYPwY$IbH+&:)GetGi-&R!g)!

Experimente Online

Explicação

        % 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 Ah! Eu sabia que tínhamos uma função para isso, mas não consegui encontrá-la. Obrigado!
Suever 13/10/16

@ TimmyD Obrigado por perceber. Atualizada.
Suever 14/10/16

2

Perl, 67 bytes

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

Requer a opção de linha de comando -nMbignum=bpi, contada como 12. A entrada é obtida do stdin.

Uso da amostra

$ 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 bytes 268 bytes

Editar:

Originalmente, usei uma string constante para Pi fora do método, mas parece que isso foi trapaça. Eu tive que usar o valor C # Math.PI, que só tem 14 casas decimais, portanto, o maiorm valor alto que posso usar é 3. Voltar para a área de desenho ...

Golfe:

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

Não é a resposta mais curta, mas fiquei feliz por ter resolvido esta ...

Saída de teste:

m   t   output
3   3   141923

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


11
Boa resposta! Infelizmente, se você estiver usando pe ele não estiver embutido no idioma (o que tenho certeza de que não é), será necessário incluir isso na pontuação de bytes.
AdmBorkBork 14/10

@TimmyD Oh não! Ok, deixe comigo !! Se eu simplesmente colar meus números pi em que vai exigir mais 400 + bytes, então eu acho que uma abordagem diferente é necessária ... :)
Pete Arden
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.