Triângulo Alternativo de Pascal

21

O triângulo de Pascal é gerado começando 1e tendo cada linha formada a partir de adições sucessivas. Aqui, em vez disso, vamos formar um triângulo alternando multiplicação e adição.

Começamos a remar 1com apenas um solitário 1. Posteriormente, a adição é feita nas linhas ímpares e a multiplicação é feita nas linhas pares (indexadas 1). Ao executar a etapa de adição, assuma que os espaços fora do triângulo sejam preenchidos com 0s. Ao executar a etapa de multiplicação, suponha que o exterior esteja preenchido com 1s.

Aqui está o triângulo completo até 7 linhas. O *ou +à esquerda mostra qual etapa foi executada para gerar essa linha.

1                1
2 *            1   1
3 +          1   2   1
4 *        1   2   2   1
5 +      1   3   4   3   1
6 *    1   3  12  12   3   1
7 +  1   4  15  24  15   4   1

Desafio

Dada a entrada n, imprima a nlinha th deste triângulo.

Regras

  • Em vez disso, você pode optar por indexar 0, mas saiba que as linhas de adição e multiplicação devem ser invertidas, para que o mesmo triângulo seja gerado exatamente como acima. Por favor, indique no seu envio se você optar por fazer isso.
  • Pode-se presumir que a entrada e a saída se encaixam no tipo inteiro nativo do seu idioma.
  • A entrada e saída podem ser fornecidas em qualquer formato conveniente .
  • Um programa completo ou uma função são aceitáveis. Se uma função, você pode retornar a saída em vez de imprimi-la.
  • Se possível, inclua um link para um ambiente de teste on-line para que outras pessoas possam experimentar seu código!
  • As brechas padrão são proibidas.
  • Isso é portanto todas as regras usuais de golfe se aplicam e o código mais curto (em bytes) vence.

Exemplos

Mostrando dois exemplos possíveis de saída de muitos: uma lista ou uma sequência separada por espaço.

4
[1, 2, 2, 1]

8
"1 4 60 360 360 60 4 1"
AdmBorkBork
fonte
2
@totallyhuman Não, a única coisa a se desdobrar deve ser a nquinta linha.
AdmBorkBork

Respostas:

16

Pascal , 249 247 233 bytes

Bem, este é o triângulo alternado de Pascal .

1 byte economizado graças a @ Mr.Xcoder

function f(n,k:integer):integer;begin if((k<1)or(k>n)or(n=1))then f:=n mod 2 else if n mod 2=0then f:=f(n-1,k-1)*f(n-1,k)else f:=f(n-1,k-1)+f(n-1,k)end;
procedure g(n:integer);var k:integer;begin for k:=1to n do write(f(n,k),' ')end;

Experimente online!

Uriel
fonte
248 bytes
Sr. Xcoder
7

Python 2 , 97 93 86 81 78 bytes

-4 bytes graças a Rod. -10 bytes graças a Halvard Hummel.

f=lambda n:n and[[i+j,i*j][n%2]for i,j in zip([n%2]+f(n-1),f(n-1)+[n%2])]or[1]

Indexado a 0.

Experimente online!

totalmente humano
fonte
1
Bom trabalho, tive uma abordagem (muito) mais longa . Embora ainda não tivesse tempo para jogar golfe.
Mr. Xcoder
1
Eu acho que map([int.__add__ ,int.__mul__][i%2],[i%2]+a,a+[i%2])deve funcionar (não testado)
Rod
1
Este deve ser correta
Halvard Hummel
1
Não, isso é recursivo. Você deve incluir o nome.
Sr. Xcoder
5

Geléia , 17 12 bytes

µ×+LḂ$?Ḋ1;µ¡

Este é um programa completo (ou link niládico) que recebe a entrada do STDIN.

Experimente online!

Como funciona

µ×+LḂ$?Ḋ1;µ¡  Main link. No arguments. Implicit argument: 0

          µ¡  Start a monadic chain and apply the ntimes quick to the previous one.
              This reads an integer n from STDIN and executes the previous chain n
              times, with initial argument 0, returning the last result.
