Desenhe uma pirâmide descendente (adição)


11

Desafio

Dada uma sequência de números inteiros não negativos, crie uma função que produza uma pirâmide descendente em que os filhos sejam a soma dos dois números pai.

O resultado é gerado como uma string usando tab \t.

Nota: guias à direita em cada linha não são necessárias

1\t\t2\t\t3\n\t3\t\t5\t\n\t\t8\t\t results in 
1       2       3
    3       5   
        8       

Opcionalmente, o resultado pode ser gerado como uma matriz usando uma posição vazia como espaço.

[[1,,2,,3],
[,3,,5,],
[,,8,,]]

Exemplo:

Dada 4,5,7,3,4,2saída:

4       5       7       3       4       2
    9       12      10      7       6
        21      22      17      13
            43      39      30
                82      69
                    151

Regras

  • Aplicam-se regras de padrão
  • A entrada pode ser uma string usando qualquer separador ou matriz
  • Novas linhas e guias à esquerda / à direita são permitidas (mas não necessárias, desde que a saída seja uma pirâmide invertida)

Casos de teste

Input: 1,3,5

1       3       5
    4       8
        12


Input: 9,8,7,6,5

9       8       7       6       5
    17      15      13      11
        32      28      24
            60      52
                112


Input: 5,5,2,5

[[5,,5,,2,,5],
[,10,,7,,7,],
[,,17,,14,,],
[,,,31,,,]]

Input: 3,3,3

[[3,,3,,3],
[,6,,6,],
[,,12,,]]

Critérios de vitória é


Nota: Esse desafio está muito próximo do triângulo Generate Pascal . A diferença é a sequência inicial personalizada (pascal passa de 1 e no modo ascendente, isso a partir de uma entrada e no modo descendente).

Postagem em sandbox



non-negative integersnós temos que lidar 0? Existem algumas possibilidades de golfe se os espaços vazios forem preenchidos com 0s.
JungHwan min

Podemos retornar uma matriz com tabulações ou cadeias / matrizes vazias nas posições vazias?
Adám

2
"Novas linhas e guias à esquerda / à direita são permitidas" - Também podemos incluir resultados vazios na parte inferior da saída da matriz?
11136 Jonathan Allan

1
@JonathanAllan novas linhas e guias à direita são permitidas
Adám

Respostas:


4

APL (Dyalog Unicode) , 31 28 bytes SBCS

Função de prefixo tácito. Usa um único espaço como marcador de slot vazio. Retorna a lista de listas de números / espaços.

⍳∘≢{∊(⍺⍴''),,∘' '¨2+/⍣⍺⊢⍵}¨⊂

Experimente online!

⍳∘≢{... }¨⊂ aplicar o abaixo função para cada uma
das Ɩ ndices  da contagem com todo o argumento:

⊢⍵ produzir o argumento correto (a entrada original)

2+/⍣⍺ aplicar a soma aos pares quantas vezes for indicado pelo argumento esquerdo

,∘' '¨ acrescentar um espaço a cada número

(), Anexa isso ao seguinte:

  ⍺⍴'' elementos de argumento esquerdo da sequência vazia (preenchida com espaços)

ε nlist (achatar)




3

Geléia ,  14  13 bytes

14 -> 13 assume que a entrada somente de espaços à direita é permitida na saída do formato de lista; caso contrário, voltarei aos 14 ( solicitado )

+ƝƬK€z⁶Zṙ"JC$

Um link monádico. Saída é uma lista de listas usando caracteres de espaço como os espaços (inclui uma única entrada somente de espaço à direita).

Experimente online! (inclui um rodapé para mostrar a estrutura da lista, pois a execução do link monádico como um programa completo imprimirá a saída esmagada implicitamente.)


3

Casca , 22 bytes

zoΣ~+R"	"oJ"		"msNU¡Ẋ+

Experimente online!

Explicação

z(Σ~+R" "(J"  "ms))NU¡Ẋ+  -- example input: [1,2,3]
                     ¡    -- infinitely do and collect in list
                      Ẋ+  -- | sum adjacent
                          -- : [[1,2,3],[3,5],[8],[],[],...
                    U     -- keep up until first repetition: [[1,2,3],[3,5],[8],[]]
z(                )N      -- zip with natural numbers under (example on 1 [1,2,3])
   ~+    (       )        -- | join arguments modified by
     R" "                 -- | | replicate tab: " "
               ms         -- | | show each: ["1","2","3"]
          J"  "           -- | | join with 2 tabs: ["1","  ","2","  ","3"]
                          -- | : [" ","1","  ","2","  ","3"]
  Σ                       -- | concatenate: " 1  2  3"
                          -- : [" 1  2  3","  3  5","   8"]

2

JavaScript (ES6), 73 bytes

Código fonte estranho ... Enfim, isso é !

Inclui espaços em branco à esquerda e à direita.

f=(a,p=`
`)=>p+a.join`		`+(1/(y=a.shift())?f(a.map(x=>y+(y=x)),p+`	`):'')

Experimente online!



2

Python 3 , 101 93 80 bytes

Salvei 7 bytes (em map(str,x)vez de for ine inicie como '') e se livrou das novas linhas à direita (em x and[vez de print(), graças a Jo King .

Economizou 13 bytes (em [*map(sum,zip(x,x[1:]))]vez de [x[j]+x[j+1]for j in range(len(x)-1)]) graças a ovs .

f=lambda x,y='':x and[y+'		'.join(map(str,x))]+f([*map(sum,zip(x,x[1:]))],y+'	')

Experimente online!


@ovs: Ah, legal. Eu deveria ter percebido que poderia mapear a soma. Obrigado!
Emigna

1

Retina , 35 bytes

+¶<`\d+ *(?=(\d+)?)
    $#1*$.(*_$1*)   

Experimente online! Explicação:

+

Repita até que o buffer pare de mudar,

¶<`

Imprima o conteúdo do buffer antes da substituição, com uma nova linha à direita e

\d+ *(?=(\d+)?)
    $#1*$.(*_$1*)   

Substitua um único número por um par de guias, mas um número seguido por outro número com uma guia, a soma e outra guia.



1

Vermelho , 151 bytes

func[b][m: length? b repeat n m[loop n - 1[prin"^-"]print replace/all
form b" ""^-^-"c: copy[]repeat i -1 + length? b[append c b/(i) + b/(i + 1)]b: c]]

Experimente online!

Mais legível:

f: func [ b ] [
    m: length? b
    repeat n m [
        loop n - 1 [ prin tab ]
        print replace/all form b " " rejoin [ tab tab ]
        c: copy []
        repeat i (length? b) - 1 [
            append c b/(i) + b/(i + 1)
        ]
        b: c
    ]
]


1

C # (compilador Visual C #) , 163 bytes

b=>{var s="";var c=b.Length;for(int i=0;i<c;i++){for(int z=0;z<i;z++)s+="\t";for(int x=0;x<c-i;x++){s+=b[x]+"\t\t";b[x]=x==c-i-1?0:b[x]+b[x+1];}s+="\n";}return s;}

Experimente online!

Legível:

b =>    {
            var s = "";
            var c = b.Length;
            for (int i = 0; i < c; i++)
            {
                for (int z = 0; z < i; z++)
                    s += "\t";
                for (int x = 0; x < c - i; x++)
                {
                    s += b[x] + "\t\t";
                    b[x] = x == c - i - 1 ? 0 : b[x] + b[x + 1];
                }
                s += "\n";
            }
            return s;
        }

1

Japt -Rx , 20 18 bytes

A segunda linha inclui uma guia à direita.

Nc¡=ä+
Ëq' ² iEç'  

Tente


Explicação

                  :Implicit input of array U
N                 :The array of inputs (NOT the input array)
 c                :Concatenate
  ¡               :  Map U
    ä+            :    Consecutive sums of U
   =              :    Reassign to U for next iteration
\n                :Reassign the resulting 2D-array to U
Ë                 :Map each array at index E
 q                :  Join with
  '\t             :   Tab
     ²            :   Repeated twice
       i          :  Prepend
          '\t     :   Tab
         ç        :   Repeated
        E         :   E times
                  :Implicitly join with newlines, trim (not strictly necessary) and output.
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.