µ             Start a monadic chain. Argument: A (array or 0)
       Ḋ          Dequeue; yield A without its first element.
   LḂ$?           If the length of A is odd:
 ×                    Multiply A and dequeued A.
                  Else:
  +                   Add A and dequeued A.
        1;        Prepend a 1 to the result.
Dennis
fonte
3

CJam , 25 bytes

{1a\{2%!_2$+\{.*}{.+}?}/}

Indexado a 0.

Experimente online!

Explicação

Este é um bloco anônimo que pega o número da pilha e deixa o resultado na pilha.

1a                        Push [1].
  \                       Bring the number to the top.
   {                 }/   For reach number 0 .. arg-1, do:
    2%!                    Push 0 if even, 1 if odd.
       _                   Copy that.
        2$+                Copy the list so far and prepend the 0 or 1 to it.
           \               Bring the 0 or 1 back to the top.
            {.*}{.+}?      If 1, element-wise multiplication. If 0, element-wise addition.
Gato de negócios
fonte
A espera 2%!deve pressionar 1 se for par e 0 se for estranho, não?
Esolanging Fruit
3

Mathematica, 92 bytes

(s={i=1};While[i<#,s=Flatten@{1,{Tr/@#,Times@@@#}[[i~Mod~2+1]]&@Partition[s,2,1],1};i++];s)&

Experimente online! (para trabalhar em matemática, "Tr" é substituído por "Total")

J42161217
fonte
3

Haskell , 76 72 bytes

Solução 0-indexada:

(p!!)
p=[1]:[zipWith o(e:l)l++[1]|(l,(o,e))<-zip p$cycle[((*),1),((+),0)]]

Experimente online!

Explicação

p recursivamente define o triângulo alternado, a caixa base / primeiro elemento dele é [1]

p=[1]:[                                                            ]

Em seguida, constrói o triângulo pegando a linha anterior ( l). Para saber o que fazer com isso, precisamos acompanhar o operador correto ( o) e o elemento neutro correspondente ( e):

                           |(l,(o,e))<-zip p$cycle[((*),1),((+),0)]

A partir disso, construa a nova linha duplicando a linha e, para uma cópia, anexamos o elemento neutro, compactamos com o operador e anexamos 1:

       zipWith o(e:l)l++[1]
ბიმო
fonte
3

R , 108 98 bytes

-10 bytes, substituindo o sinal de multiplicação real por um sinal de adição. Por favor me perdoe.

f=function(n){if(n<3)return(rep(1,n))else{v=f(n-1)};if(n%%2)`*`=`+`;return(c(1,v[3:n-2]*v[-1],1))}

Experimente online!

Bastante satisfeito com o método geral (pela primeira vez, aliasmente um primitivo), mas tenho certeza de que ainda há golfe a ser feito, especialmente com o manuseio desajeitado dos casos em que n <3, o que leva a muitos clichês.

CriminallyVulgar
fonte
85 bytes . Eu realmente amo sua solução `*`=`+`! bastante inteligente. O resto dos meus melhorias são apenas técnicas de golfe padrão, que eu ficaria feliz em explicar a seu pedido :)
Giuseppe
80 bytes . Tomei a inspiração de sua nota sobre os casos de manipulação, onden<3
Giuseppe
2

Casca , 17 16 bytes

!G₅;1¢e*+
:1Sż⁰t

Experimente online!

Uma solução indexada em 1.

Explicação

A primeira linha é a função principal, que chama a função auxiliar na segunda linha. A função auxiliar geralmente é chamada com , mas, neste caso, estou usando o recurso de etiquetas transbordantes do Husk: se você se referir a uma linha N em um programa com M <N linhas, você obtém a linha N mod M com a função modificadora M / N aplicado a ele. A segunda função modificadora é flip, então estou usando para inverter os argumentos da função auxiliar sem nenhum custo adicional de bytes.

Aqui está a função auxiliar.

:1Sż⁰t  Takes a function f and a list x.
   ż    Zip preserving elements of longer list
    ⁰   using function f
  S  t  x and its tail,
:1      then prepend 1.

Aqui está a função principal.

!G₅;1¢e*+  Takes a number n.
      e*+  2-element list of the functions * and +
     ¢     repeated infinitely.
 G         Left scan this list
  ₅        using the flipped helper function
   ;1      with initial value [1].
!          Get n'th element.
Zgarb
fonte
2

C # (.NET Core) , 143 134 128 bytes

-4 bytes graças a Phaeze
-5 bytes graças a Zac Faragher
-6 bytes graças a Kevin Cruijssen

n=>{int[]b={1},c;for(int i=0,j;++i<n;b=c)for(c=new int[i+1],c[0]=c[i]=1,j=0;++j<i;)c[j]=i%2<1?b[j-1]+b[j]:b[j-1]*b[j];return b;}

Experimente online!

Explicação:

n =>
{
    int[] b = { 1 }, c;               // Create first layer
    for(int i = 0, j; ++i < n; b = c) // Iterate for every layer, replace last layer with a new one
        for(c = new int[i+1],         // Create new layer
            c[0] = c[i] = 1,          // First and last elements are always 1
            j = 0;
            ++j < i; )                // Replace every element (besides 1st and last)...
                c[j] = i % 2 == 0 ?
                    b[j - 1] + b[j] : // ... with addition...
                    b[j - 1] * b[j];  // ... or multiplication of two from previous layers
    return b;                         // Return latest layer
};
Grzegorz Puławski
fonte
Você poderá alterar a inicialização do seu array b var b=new[]{1};e o compilador determinará o tipo de array para você.
JustinM - Reinstate Monica
1
Outra maneira de construir a primeira camada é int[]b={1};- 11 bytes vs 20 como é ou 16 como na sugestão de @Phaeze
Zac Faragher
1
@ZacFaragher e Phaeze obrigado!
Grzegorz Puławski
1
Eu sei que tem sido um bom tempo, mas você pode golfe 6 mais bytes: n=>{int[]b={1},c;for(int i=0,j;++i<n;b=c)for(c=new int[i+1],c[0]=c[i]=1,j=0;++j<i;)c[j]=i%2<1?b[j-1]+b[j]:b[j-1]*b[j];return b;}. Eu combinei cassim int[]b={1},c;; encurtado i%2==0para i%2<1; E removeu os suportes do loop colocando tudo dentro.
Kevin Cruijssen
Ótimo! Obrigado @KevinCruijssen
Grzegorz Puławski
1

Python 2 , 83 bytes

Dê um pouco de amor ao exec
índice 0

l=[1];exec"l[1:]=[[a+b,a*b][len(l)%2]for a,b in zip(l,l[1:])]+[1];"*input()
print l

Experimente online!

Gambá morto
fonte
1

Pitão , 22 bytes

Economizou toneladas de byte graças a @FryAmTheEggman ! A solução inicial está abaixo.

u++1@,+VGtG*VGtGlG1Q[1

Conjunto completo de testes (indexado 0).

Pyth , 40 38 36 35 bytes

Isso parece muito razoável. Sugestões são bem vindas.

K]1VStQ=K++]1m@,sd*hded%N2C,KtK]1;K

Test Suite ou Experimente online!

Mr. Xcoder
fonte
Usar reduzir parece ser muito menor . Também não estou convencido de que isso seja ideal, acho que o sub 20 é administrável?
FryAmTheEggman
@FryAmTheEggman Veja meu histórico de revisões. Eu disse que estava tentando encontrar uma solução alternativa com reduzir u(mas não consegui descobrir). Obrigado!
Mr. Xcoder
Se Pyth teria um prepend-append built-in ...
Mr. Xcoder
1

Perl 5 , 111 + 2 (-na) = 113 bytes

sub t{($r,$c)=@_;!--$r||!$c||$c>=$r?1:eval"t($r,$c)".($r%2?"*":"+")."t($r,$c-1)"}say map{t($F[0],$_).$"}0..$_-1

Experimente online!

Xcali
fonte
1

Mathematica, 70 bytes

Fold[#2@@@Partition[#,2,1,{-1,1},{}]&,{1},PadRight[{},#,{1##&,Plus}]]&

Experimente no sandbox Wolfram ! Infelizmente não funciona em matemática. É 0 indexado.

Explicação: Partition[#,2,1,{-1,1},{}]pega uma lista e retorna todas as sublistas de dois elementos, além de listas de 1 elemento para o início e o fim - por exemplo, {1,2,3,4}se torna {{1}, {1,2}, {2,3}, {3,4}, {4}}. PadRight[{},#,{1##&,Plus}]faz uma lista alternada de 1##&(efetivamente Times) e Plus, cujo comprimento é o número de entrada. Em seguida, Foldaplica repetidamente a função de partição com os Pluses e Timeses aplicados a ela, para criar as linhas do triângulo.

Não é uma árvore
fonte
0

Ruby , 83 82 bytes

->n{a=[1];p=0;n.times{a=[p=1-p,*a,p].each_cons(2).map{|x|x.reduce([:+,:*][p])}};a}

Experimente online!

Este é o índice 0.

Nnnes
fonte
0

Raquete , 116 bytes

(define(t n[i 1][r'(1)])(if(= n 1)r(t(- n 1)(- 1 i)(cons 1(append(map(if(> i 0)* +)(cdr r)(reverse(cdr r)))'(1))))))

Experimente online!

Gato de negócios
fonte
0

TI-Basic (TI-84 Plus CE), 100 bytes

Prompt X
{1→M
For(A,2,X
LM→L
A→dim(M
For(B,2,A–1
If A/2=int(A/2
Then
LL(B–1)LL(B→LM(B
Else
LL(B–1)+LL(B→LM(B
End
End
1→LM(dim(LM
End
LM

Indexado em 1, solicita a entrada do usuário e imprime uma lista contendo o n linha th do Triângulo Alternativo de Pascal.

Durante o loop: L M é a linha atual e L L é a linha anterior.

TI-Basic é uma linguagem tokenizada . Todos os tokens usados ​​aqui são de um byte.

Eu acho que posso jogar isso ainda mais, modificando M no local a partir do final.

Explicação:

Prompt X            # 3 bytes; get user input, store in X
{1→M                # 5 bytes, store the first row into LM
For(A,2,X           # 7 bytes, Loop X-1 times, with A as the counter, starting at 2
LM→L                # 5 bytes, copy list M into list L
A→dim(M             # 5 bytes, extend M by one
For(B,2,A–1         # 9 bytes, for each index B that isn't the first or last...
If A/2=int(A/2      # 10 bytes,    if A is even...
Then                # 2 bytes,     then...
LL(B–1)LL(B→LM(B     # 17 bytes,        the Bth item in this row is the Bth times the (B-1)th of the previous row
Else                # 2 bytes,     else...
LL(B–1)+LL(B→LM(B    # 18 bytes,        the Bth item in this row is the Bth plus the (B-1)th of the previous row
End                 # 2 bytes,     endif
End                 # 2 bytes,  endfor
1→LM(dim(LM         # 9 bytes, the last item is always 1
End                 # 2 bytes, endfor
LM                  # 2 bytes, Implicitly print the final row

pizzapants184
fonte
0

JavaScript (ES6), 71 69 66 bytes

f=n=>n?(p=f(n-1),[...p.map((v,i)=>i--?n%2?v*p[i]:v+p[i]:1),1]):[1]

Experimente online!

Indexado a 0.
-3 bytes por @Arnauld

f=n=>n?(p=f(n-1),[...p.map((v,i)=>i--?n%2?v*p[i]:v+p[i]:1),1]):[1]

for (var i = 0; i < 10; ++i) {
  console.log(JSON.stringify(f(i)));
}

Birjolaxew
fonte
1
O uso de um ternário deve salvar 3 bytes:i--?n%2?v*p[i]:v+p[i]
Arnauld